Daemon penjaga memori proses

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:

  1. Pemeriksaan memori anonim: Mengevaluasi memori anonim proses. Jika melebihi anon_limit_in_mb yang dikonfigurasi, pmgd akan segera menghentikan proses.
  2. Periode tunggu klaim: Jika memori anonim berada di bawah batas memori anonim yang ditentukan, pmgd akan menunggu periode tenggang klaim sistem (reclaim_wait_time_secs).
  3. Evaluasi memori setelah klaim: Jika memory.current proses target tetap lebih besar dari atau sama dengan memory.high setelah periode tenggang, atau memori anonim melebihi anon_limit_in_mb, pmgd akan 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, pmgd melacak penghentian proses di /data/misc/pmgd/history.json. Daemon membatasi proses ke satu penghentian yang dimulai pmgd per 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
    }
  ]
}