Proses Android low memory killer daemon ( lmkd
) memantau status memori dari sistem Android yang 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 dapat menghadapi situasi ketika memori sistem habis dan proses yang membutuhkan lebih banyak memori mengalami penundaan yang nyata. Tekanan memori , keadaan di mana sistem kehabisan memori, mengharuskan Android untuk mengosongkan memori (untuk mengurangi tekanan) dengan membatasi atau mematikan proses yang tidak penting, meminta proses untuk mengosongkan sumber daya cache yang tidak kritis, dan seterusnya.
Secara historis, Android memantau tekanan memori sistem menggunakan driver low memory killer (LMK) dalam kernel, mekanisme kaku yang bergantung pada nilai hard-coded. Pada kernel 4.12, driver LMK dihapus dari kernel upstream dan lmkd
userspace melakukan pemantauan memori dan tugas mematikan proses.
Informasi kios tekanan
Android 10 dan yang lebih baru mendukung mode lmkd
baru yang menggunakan monitor kernel pressure stall information (PSI) untuk deteksi 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 nyaman untuk menentukan tingkat keparahan tekanan memori. Kernel upstream juga menyertakan monitor PSI yang memungkinkan proses ruang pengguna yang diistimewakan (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 deteksi tekanan memori dan digunakan oleh lmkd
) sering kali menyertakan banyak positif palsu, lmkd
harus melakukan penyaringan untuk menentukan apakah memori berada di bawah tekanan nyata. Ini menghasilkan lmkd
yang tidak perlu dan penggunaan sumber daya komputasi tambahan. Menggunakan monitor PSI menghasilkan deteksi tekanan memori yang lebih akurat dan meminimalkan overhead penyaringan.
Menggunakan monitor PSI
Untuk menggunakan monitor PSI alih-alih kejadian vmpressure
, konfigurasikan properti ro.lmk.use_psi
. Defaultnya adalah true
, membuat PSI memonitor mekanisme default dari deteksi tekanan memori untuk lmkd
. Karena monitor PSI memerlukan dukungan kernel, kernel harus menyertakan patch backport PSI dan dikompilasi dengan dukungan PSI yang 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 kemudian akan berkinerja buruk pada beban kerja dengan cache halaman aktif yang didukung file besar. Performa yang buruk mengakibatkan thrashing dan tidak ada pembunuhan.
- Driver kernel LMK mengandalkan batas memori bebas, tanpa penskalaan berdasarkan tekanan memori.
- Karena kekakuan desain, mitra sering menyesuaikan driver agar dapat bekerja pada perangkat mereka.
- Driver LMK terhubung ke API slab shrinker, yang tidak dirancang untuk operasi berat seperti mencari target dan membunuhnya, yang memperlambat proses
vmscan
.
ruang pengguna lmkd
lmkd
userspace mengimplementasikan fungsionalitas yang sama dengan 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 pressure stall information (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 mematikan berdasarkan peristiwa vmpressure
atau monitor PSI, tingkat keparahannya, dan petunjuk lain seperti pemanfaatan swap. Strategi mematikan berbeda antara perangkat dengan memori rendah dan kinerja tinggi:
- Pada perangkat dengan memori rendah, sistem harus mentolerir tekanan memori yang lebih tinggi sebagai mode operasi normal.
- Pada perangkat berkinerja tinggi, tekanan memori harus dilihat sebagai situasi abnormal dan diperbaiki sebelum memengaruhi kinerja secara keseluruhan.
Anda dapat mengonfigurasi strategi pembunuhan menggunakan properti ro.config.low_ram
. Untuk detailnya, lihat Konfigurasi ram rendah .
Userspace lmkd
juga mendukung mode lama di mana ia membuat keputusan mematikan menggunakan strategi yang sama seperti driver LMK dalam kernel (yaitu, memori bebas dan ambang cache file). Untuk mengaktifkan mode lama, 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 adalah perangkat dengan RAM rendah atau kinerja tinggi. | false |
ro.lmk.use_psi | Gunakan monitor PSI (bukan peristiwa vmpressure ). | true |
ro.lmk.use_minfree_levels | Gunakan memori bebas dan ambang cache file untuk membuat keputusan penghentian proses (yaitu, cocok dengan fungsionalitas driver LMK dalam kernel). | false |
ro.lmk.low | Skor oom_adj minimum untuk proses yang memenuhi syarat untuk dimatikan pada tingkat vmpressure rendah. | 1001 (dengan disabilitas) |
ro.lmk.medium | Skor oom_adj minimum untuk proses yang memenuhi syarat untuk dimatikan pada tingkat vmpressure sedang. | 800 (layanan cache atau tidak penting) |
ro.lmk.critical | Skor oom_adj minimum untuk proses yang memenuhi syarat untuk dimatikan pada tingkat vmpressure kritis. | 0 (proses apa saja) |
ro.lmk.critical_upgrade | Aktifkan peningkatan ke tingkat kritis. | false |
ro.lmk.upgrade_pressure | mem_pressure maksimum di mana level ditingkatkan karena sistem terlalu banyak bertukar. | 100 (dengan disabilitas) |
ro.lmk.downgrade_pressure | mem_pressure minimum saat kejadian vmpressure diabaikan karena memori bebas yang cukup masih tersedia. | 100 (dengan disabilitas) |
ro.lmk.kill_heaviest_task | Bunuh 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 akan 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 pembunuhan menggunakan mekanisme PSI untuk deteksi 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 kinerja. Strategi pembunuhan 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 cgroup memori.
Kernel harus dikompilasi dengan pengaturan konfigurasi berikut:
CONFIG_PSI=y
Mengonfigurasi lmkd di Android 11
Strategi pembunuhan memori di Android 11 mendukung tombol penyetelan dan default yang tercantum di bawah ini. Fitur-fitur ini berfungsi pada perangkat berperforma tinggi dan RAM rendah.
Properti | Menggunakan | Bawaan | |
---|---|---|---|
Performa tinggi | RAM rendah | ||
ro.lmk.psi_partial_stall_ms | Ambang batas penghentian sebagian PSI, dalam milidetik, untuk memicu pemberitahuan memori rendah. Jika perangkat terlambat menerima pemberitahuan tekanan memori, kurangi nilai ini untuk memicu pemberitahuan sebelumnya. Jika pemberitahuan tekanan memori dipicu 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 pemberitahuan memori penting. Jika perangkat terlambat menerima pemberitahuan tekanan memori kritis, kurangi nilai ini untuk memicu pemberitahuan sebelumnya. Jika pemberitahuan tekanan memori kritis dipicu secara tidak perlu, tingkatkan nilai ini untuk membuat perangkat kurang sensitif terhadap kebisingan. | 700 | |
ro.lmk.thrashing_limit | Jumlah maksimum kesalahan set kerja sebagai persentase dari total ukuran cache halaman yang didukung file. Kesalahan set kerja di atas nilai ini berarti bahwa sistem dianggap meronta-ronta pagecache-nya. Jika kinerja perangkat terpengaruh selama tekanan memori, kurangi nilainya untuk membatasi thrashing. Jika kinerja perangkat dimatikan secara tidak perlu karena alasan meronta-ronta, tingkatkan nilainya untuk memungkinkan lebih banyak pemogokan. | 100 | 30 |
ro.lmk.thrashing_limit_decay | Peluruhan ambang batas thrashing dinyatakan sebagai persentase dari ambang batas asli yang digunakan untuk menurunkan ambang batas saat sistem tidak pulih, bahkan setelah pembunuhan. Jika thrashing terus menerus menghasilkan pembunuhan yang tidak perlu, kurangi nilainya. Jika respons terhadap pukulan terus menerus setelah pembunuhan terlalu lambat, tingkatkan nilainya. | 10 | 50 |
ro.lmk.swap_util_max | Jumlah maksimum memori yang ditukar sebagai persentase dari total memori yang dapat ditukar. Ketika memori yang ditukar tumbuh melebihi batas ini, itu berarti bahwa sistem menukar sebagian besar memori yang dapat ditukar dan masih di bawah tekanan. Ini dapat terjadi ketika alokasi yang tidak dapat ditukar menghasilkan tekanan memori yang tidak dapat dihilangkan dengan menukar karena sebagian besar memori yang dapat ditukar sudah ditukar. Nilai default adalah 100, yang secara efektif menonaktifkan pemeriksaan ini. Jika kinerja perangkat terpengaruh selama tekanan memori saat penggunaan swap tinggi dan level swap gratis tidak turun ke ro.lmk.swap_free_low_percentage , kurangi nilainya untuk membatasi pemanfaatan swap. | 100 | 100 |
Tombol penyetelan lama berikut juga berfungsi dengan strategi pembunuhan baru.
Properti | Menggunakan | Bawaan | |
---|---|---|---|
Performa tinggi | RAM rendah | ||
ro.lmk.swap_free_low_percentage | Tingkat swap bebas sebagai persentase dari total ruang swap. `lmkd` menggunakan nilai ini sebagai ambang batas saat mempertimbangkan sistem sebagai kekurangan ruang swap. Jika `lmkd` mati saat ada terlalu banyak ruang di swap, kurangi persentasenya. Jika pembunuhan `lmkd` terjadi terlambat, memungkinkan pembunuhan OOM terjadi, tingkatkan persentasenya. | 20 | 10 |
ro.lmk.debug | Ini mengaktifkan log debug `lmkd`. Aktifkan debug saat menyetel. | false |