Proses daemon low memory killer Android (lmkd
) memantau status memori sistem Android yang sedang berjalan dan bereaksi terhadap tekanan memori yang tinggi dengan menghentikan proses yang paling tidak penting agar sistem tetap berjalan pada tingkat yang dapat diterima.
Tentang tekanan memori
Sistem Android yang menjalankan beberapa proses secara paralel dapat mengalami situasi ketika memori sistem habis dan proses yang memerlukan lebih banyak memori mengalami penundaan yang terlihat jelas. Tekanan memori, yaitu kondisi saat sistem kekurangan memori, mengharuskan Android membebaskan memori (untuk mengurangi tekanan) dengan membatasi atau menghentikan proses yang tidak penting, meminta proses untuk membebaskan resource yang di-cache yang tidak penting, dan sebagainya.
Sebelumnya, Android memantau tekanan memori sistem menggunakan driver low memory killer (LMK) dalam kernel, mekanisme kaku yang bergantung pada nilai yang dikodekan secara permanen. Mulai kernel 4.12, driver LMK dihapus dari kernel upstream dan userspace lmkd
melakukan tugas pemantauan memori dan penghentian proses.
Informasi penghentian karena tekanan
Android 10 dan yang lebih tinggi mendukung mode lmkd
baru yang
menggunakan monitor informasi penghentian tekanan (PSI) kernel untuk deteksi
tekanan memori. Patchset PSI di kernel upstream (di-backport ke kernel 4.9 dan 4.14) mengukur durasi penundaan tugas akibat kekurangan memori. Karena penundaan ini secara langsung memengaruhi pengalaman pengguna, penundaan ini
menjadi metrik yang mudah untuk menentukan tingkat keparahan tekanan memori. Kernel
upstream juga menyertakan monitor PSI yang memungkinkan proses ruang pengguna
dengan hak istimewa (seperti lmkd
) menentukan nilai minimum untuk penundaan ini dan
berlangganan ke peristiwa dari kernel saat nilai minimum dilampaui.
Pemantauan PSI versus sinyal vmpressure
Karena sinyal vmpressure
(yang dihasilkan oleh kernel untuk deteksi tekanan memori dan digunakan oleh lmkd
) sering kali mencakup banyak positif palsu, lmkd
harus melakukan pemfilteran untuk menentukan apakah memori sedang mengalami tekanan yang sebenarnya.
Hal ini menyebabkan aktivasi lmkd
yang tidak perlu dan penggunaan resource komputasi tambahan. Penggunaan PSI memantau hasil dalam deteksi tekanan memori yang lebih akurat dan meminimalkan overhead pemfilteran.
Menggunakan monitor PSI
Untuk menggunakan monitor PSI, bukan peristiwa vmpressure
, konfigurasikan properti
ro.lmk.use_psi
. Nilai defaultnya adalah true
, sehingga PSI menjadi mekanisme default 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 menghentikan penggunaan driver LMK karena sejumlah masalah, termasuk:
- Perangkat dengan RAM rendah harus disetel secara agresif, dan bahkan saat itu pun akan berperforma buruk pada beban kerja dengan cache halaman aktif yang didukung file besar. Performa yang buruk menyebabkan thrashing dan tidak ada pembunuhan.
- Driver kernel LMK mengandalkan batas memori bebas, tanpa penskalaan berdasarkan tekanan memori.
- Karena desainnya yang kaku, partner sering menyesuaikan driver agar berfungsi di perangkat mereka.
- Driver LMK terhubung ke API pengecil slab, yang tidak dirancang untuk operasi berat seperti menelusuri target dan menghentikannya, yang memperlambat proses
vmscan
.
lmkd ruang pengguna
lmkd
userspace menerapkan fungsi yang sama dengan driver dalam kernel, tetapi menggunakan mekanisme kernel yang ada untuk mendeteksi dan memperkirakan tekanan memori. Mekanisme
tersebut mencakup penggunaan peristiwa vmpressure
yang dihasilkan kernel atau monitor informasi
penghentian karena tekanan (PSI) untuk mendapatkan notifikasi tentang tingkat tekanan memori,
dan penggunaan fitur cgroup memori untuk membatasi sumber daya memori yang dialokasikan ke setiap
proses berdasarkan kepentingan proses.
Menggunakan lmkd ruang pengguna di Android 10
Di Android 9 dan yang lebih tinggi, lmkd
userspace diaktifkan jika
driver LMK dalam kernel tidak terdeteksi. Karena lmkd
userspace
memerlukan dukungan kernel untuk cgroup memori, kernel harus dikompilasi dengan
setelan konfigurasi berikut:
CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
Strategi penghentian
Userspace lmkd
mendukung strategi penghentian berdasarkan peristiwa vmpressure
atau monitor PSI, tingkat keparahannya, dan petunjuk lainnya seperti pemanfaatan swap. Strategi
penghentian berbeda antara perangkat dengan memori rendah dan perangkat berperforma tinggi:
- Pada perangkat dengan memori rendah, sistem harus mentoleransi tekanan memori yang lebih tinggi sebagai mode operasi normal.
- Pada perangkat berperforma tinggi, tekanan memori harus dianggap sebagai situasi yang tidak normal dan diperbaiki sebelum memengaruhi performa secara keseluruhan.
Anda dapat mengonfigurasi strategi penghentian menggunakan properti ro.config.low_ram
.
Ruang pengguna lmkd
juga mendukung mode lama yang membuat keputusan penghentian
menggunakan strategi yang sama dengan driver LMK dalam kernel (yaitu, batas
memori kosong dan cache file). Untuk mengaktifkan mode lama, tetapkan properti
ro.lmk.use_minfree_levels
ke true
.
Mengonfigurasi lmkd
Konfigurasi lmkd
untuk perangkat tertentu menggunakan properti berikut.
Properti | Gunakan | Default |
---|---|---|
ro.config.low_ram
|
Tentukan apakah perangkat adalah perangkat dengan RAM rendah atau performa tinggi. | false
|
ro.lmk.use_psi |
Gunakan monitor PSI (bukan peristiwa vmpressure ). |
true |
ro.lmk.use_minfree_levels
|
Gunakan batas memori kosong dan cache file untuk membuat keputusan penghentian proses (yaitu, cocokkan fungsi driver LMK dalam kernel). | false
|
ro.lmk.low
|
Skor oom_adj minimum untuk proses yang memenuhi syarat untuk dihentikan pada level vmpressure rendah.
|
1001 (dinonaktifkan) |
ro.lmk.medium
|
Skor oom_adj minimum untuk proses yang memenuhi syarat untuk dihentikan pada level vmpressure 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 upgrade ke tingkat kritis. | false
|
ro.lmk.upgrade_pressure
|
mem_pressure maksimum saat level ditingkatkan
karena sistem terlalu banyak melakukan pertukaran.
|
100 (dinonaktifkan) |
ro.lmk.downgrade_pressure
|
mem_pressure minimum saat peristiwa vmpressure
diabaikan karena memori kosong yang tersedia masih cukup.
|
100 (dinonaktifkan) |
ro.lmk.kill_heaviest_task
|
Menghentikan tugas yang memenuhi syarat paling berat (keputusan terbaik) versus tugas yang memenuhi syarat (keputusan cepat). | false
|
ro.lmk.kill_timeout_ms
|
Durasi dalam milidetik setelah penonaktifan saat tidak ada penonaktifan tambahan yang akan dilakukan. | 0 (dinonaktifkan) |
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
lmkd ruang pengguna di Android 11
Android 11 meningkatkan lmkd
dengan memperkenalkan strategi
penonaktifan baru. Strategi penghentian menggunakan mekanisme PSI untuk deteksi tekanan memori yang diperkenalkan di Android 10. lmkd
di Android 11 memperhitungkan tingkat penggunaan resource memori dan thrashing untuk mencegah kekurangan memori dan penurunan performa.
Strategi penghentian ini menggantikan strategi sebelumnya dan dapat digunakan di perangkat berperforma tinggi dan perangkat dengan 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).
- Menyertakan 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 setelan konfigurasi berikut:
CONFIG_PSI=y
Mengonfigurasi lmkd di Android 11
Strategi penghentian aplikasi di Android 11 mendukung tombol penyesuaian dan nilai default yang tercantum di bawah. Fitur ini berfungsi di perangkat berperforma tinggi dan perangkat dengan RAM rendah.
Properti | Gunakan | Default | |
---|---|---|---|
Performa tinggi | RAM rendah | ||
ro.lmk.psi_partial_stall_ms |
Ambang batas jeda PSI parsial, dalam milidetik, untuk memicu notifikasi memori rendah. Jika perangkat menerima notifikasi tekanan memori terlambat, kurangi nilai ini untuk memicu notifikasi lebih awal. Jika notifikasi tekanan memori dipicu secara tidak perlu, tingkatkan nilai ini agar perangkat tidak terlalu sensitif terhadap derau. | 70 |
200 |
ro.lmk.psi_complete_stall_ms |
Nilai minimum penundaan PSI lengkap, dalam milidetik, untuk memicu notifikasi memori penting. Jika perangkat menerima notifikasi tekanan memori kritis terlalu terlambat, kurangi nilai ini untuk memicu notifikasi lebih awal. Jika notifikasi tekanan memori kritis dipicu tanpa perlu, tingkatkan nilai ini agar perangkat tidak terlalu sensitif terhadap noise. | 700 |
|
ro.lmk.thrashing_limit |
Jumlah maksimum kesalahan perujukan set kerja sebagai persentase dari total ukuran cache halaman yang didukung file. Kesalahan set kerja di atas nilai ini berarti sistem dianggap meng-thrash pagecache-nya. Jika performa perangkat terpengaruh selama tekanan memori, kurangi nilai untuk membatasi thrashing. Jika performa perangkat dihentikan tanpa alasan yang jelas karena alasan thrashing, naikkan nilai untuk mengizinkan lebih banyak thrashing. | 100 |
30 |
ro.lmk.thrashing_limit_decay |
Peluruhan nilai minimum thrashing yang dinyatakan sebagai persentase dari nilai minimum asli yang digunakan untuk menurunkan nilai minimum saat sistem tidak pulih, bahkan setelah proses dihentikan. Jika thrashing berkelanjutan menghasilkan penutupan yang tidak perlu, kurangi nilai. Jika respons terhadap thrashing berkelanjutan setelah penghentian terlalu lambat, tingkatkan nilai. | 10 |
50 |
ro.lmk.swap_util_max |
Jumlah maksimum memori yang di-swap sebagai persentase dari total memori yang dapat di-swap. Jika memori swap bertambah melebihi batas ini, berarti sistem menukar sebagian besar memori yang dapat di-swap dan masih berada di bawah tekanan.
Hal ini dapat terjadi saat alokasi yang tidak dapat ditukar menghasilkan tekanan memori yang tidak dapat diredakan dengan menukar karena sebagian besar memori yang dapat ditukar sudah ditukar. Nilai defaultnya adalah 100, yang secara efektif
menonaktifkan pemeriksaan ini. Jika performa perangkat terpengaruh selama
tekanan memori saat penggunaan swap tinggi dan tingkat swap bebas
tidak turun ke ro.lmk.swap_free_low_percentage , kurangi
nilai untuk membatasi penggunaan swap. |
100 |
100 |
Tombol tuning lama berikut juga berfungsi dengan strategi penghentian baru.
Properti | Gunakan | Default | |
---|---|---|---|
Performa tinggi | RAM rendah | ||
ro.lmk.swap_free_low_percentage |
Tingkat swap kosong sebagai persentase dari total ruang swap. `lmkd` menggunakan nilai ini sebagai batas untuk kapan sistem dianggap kekurangan ruang swap. Jika `lmkd` menghentikan proses saat ada terlalu banyak ruang di swap, kurangi persentasenya. Jika proses penonaktifan `lmkd` terjadi terlalu lambat, sehingga memungkinkan proses penonaktifan karena kehabisan memori (OOM) terjadi, tingkatkan persentasenya. | 20 |
10 |
ro.lmk.debug |
Tindakan ini mengaktifkan log debug `lmkd`. Aktifkan debug saat melakukan penyesuaian. | false |