Proses Android low memory killer daemon (lmkd
) memantau memori
status sistem Android yang sedang berjalan dan bereaksi terhadap tekanan memori tinggi dengan mematikan
proses yang paling tidak penting untuk menjaga agar sistem tetap berjalan
level organisasi.
Tentang tekanan memori
Sistem Android yang menjalankan beberapa proses secara paralel mungkin mengalami situasi ketika memori sistem habis dan proses yang membutuhkan lebih banyak mengalami keterlambatan dalam memori. Tekanan memori, status saat sistem kehabisan memori, sehingga mengharuskan Android untuk membebaskan memori (untuk mengurangi tekanan) dengan membatasi atau mematikan proses yang tidak penting, meminta untuk membebaskan sumber daya {i>cache<i} yang tidak penting, dan seterusnya.
Sebelumnya, Android memantau tekanan memori sistem menggunakan
{i>driver low memory killer <i}(LMK), mekanisme kaku yang tergantung pada {i>hard-code<i}
masing-masing. Mulai dari {i>kernel<i} 4.12, {i>driver<i} LMK dihapus dari hulu
kernel dan lmkd
userspace melakukan pemantauan memori dan penghentian proses
tugas klasifikasi.
Informasi kios tekanan
Android 10 dan yang lebih baru mendukung mode lmkd
baru yang
menggunakan monitor kernel Press stall Information (PSI) untuk tekanan memori
deteksi. Patchset PSI di kernel hulu (di-backport ke 4.9 dan 4.14
{i>kernel<i}) mengukur jumlah waktu yang
tertunda tugas sebagai akibat dari
kekurangan memori. Karena penundaan ini secara langsung
mempengaruhi pengalaman pengguna,
mewakili metrik yang mudah untuk menentukan tingkat keparahan tekanan memori. Tujuan
{i>upstream<i} juga mencakup monitor PSI yang mengizinkan
ruang pengguna dengan hak istimewa
proses tertentu (seperti lmkd
) guna menentukan
nilai minimum untuk keterlambatan ini dan
berlangganan ke peristiwa dari {i>kernel<i}
saat ambang batas dilanggar.
Pemantau PSI versus sinyal vmpressure
Karena sinyal vmpressure
(yang dihasilkan oleh kernel untuk memori
deteksi tekanan dan digunakan oleh lmkd
) sering kali menyertakan banyak positif palsu,
lmkd
harus melakukan pemfilteran untuk menentukan apakah memori berada dalam tekanan yang sebenarnya.
Hal ini menyebabkan bangun lmkd
yang tidak perlu dan penggunaan
sumber daya komputasi. Menggunakan monitor PSI menghasilkan memori yang lebih akurat
deteksi tekanan dan
meminimalkan overhead pemfilteran.
Menggunakan monitor PSI
Untuk menggunakan monitor PSI, bukan peristiwa vmpressure
, konfigurasikan
ro.lmk.use_psi
. Defaultnya adalah true
, sehingga PSI memantau
mekanisme default deteksi tekanan memori untuk lmkd
. Karena PSI memantau
membutuhkan dukungan {i>kernel<i}, {i>kernel<i} harus menyertakan
patch {i>backport<i} PSI dan
dikompilasi dengan mengaktifkan dukungan PSI (CONFIG_PSI=y
).
Kekurangan driver LMK dalam kernel
Android menghentikan penggunaan driver LMK karena sejumlah masalah, termasuk:
- Perangkat dengan RAM rendah harus disesuaikan secara agresif, dan bahkan berperforma buruk pada beban kerja dengan pagecache aktif yang didukung file berukuran besar. Tujuan performa buruk yang mengakibatkan thrashing dan tidak ada kill.
- Driver kernel LMK mengandalkan batas memori bebas, tanpa berbasis penskalaan pada tekanan memori.
- Karena desainnya yang kaku, partner sering kali menyesuaikan pengemudi agar dapat berfungsi di perangkat mereka.
- {i>Driver<i} LMK terhubung ke API {i>
slab shrinker<i}, yang bukan
dirancang untuk operasi berat seperti mencari target dan membunuh
mereka, yang memperlambat proses
vmscan
.
{i>Userspace lmkd<i}
lmkd
userspace menerapkan fungsi yang sama seperti driver dalam kernel
tetapi menggunakan mekanisme {i>kernel<i} untuk
mendeteksi dan memperkirakan tekanan memori. Seperti
mekanisme ini antara lain penggunaan peristiwa vmpressure
yang dihasilkan kernel atau kios tekanan
informasi (PSI) monitor untuk mendapatkan
notifikasi tentang tingkat tekanan memori,
dan menggunakan fitur cgroup memori untuk membatasi
sumber daya memori yang dialokasikan ke
proses berdasarkan tingkat kepentingan proses.
Menggunakan lmkd userspace di Android 10
Di Android 9 dan yang lebih tinggi, lmkd
userspace aktif jika
{i>driver<i} LMK dalam {i>
kernel<i} tidak terdeteksi. Karena ruang pengguna lmkd
membutuhkan dukungan {i>kernel<i} untuk cgroup memori, {i>kernel<i} 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 kill berdasarkan peristiwa vmpressure
atau PSI
monitor, tingkat keparahannya, dan
petunjuk lain seperti pemakaian swap. Tutup
strategi berbeda antara perangkat
bermemori rendah dan berperforma tinggi:
- Pada perangkat dengan memori rendah, sistem harus menoleransi tekanan memori yang lebih tinggi sebagai yang merupakan mode operasi normal.
- Pada perangkat berkinerja tinggi, tekanan memori harus dianggap sebagai situasi dan diperbaiki sebelum mempengaruhi keseluruhan kinerja.
Anda dapat mengonfigurasi strategi pembunuhan menggunakan properti ro.config.low_ram
. Sebagai
detailnya, lihat RAM rendah
konfigurasi.
Userspace lmkd
juga mendukung mode lama yang dapat digunakan untuk membuat keputusan pembunuhan
menggunakan strategi yang sama dengan driver LMK dalam kernel (yaitu,
memori dan cache file). Untuk mengaktifkan mode lama, tetapkan
ro.lmk.use_minfree_levels
ke true
.
Konfigurasi lmkd
Konfigurasikan lmkd
untuk perangkat tertentu menggunakan properti berikut.
Properti | Gunakan | Default |
---|---|---|
ro.config.low_ram
|
Menentukan apakah perangkat memiliki RAM rendah atau perangkat berperforma tinggi. | false
|
ro.lmk.use_psi |
Menggunakan pemantauan PSI (bukan peristiwa vmpressure ). |
true |
ro.lmk.use_minfree_levels
|
Menggunakan batas memori bebas dan cache file untuk menghentikan proses keputusan yang tepat (yaitu, mencocokkan fungsionalitas dalam {i>kernel<i} Driver LMK). | false
|
ro.lmk.low
|
Skor oom_adj minimum untuk proses yang memenuhi syarat
dihentikan pada level vmpressure yang rendah.
|
1001 (dinonaktifkan) |
ro.lmk.medium
|
Skor oom_adj minimum untuk proses yang memenuhi syarat
dihentikan pada level vmpressure sedang.
|
800 (layanan yang disimpan dalam cache atau tidak penting) |
ro.lmk.critical
|
Skor oom_adj minimum untuk proses yang memenuhi syarat
dihentikan pada level vmpressure kritis.
|
0 (proses apa pun) |
ro.lmk.critical_upgrade
|
Aktifkan upgrade ke tingkat penting. | false
|
ro.lmk.upgrade_pressure
|
mem_pressure maksimum saat level diupgrade
karena sistem terlalu sering
melakukan {i>swap<i}.
|
100 (dinonaktifkan) |
ro.lmk.downgrade_pressure
|
mem_pressure minimum tempat vmpressure
peristiwa diabaikan karena memori bebas yang masih tersedia masih cukup.
|
100 (dinonaktifkan) |
ro.lmk.kill_heaviest_task
|
Menghentikan 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 kill ketika tidak ada kill tambahan yang akan selesai. | 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 userspace di Android 11
Android 11 meningkatkan lmkd
dengan memperkenalkan
strategi pembunuhan. Strategi mematikan menggunakan mekanisme PSI untuk tekanan memori
yang diperkenalkan di Android 10. lmkd
inci
Android 11 memperhitungkan tingkat penggunaan resource memori
dan {i>thrashing<i} untuk mencegah kehabisan
memori dan penurunan kinerja.
Strategi ini menggantikan strategi sebelumnya dan bisa digunakan di
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 yang tersedia di Kernel umum Android 4.9, 4.14, dan 4.19).
- Menyertakan patch dukungan PIDFD (backport tersedia di Android {i>kernel<i} 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 mematikan memori di Android 11 mendukung kenop tuning dan {i>default<i} yang tercantum di bawah ini. Fitur ini berfungsi pada perangkat berperforma tinggi dan dengan RAM rendah.
Properti | Gunakan | Default | |
---|---|---|---|
Performa tinggi | RAM Rendah | ||
ro.lmk.psi_partial_stall_ms |
Ambang batas penghentian PSI sebagian, dalam milidetik, untuk memicu pemicu rendah notifikasi memori. Jika perangkat menerima notifikasi tekanan memori terlambat, kurangi nilai ini untuk memicu notifikasi lebih awal. Jika memori pemicu notifikasi tekanan jika tidak perlu, tingkatkan nilai ini untuk perangkat kurang sensitif terhadap kebisingan. | 70 |
200 |
ro.lmk.psi_complete_stall_ms |
Ambang batas penghentian PSI, dalam milidetik, untuk memicu notifikasi memori penting. Jika perangkat menerima memori kritis terlambat notifikasi tekanan, turunkan nilai ini untuk memicu notifikasi lebih awal notifikasi. Jika notifikasi tekanan memori kritis dipicu tidak perlu, tingkatkan nilai ini untuk membuat perangkat kurang sensitif terhadap derau. | 700 |
|
ro.lmk.thrashing_limit |
Jumlah maksimum refault set kerja sebagai persentase dari total ukuran {i>pagecache<i} yang didukung file. Refault set kerja di atas nilai ini berarti bahwa sistem dianggap memusnahkan {i>pagecache<i}-nya. Jika kinerja perangkat terpengaruh selama tekanan memori, penurunan nilai untuk membatasi thrashing. Jika performa perangkat terhenti karena alasan thrashing, naikkan nilainya untuk memungkinkan lebih banyak hasil thrashing. | 100 |
30 |
ro.lmk.thrashing_limit_decay |
Peluruhan nilai minimum thrashing yang dinyatakan sebagai persentase dari nilai minimum asli yang digunakan untuk menurunkan batas saat sistem tidak memulihkan, bahkan setelah pembunuhan. Jika thrashing berkelanjutan menghasilkan {i>kills<i}, mengurangi nilainya. Jika respons terhadap {i>thrashing <i}terus menerus setelah {i>kill<i} terlalu lambat, tingkatkan nilainya. | 10 |
50 |
ro.lmk.swap_util_max |
Jumlah maksimum memori yang ditukar sebagai persentase dari total memori yang dapat diganti
memori. Ketika memori yang ditukar bertambah
melampaui batas ini, itu berarti bahwa
sistem menukar sebagian besar memori {i>swappable<i}
dan masih mengalami tekanan.
Hal ini bisa terjadi ketika alokasi yang tidak dapat diganti menghasilkan memori
tekanan yang tidak dapat dikurangi dengan {i>swapping<i}
karena sebagian besar perangkat yang
memori sudah ditukar. Nilai defaultnya adalah 100, yang pada dasarnya
menonaktifkan pemeriksaan ini. Jika kinerja perangkat terpengaruh selama
tekanan memori saat pemakaian swap tinggi dan level swap bebas
tidak turun ke ro.lmk.swap_free_low_percentage , turun
nilai untuk membatasi pemakaian swap. |
100 |
100 |
Tombol tuning lama berikut juga berfungsi dengan strategi mematikan baru.
Properti | Gunakan | Default | |
---|---|---|---|
Performa tinggi | RAM Rendah | ||
ro.lmk.swap_free_low_percentage |
Tingkat swap bebas sebagai persentase dari total ruang swap. `lmkd` menggunakan nilai ini sebagai nilai minimum untuk menentukan kapan sistem dianggap sebagai swap antariksa yang kelaparan. Jika `lmkd` dimatikan saat ada terlalu banyak ruang dalam proses {i>swap<i}, mengurangi persentasenya. Jika `lmkd` kill terjadi terlambat, memungkinkan OOM {i>kill<i} yang akan terjadi, tingkatkan persentasenya. | 20 |
10 |
ro.lmk.debug |
Tindakan ini akan mengaktifkan log debug `lmkd`. Aktifkan debug saat melakukan tuning. | false |