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

Daemon Pembunuh Memori Rendah

Proses Android low memory killer daemon ( lmkd ) memantau status memori dari sistem Android yang sedang berjalan dan bereaksi terhadap tekanan memori 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 mungkin mengalami situasi ketika memori sistem habis dan proses yang membutuhkan lebih banyak memori mengalami penundaan yang nyata. Tekanan memori , keadaan saat sistem kekurangan memori, mengharuskan Android mengosongkan memori (untuk mengurangi tekanan) dengan membatasi atau menghentikan proses yang tidak penting, meminta proses untuk membebaskan sumber daya cache yang tidak penting, dan seterusnya.

Secara historis, Android memantau tekanan memori sistem menggunakan driver LMK (pembunuh memori rendah) dalam kernel, mekanisme kaku yang bergantung pada nilai hard code. Mulai kernel 4.12, driver LMK dihapus dari kernel upstream dan lmkd userspace melakukan tugas pemantauan dan lmkd proses memori.

Informasi penghentian tekanan

Android 10 dan yang lebih baru lmkd mode lmkd baru yang menggunakan monitor informasi lmkd tekanan kernel (PSI) untuk deteksi tekanan memori. Patchset PSI di kernel upstream (di-backport ke kernel 4.9 dan 4.14) mengukur jumlah waktu penundaan tugas sebagai akibat dari kekurangan memori. Karena penundaan ini secara langsung memengaruhi pengalaman pengguna, penundaan ini mewakili metrik yang sesuai untuk menentukan tingkat keparahan tekanan memori. Kernel upstream juga menyertakan monitor PSI yang memungkinkan proses userspace yang memiliki hak istimewa (seperti lmkd ) untuk menentukan ambang batas untuk penundaan ini dan untuk berlangganan acara dari kernel saat ambang batas dilanggar.

Monitor PSI versus sinyal tekanan v

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

Menggunakan monitor PSI

Untuk menggunakan monitor PSI dan bukan peristiwa vmpressure , konfigurasikan properti ro.lmk.use_psi . Standarnya true , membuat PSI memonitor 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 dari driver LMK dalam kernel

Android menghentikan driver LMK karena sejumlah masalah, termasuk:

  • Perangkat dengan RAM rendah harus disetel secara agresif, dan bahkan kemudian akan berkinerja buruk pada beban kerja dengan pagecache aktif yang didukung file besar. Performa yang buruk mengakibatkan meronta-ronta dan tidak membunuh.
  • Driver kernel LMK mengandalkan batas memori bebas, tanpa penskalaan berdasarkan tekanan memori.
  • Karena kekakuan desain, mitra sering kali menyesuaikan pengemudi agar dapat berfungsi pada perangkat mereka.
  • Driver LMK terhubung ke slab shrinker API, yang tidak dirancang untuk operasi berat seperti mencari target dan membunuhnya, yang memperlambat proses vmscan .

Userspace lmkd

lmkd userspace mengimplementasikan fungsionalitas yang sama seperti driver dalam kernel tetapi menggunakan mekanisme kernel yang ada untuk mendeteksi dan memperkirakan tekanan memori. Mekanisme tersebut termasuk menggunakan kejadian vmpressure dihasilkan vmpressure atau monitor informasi stall tekanan (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 userspace lmkd di Android 10

Di Android 9 dan yang lebih baru, userspace lmkd 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

Strategi membunuh

Userspace lmkd mendukung strategi pembunuhan berdasarkan peristiwa vmpressure atau monitor PSI, tingkat keparahannya, dan petunjuk lain seperti pemanfaatan swap. Strategi membunuh berbeda antara perangkat berkinerja rendah dan memori rendah:

  • Pada perangkat dengan memori rendah, sistem harus mentolerir tekanan memori yang lebih tinggi sebagai mode operasi normal.
  • Pada perangkat berperforma tinggi, tekanan memori harus dilihat sebagai situasi yang tidak normal 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 Default
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, cocokkan fungsionalitas pengandar LMK dalam kernel). false
ro.lmk.low Skor oom_adj minimum untuk proses yang memenuhi syarat untuk dimatikan pada level vmpressure rendah. 1001
(dengan disabilitas)
ro.lmk.medium Skor oom_adj minimum untuk proses yang memenuhi syarat untuk dimatikan pada level vmpressure sedang. 800
(layanan dalam cache atau tidak penting)
ro.lmk.critical Skor oom_adj minimum untuk proses yang memenuhi syarat untuk dimatikan pada tingkat vmpressure kritis. 0
(proses apapun)
ro.lmk.critical_upgrade Aktifkan peningkatan ke level 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 Minimum mem_pressure di mana peristiwa vmpressure diabaikan karena masih tersedia cukup memori kosong. 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 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

Userspace 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 meronta-ronta untuk mencegah kekurangan memori dan penurunan kinerja. Strategi pembunuhan ini menggantikan strategi sebelumnya dan dapat digunakan pada perangkat berkinerja 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 cgroups memori.

Kernel harus dikompilasi dengan pengaturan konfigurasi berikut:

CONFIG_PSI=y

Mengonfigurasi lmkd di Android 11

Strategi pembunuhan memori di Android 11 mendukung kenop tuning dan default yang tercantum di bawah ini. Fitur-fitur ini berfungsi pada perangkat berkinerja tinggi dan RAM rendah.

Properti Menggunakan Default
Performa tinggi RAM rendah
ro.lmk.psi_partial_stall_ms Ambang batas PSI parsial, dalam milidetik, untuk memicu notifikasi memori rendah. Jika perangkat terlambat menerima pemberitahuan tekanan memori, kurangi nilai ini untuk memicu pemberitahuan sebelumnya. Jika pemberitahuan tekanan memori memicu tanpa perlu, tingkatkan nilai ini untuk membuat perangkat kurang sensitif terhadap kebisingan. 70 200
ro.lmk.psi_complete_stall_ms Ambang batas penghentian PSI lengkap, dalam milidetik, untuk memicu pemberitahuan memori kritis. Jika perangkat terlambat menerima pemberitahuan tekanan memori kritis, kurangi nilai ini untuk memicu pemberitahuan sebelumnya. Jika pemberitahuan tekanan memori kritis terpicu tanpa perlu, tingkatkan nilai ini untuk membuat perangkat kurang sensitif terhadap derau. 700
ro.lmk.thrashing_limit Jumlah maksimal set kerja default sebagai persentase dari total ukuran cache halaman yang didukung file. Reset workingset di atas nilai ini berarti bahwa sistem dianggap meronta-ronta pagecache-nya. Jika kinerja perangkat terpengaruh selama tekanan memori, turunkan nilai untuk membatasi perontokan. Jika kinerja perangkat dimatikan secara tidak perlu karena alasan meronta-ronta, tingkatkan nilainya untuk memungkinkan lebih banyak perontokan. 100 30
ro.lmk.thrashing_limit_decay Peluruhan ambang batas yang dinyatakan sebagai persentase ambang awal yang digunakan untuk menurunkan ambang saat sistem tidak pulih, bahkan setelah mematikan. Jika meronta-ronta terus menerus menghasilkan pembunuhan yang tidak perlu, kurangi nilainya. Jika respon untuk terus menerus meronta-ronta setelah membunuh terlalu lambat, tingkatkan nilainya. 10 50
ro.lmk.swap_util_max Jumlah maksimal 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. Hal 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 defaultnya adalah 100, yang secara efektif menonaktifkan pemeriksaan ini. Jika kinerja perangkat terpengaruh selama tekanan memori sementara penggunaan swap tinggi dan tingkat swap gratis tidak turun ke ro.lmk.swap_free_low_percentage , kurangi nilai untuk membatasi penggunaan swap. 100 100

Kenop tuning lama berikut juga berfungsi dengan strategi pembunuhan baru.

Properti Menggunakan Default
Performa tinggi RAM rendah
ro.lmk.swap_free_low_percentage Tingkat swap gratis sebagai persentase dari total ruang swap. `lmkd` menggunakan nilai ini sebagai ambang batas untuk mempertimbangkan sistem sebagai ruang swap kelaparan. Jika `lmkd` terbunuh saat ada terlalu banyak ruang dalam swap, kurangi persentasenya. Jika `lmkd` kill terjadi terlambat, memungkinkan OOM kill terjadi, naikkan persentasenya. 20 10
ro.lmk.debug Ini mengaktifkan log debug `lmkd`. Aktifkan debug saat menyetel. false