Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Daemon Pembunuh Memori Rendah

Android memori rendah pembunuh daemon ( lmkd ) monitor proses negara memori dari sistem Android berjalan dan bereaksi terhadap tekanan memori tinggi dengan membunuh proses penting setidaknya untuk menjaga sistem tampil di 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 berjalan singkat pada memori, membutuhkan Android ke memori bebas (untuk mengurangi tekanan) oleh throttling atau membunuh proses penting, meminta proses untuk sumber informasi gratis noncritical cache, dan sebagainya.

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 hulu dan userspace lmkd melakukan pemantauan memori dan proses membunuh tugas.

Informasi kios tekanan

Android 10 dan kemudian mendukung baru lmkd modus yang menggunakan kernel informasi tekanan warung (PSI) monitor 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 nyaman untuk menentukan tingkat keparahan tekanan memori. Kernel hulu juga termasuk monitor PSI yang memungkinkan proses userspace istimewa (seperti lmkd ) untuk menentukan ambang untuk penundaan ini dan untuk berlangganan peristiwa dari kernel ketika ambang dilanggar.

Monitor PSI versus sinyal vmpressure

Karena vmpressure sinyal (yang dihasilkan oleh kernel untuk deteksi tekanan memori dan digunakan oleh lmkd ) sering termasuk banyak positif palsu, lmkd harus melakukan penyaringan untuk menentukan apakah memori berada di bawah tekanan yang nyata. Ini hasil dalam yang tidak perlu lmkd wakeups dan penggunaan sumber daya tambahan komputasi. Menggunakan monitor PSI menghasilkan deteksi tekanan memori yang lebih akurat dan meminimalkan overhead penyaringan.

Menggunakan monitor PSI

Untuk menggunakan monitor PSI bukan vmpressure peristiwa, configure ro.lmk.use_psi properti. Default adalah true , membuat monitor PSI 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 kemudian akan berkinerja buruk pada beban kerja dengan cache halaman aktif yang didukung file besar. Kinerja yang buruk mengakibatkan meronta-ronta 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.
  • Sopir LMK terhubung ke API slab Shrinker, yang tidak dirancang untuk operasi berat seperti mencari target dan membunuh mereka, yang memperlambat vmscan proses.

Ruang pengguna lmkd

Userspace lmkd alat fungsi yang sama sebagai driver di-kernel tetapi penggunaan mekanisme kernel yang ada untuk mendeteksi dan tekanan memori perkiraan. Mekanisme tersebut termasuk menggunakan kernel yang dihasilkan vmpressure peristiwa atau informasi tekanan warung (PSI) monitor untuk mendapatkan pemberitahuan tentang tingkat tekanan memori, dan menggunakan fitur memori cgroup untuk membatasi sumber daya memori yang dialokasikan untuk setiap proses berdasarkan proses penting.

Menggunakan ruang pengguna lmkd di Android 10

Di Android 9 dan kemudian, userspace lmkd mengaktivasi jika di-kernel sopir LMK tidak terdeteksi. Karena userspace lmkd memerlukan dukungan kernel untuk cgroups 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 membunuh strategi berdasarkan vmpressure peristiwa atau monitor PSI, keparahan mereka, 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 mengkonfigurasi strategi kill menggunakan ro.config.low_ram properti (untuk rincian, lihat RAM Konfigurasi Rendah ).

Userspace lmkd juga mendukung mode warisan di mana ia membuat keputusan kill menggunakan strategi yang sama sebagai driver LMK di-kernel (yaitu, memori bebas dan file cache ambang batas). Untuk mengaktifkan modus warisan, mengatur ro.lmk.use_minfree_levels properti untuk true .

Mengonfigurasi lmkd

Konfigurasi 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 PSI monitor (bukan vmpressure peristiwa). 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 Minimum oom_adj skor untuk proses memenuhi syarat untuk dibunuh di rendah vmpressure tingkat. 1001
(dengan disabilitas)
ro.lmk.medium Minimum oom_adj skor untuk proses memenuhi syarat untuk dibunuh di media vmpressure tingkat. 800
(layanan cache atau tidak penting)
ro.lmk.critical Minimum oom_adj skor untuk proses memenuhi syarat untuk dibunuh di kritis vmpressure tingkat. 0
(proses apa saja)
ro.lmk.critical_upgrade Aktifkan peningkatan ke tingkat kritis. false
ro.lmk.upgrade_pressure Maksimum mem_pressure di mana tingkat upgrade karena sistem swapping terlalu banyak. 100
(dengan disabilitas)
ro.lmk.downgrade_pressure Minimum mem_pressure di mana vmpressure acara diabaikan karena cukup memori 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 lmkd log debug. 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 membunuh menggunakan mekanisme PSI untuk deteksi tekanan memori diperkenalkan di Android 10. lmkd di Android 11 rekening untuk tingkat penggunaan sumber daya memori dan meronta-ronta untuk mencegah kelaparan 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 Android 11 perangkat, 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 thrashing, tingkatkan nilainya untuk memungkinkan lebih banyak thrashing. 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 sementara pemanfaatan swap adalah tinggi dan tingkat free swap tidak jatuh ke ro.lmk.swap_free_low_percentage , menurunkan nilai untuk pemanfaatan batas 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