Daemon Pembunuh Memori Rendah

Proses Android low memory killer daemon ( lmkd ) memantau status memori sistem Android yang sedang berjalan dan bereaksi terhadap tekanan memori yang tinggi dengan mematikan proses yang paling tidak penting untuk menjaga kinerja sistem pada tingkat yang dapat diterima.

Tentang tekanan memori

Sistem Android yang menjalankan beberapa proses secara paralel mungkin mengalami situasi ketika memori sistem habis dan proses yang memerlukan lebih banyak memori mengalami penundaan yang nyata. Tekanan memori , keadaan di mana sistem kekurangan memori, mengharuskan Android mengosongkan memori (untuk mengurangi tekanan) dengan membatasi atau mematikan proses yang tidak penting, meminta proses untuk mengosongkan sumber daya cache yang tidak penting, dan sebagainya.

Secara historis, Android memantau tekanan memori sistem menggunakan driver low memory killer (LMK) dalam kernel, sebuah mekanisme kaku yang bergantung pada nilai hard-code. Pada kernel 4.12, driver LMK dihapus dari kernel upstream dan lmkd ruang pengguna melakukan pemantauan memori dan tugas mematikan proses.

Informasi penghentian tekanan

Android 10 dan yang lebih baru mendukung mode lmkd baru yang menggunakan monitor informasi kios tekanan kernel (PSI) untuk mendeteksi tekanan memori. Patchset PSI di kernel upstream (di-backport ke kernel 4.9 dan 4.14) mengukur jumlah waktu penundaan tugas akibat kekurangan memori. Karena penundaan ini secara langsung memengaruhi pengalaman pengguna, penundaan ini mewakili metrik yang mudah digunakan untuk menentukan tingkat keparahan tekanan memori. Kernel upstream juga mencakup monitor PSI yang memungkinkan proses ruang pengguna yang memiliki hak istimewa (seperti lmkd ) untuk menentukan ambang batas untuk penundaan ini dan untuk berlangganan peristiwa dari kernel ketika ambang batas dilanggar.

Monitor PSI versus sinyal vmpressure

Karena sinyal vmpressure (dihasilkan oleh kernel untuk mendeteksi tekanan memori dan digunakan oleh lmkd ) sering kali menyertakan banyak positif palsu, lmkd harus melakukan pemfilteran untuk menentukan apakah memori berada di bawah tekanan nyata. Hal ini mengakibatkan bangun lmkd yang tidak perlu dan penggunaan sumber daya komputasi tambahan. Menggunakan monitor PSI menghasilkan deteksi tekanan memori yang lebih akurat dan meminimalkan overhead pemfilteran.

Menggunakan monitor PSI

Untuk menggunakan monitor PSI dan bukan peristiwa vmpressure , konfigurasikan properti ro.lmk.use_psi . Standarnya adalah true , menjadikan monitor PSI sebagai mekanisme default deteksi tekanan memori untuk lmkd . Karena monitor PSI memerlukan dukungan kernel, kernel harus menyertakan patch backport PSI dan dikompilasi dengan dukungan PSI diaktifkan ( CONFIG_PSI=y ).

Kekurangan driver LMK dalam kernel

Android tidak lagi menggunakan driver LMK karena sejumlah masalah, termasuk:

  • Perangkat dengan RAM rendah harus disetel secara agresif, dan bahkan perangkat tersebut akan berkinerja buruk pada beban kerja dengan pagecache aktif yang didukung file besar. Performa yang buruk mengakibatkan pukulan telak dan tidak ada pembunuhan.
  • Driver kernel LMK mengandalkan batas memori bebas, tanpa penskalaan berdasarkan tekanan memori.
  • Karena kekakuan desainnya, mitra sering kali menyesuaikan driver agar dapat berfungsi di perangkat mereka.
  • Driver LMK terhubung ke API menyusut lempengan, yang tidak dirancang untuk operasi berat seperti mencari target dan membunuh mereka, yang memperlambat proses vmscan .

Ruang pengguna lmkd

lmkd ruang pengguna mengimplementasikan fungsi yang sama seperti driver dalam kernel tetapi menggunakan mekanisme kernel yang ada untuk mendeteksi dan memperkirakan tekanan memori. Mekanisme tersebut termasuk menggunakan peristiwa vmpressure yang dihasilkan kernel atau monitor informasi penghentian tekanan (PSI) untuk mendapatkan pemberitahuan tentang tingkat tekanan memori, dan menggunakan fitur cgroup memori untuk membatasi sumber daya memori yang dialokasikan untuk setiap proses berdasarkan kepentingan proses.

Menggunakan ruang pengguna lmkd di Android 10

Di Android 9 dan yang lebih baru, lmkd userspace aktif jika driver LMK dalam kernel tidak terdeteksi. Karena userspace lmkd memerlukan dukungan kernel untuk cgroup memori, kernel harus dikompilasi dengan pengaturan konfigurasi berikut:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

Bunuh strategi

Userspace lmkd mendukung strategi penghentian berdasarkan peristiwa vmpressure atau monitor PSI, tingkat keparahannya, dan petunjuk lain seperti pemanfaatan swap. Strategi mematikan berbeda antara perangkat dengan memori rendah dan perangkat berperforma tinggi:

  • Pada perangkat dengan memori rendah, sistem harus mentolerir tekanan memori yang lebih tinggi sebagai mode operasi normal.
  • Pada perangkat berperforma tinggi, tekanan memori harus dipandang sebagai situasi abnormal dan diperbaiki sebelum memengaruhi kinerja secara keseluruhan.

Anda dapat mengonfigurasi strategi kill menggunakan properti ro.config.low_ram . Untuk detailnya, lihat Konfigurasi ram rendah .

Userspace lmkd juga mendukung mode lama yang membuat keputusan mematikan menggunakan strategi yang sama seperti driver LMK dalam kernel (yaitu, memori bebas dan ambang batas cache file). Untuk mengaktifkan mode lawas, setel properti ro.lmk.use_minfree_levels ke true .

Mengonfigurasi lmkd

Konfigurasikan lmkd untuk perangkat tertentu menggunakan properti berikut.

Properti Menggunakan Bawaan
ro.config.low_ram Tentukan apakah perangkat tersebut merupakan perangkat dengan RAM rendah atau perangkat berkinerja tinggi. false
ro.lmk.use_psi Gunakan monitor PSI (bukan acara vmpressure ). true
ro.lmk.use_minfree_levels Gunakan ambang batas memori bebas dan cache file untuk membuat keputusan penghentian proses (yaitu, mencocokkan fungsionalitas driver LMK dalam kernel). false
ro.lmk.low Skor oom_adj minimum untuk proses yang memenuhi syarat untuk dihentikan pada tingkat vmpressure rendah. 1001
(dengan disabilitas)
ro.lmk.medium Skor oom_adj minimum untuk proses yang memenuhi syarat untuk dihentikan pada tingkat vmpressure vm sedang. 800
(layanan yang di-cache atau tidak penting)
ro.lmk.critical Skor oom_adj minimum untuk proses yang memenuhi syarat untuk dihentikan pada tingkat vmpressure kritis. 0
(proses apa pun)
ro.lmk.critical_upgrade Aktifkan peningkatan ke tingkat kritis. false
ro.lmk.upgrade_pressure mem_pressure maksimum saat level ditingkatkan karena sistem terlalu banyak bertukar. 100
(dengan disabilitas)
ro.lmk.downgrade_pressure mem_pressure minimum di mana peristiwa vmpressure diabaikan karena masih tersedia cukup memori bebas. 100
(dengan disabilitas)
ro.lmk.kill_heaviest_task Hentikan tugas terberat yang memenuhi syarat (keputusan terbaik) versus tugas apa pun yang memenuhi syarat (keputusan cepat). true
ro.lmk.kill_timeout_ms Durasi dalam milidetik setelah pembunuhan ketika tidak ada pembunuhan tambahan yang dilakukan. 0
(dengan disabilitas)
ro.lmk.debug Aktifkan log debug lmkd . false

Contoh konfigurasi perangkat:

PRODUCT_PROPERTY_OVERRIDES += \
    ro.lmk.low=1001 \
    ro.lmk.medium=800 \
    ro.lmk.critical=0 \
    ro.lmk.critical_upgrade=false \
    ro.lmk.upgrade_pressure=100 \
    ro.lmk.downgrade_pressure=100 \
    ro.lmk.kill_heaviest_task=true

Ruang pengguna lmkd di Android 11

Android 11 meningkatkan lmkd dengan memperkenalkan strategi pembunuhan baru. Strategi penghentian ini menggunakan mekanisme PSI untuk mendeteksi tekanan memori yang diperkenalkan di Android 10. lmkd di Android 11 memperhitungkan tingkat penggunaan sumber daya memori dan thrashing untuk mencegah kekurangan memori dan penurunan performa. Strategi mematikan ini menggantikan strategi sebelumnya dan dapat digunakan pada perangkat berperforma tinggi dan RAM rendah (Android Go).

Persyaratan kernel

Untuk perangkat Android 11, lmkd memerlukan fitur kernel berikut:

  • Sertakan patch PSI dan aktifkan PSI (backport tersedia di kernel umum Android 4.9, 4.14, dan 4.19).
  • Sertakan patch dukungan PIDFD (backport tersedia di kernel umum Android 4.9, 4.14, dan 4.19).
  • Untuk perangkat dengan RAM rendah, sertakan grup memori.

Kernel harus dikompilasi dengan pengaturan konfigurasi berikut:

CONFIG_PSI=y

Mengonfigurasi lmkd di Android 11

Strategi mematikan memori di Android 11 mendukung tombol penyetelan dan default yang tercantum di bawah. Fitur-fitur ini berfungsi pada perangkat berkinerja tinggi dan RAM rendah.

Properti Menggunakan Bawaan
Kinerja tinggi RAM rendah
ro.lmk.psi_partial_stall_ms Ambang batas penghentian PSI parsial, dalam milidetik, untuk memicu notifikasi memori rendah. Jika perangkat terlambat menerima pemberitahuan tekanan memori, turunkan nilai ini untuk memicu pemberitahuan sebelumnya. Jika pemberitahuan tekanan memori terpicu secara tidak perlu, tingkatkan nilai ini untuk membuat perangkat kurang sensitif terhadap kebisingan. 70 200
ro.lmk.psi_complete_stall_ms Ambang batas PSI yang lengkap, dalam milidetik, untuk memicu notifikasi memori penting. Jika perangkat terlambat menerima pemberitahuan tekanan memori penting, turunkan nilai ini untuk memicu pemberitahuan sebelumnya. Jika pemberitahuan tekanan memori penting terpicu secara tidak perlu, tingkatkan nilai ini untuk membuat perangkat kurang sensitif terhadap kebisingan. 700
ro.lmk.thrashing_limit Jumlah maksimal set ulang kerja sebagai persentase dari total ukuran cache halaman yang didukung file. Refault set kerja di atas nilai ini berarti bahwa sistem dianggap menghancurkan cache halamannya. Jika kinerja perangkat terpengaruh selama tekanan memori, turunkan nilainya untuk membatasi proses meronta-ronta. Jika kinerja perangkat dimatikan secara tidak perlu karena alasan meronta-ronta, tingkatkan nilainya untuk memungkinkan lebih banyak kerusakan. 100 30
ro.lmk.thrashing_limit_decay Peluruhan ambang batas yang dinyatakan sebagai persentase dari ambang batas asli yang digunakan untuk menurunkan ambang batas ketika sistem tidak pulih, bahkan setelah dimatikan. Jika pemukulan terus menerus menghasilkan pembunuhan yang tidak perlu, turunkan nilainya. Jika respons terhadap pukulan terus-menerus setelah pembunuhan terlalu lambat, tingkatkan nilainya. 10 50
ro.lmk.swap_util_max Jumlah maksimal memori yang ditukar sebagai persentase dari total memori yang dapat ditukar. Ketika memori yang ditukar bertambah melebihi batas ini, itu berarti sistem telah menukar sebagian besar memori yang dapat ditukar dan masih berada di bawah tekanan. Hal ini dapat terjadi ketika alokasi non-swappable menghasilkan tekanan memori yang tidak dapat diatasi dengan swapping karena sebagian besar memori swappable telah ditukar. Nilai defaultnya adalah 100, yang secara efektif menonaktifkan pemeriksaan ini. Jika performa perangkat terpengaruh selama tekanan memori saat pemanfaatan swap tinggi dan tingkat swap bebas tidak turun ke ro.lmk.swap_free_low_percentage , turunkan nilainya untuk membatasi pemanfaatan swap. 100 100

Tombol penyetelan lama berikut juga berfungsi dengan strategi pembunuhan baru.

Properti Menggunakan Bawaan
Kinerja tinggi RAM rendah
ro.lmk.swap_free_low_percentage Tingkat free swap sebagai persentase dari total ruang swap. `lmkd` menggunakan nilai ini sebagai ambang batas kapan harus mempertimbangkan sistem sebagai ruang swap yang kekurangan. Jika `lmkd` terhenti sementara ruang di swap terlalu banyak, kurangi persentasenya. Jika pembunuhan `lmkd` terjadi terlambat, sehingga menyebabkan pembunuhan OOM terjadi, tingkatkan persentasenya. 20 10
ro.lmk.debug Ini mengaktifkan log debug `lmkd`. Aktifkan debug saat menyetel. false