Android 17 dan yang lebih baru mendukung daemon penjaga memori proses (PMGD), yang melindungi kesehatan sistem dan pengalaman pengguna dengan mengelola penggunaan memori secara proaktif berdasarkan per proses. Daemon ini meningkatkan stabilitas perangkat secara keseluruhan dengan menerapkan batas memori pada proses target tertentu, sehingga memastikan bahwa kebocoran atau lonjakan memori terisolasi tidak menyebabkan penurunan performa di seluruh sistem.
Meskipun killer memori rendah global konvensional hanya bertindak saat seluruh sistem mengalami tekanan, PMGD mengambil pendekatan yang lebih mendetail. Daemon ini mencapainya
dengan memantau nilai memori Grup Kontrol v2 untuk proses targetnya.
Saat proses yang ditargetkan melebihi batas memori yang dikonfigurasi, pmgd akan menangani pelanggaran batas dengan mencatat atom memori Statsd sebelum menghentikan proses.
Cara kerjanya
Daemon menggunakan inotify untuk memproses peristiwa tekanan memori (khususnya aktivitas memori tinggi menggunakan memory.events). Saat proses yang dipantau memicu peristiwa memori, pmgd akan melakukan tindakan berikut:
- Pemeriksaan memori anonim: Mengevaluasi memori anonim proses. Jika melebihi
anon_limit_in_mbyang dikonfigurasi,pmgdakan segera menghentikan proses. - Periode tunggu klaim: Jika memori anonim berada di bawah batas memori anonim yang ditentukan,
pmgdakan menunggu periode tenggang klaim sistem (reclaim_wait_time_secs). - Evaluasi memori setelah klaim: Jika
memory.currentproses target tetap lebih besar dari atau sama denganmemory.highsetelah periode tenggang, atau memori anonim melebihianon_limit_in_mb,pmgdakan segera menghentikan proses.
Hal ini dilakukan secara terus-menerus hingga proses dihentikan atau klaim pada proses menurunkan penggunaan memorinya di bawah batas memori yang ditentukan.
Fitur kesehatan sistem
- Pembatasan kecepatan booting ulang: Untuk mencegah loop booting atau error persisten,
pmgdmelacak penghentian proses di/data/misc/pmgd/history.json. Daemon membatasi proses ke satu penghentian yang dimulaipmgdper booting ulang perangkat.
Konfigurasi SELinux
Kemampuan PMGD untuk memantau proses dibatasi oleh kebijakan SELinux. Jika Anda mengonfigurasi PMGD untuk memantau proses yang domainnya tidak diizinkan oleh kebijakan, seperti proses sistem khusus vendor, PMGD tidak dapat memantaunya, dan Anda mungkin melihat penolakan SELinux di logcat.
Untuk mengizinkan PMGD memantau proses di domain tambahan, Anda harus memperluas izin PMGD dengan memperbarui kebijakan SELinux khusus perangkat untuk PMGD.
Berikut adalah contoh device/<vendor>/<device>/sepolicy/pmgd.te file
yang menambahkan akses ke domain baru:
# Allow pmgd to access vendor_system_apps
r_dir_file(pmgd, vendor_system_apps)
Untuk mengetahui informasi selengkapnya tentang cara menulis kebijakan khusus perangkat, lihat Menerapkan SELinux.
Konfigurasi yang ditentukan vendor
Konfigurasi PMGD didorong oleh vendor, yang dikonfigurasi oleh file JSON wajib /vendor/etc/pmgd/config.json. File ini mencantumkan proses yang akan dilacak,
profil batas memori yang dikonfigurasi (menggunakan
profil tugas cgroup),
dan batas memori anonim yang sulit dalam megabyte.
Kolom konfigurasi vendor
Konfigurasi JSON yang disediakan adalah daftar proses dan batasnya, yang ditentukan oleh kolom berikut:
| Kolom | Jenis | Wajib | Deskripsi | Default |
|---|---|---|---|---|
target_cmd |
String | Ya | Nama perintah proses target yang akan dipantau, misalnya, system_server. |
T/A |
uid |
Bilangan Bulat | Tidak | ID pengguna (UID) proses. Jika dihilangkan, pmgd akan menerapkan
aturan secara global ke proses apa pun yang cocok dengan target_cmd. |
T/A |
reclaim_wait_time_secs |
Bilangan Bulat | Tidak | Periode tenggang dalam detik untuk menunggu sistem mengklaim kembali memori sebelum mengevaluasi batas memori lagi. | 5 |
mem_limit_profile |
String | Ya | Nama profil tugas cgroup yang menetapkan `memory.high`. Hal ini digunakan untuk menetapkan batas memori proses. | T/A |
anon_limit_in_mb |
Bilangan Bulat | Ya | Batas memori anonim utama dalam megabyte. Jika penggunaan memori anonim
melebihi nilai ini, pmgd akan segera menghentikan proses. |
T/A |
additional_task_profiles |
Daftar string | Tidak | Daftar profil tugas tambahan yang pmgd diterapkan ke
proses saat pemantauan dimulai. |
Daftar kosong |
Berikut adalah contoh konfigurasi profil tugas cgroup di vendor/etc/task_profiles.json:
{
"Attributes": [
...
{
"Name": "MemHigh",
"Controller": "memory",
"File": "memory.high"
}
],
"Profiles": [
{
"Name": "SystemServerMemoryHighLimit",
"Actions": [
{
"Name": "SetAttribute",
"Params":
{
"Name": "MemHigh",
"Value": "1080M"
}
}
]
}
]
}
Berikut adalah contoh konfigurasi config PMGD di vendor/etc/pmgd/config.json:
{
"targets": [
{
"target_cmd": "system_server",
"uid": 1000,
"reclaim_wait_time_secs": 5,
"mem_limit_profile": "SystemServerMemoryHighLimit",
"anon_limit_in_mb": 300
}
]
}