Daemon killer memori rendah

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