Düşük Bellek Katil Daemon

Android düşük bellek öldürücü arka plan programı ( lmkd ) işlemi, çalışan bir Android sisteminin bellek durumunu izler ve sistemin performansını kabul edilebilir düzeylerde tutmak için en az gerekli işlemleri lmkd yüksek bellek baskısına tepki verir.

Bellek baskısı hakkında

Birden çok işlemi paralel olarak çalıştıran bir Android sistemi, sistem belleğinin tükendiği durumlarla ve daha fazla bellek deneyimi gerektiren işlemlerde gözle görülür gecikmelerle karşılaşabilir. Sistemin hafızada yetersiz kaldığı bir durum olan bellek baskısı , Android'in önemsiz işlemleri azaltarak veya öldürerek, kritik olmayan önbelleğe alınmış kaynakları serbest bırakma işlemleri talep ederek, vb.

Tarihsel olarak, Android, sabit kodlu değerlere dayanan katı bir mekanizma olan çekirdek içi düşük bellek öldürücü (LMK) sürücüsü kullanarak sistem belleği baskısını izliyordu. Çekirdek lmkd itibaren, LMK sürücüsü yukarı akış çekirdekten kaldırılır ve kullanıcı alanı lmkd bellek izleme ve işlem öldürme görevlerini gerçekleştirir.

Basınç durma bilgisi

Android 10 ve sonraki sürümler, bellek basıncı algılaması için çekirdek basıncı durma bilgileri (PSI) monitörlerini kullanan yeni bir lmkd modunu destekler. Yukarı akış çekirdeğindeki PSI yama seti (4.9 ve 4.14 çekirdeklerine geri yüklenmiştir), bellek yetersizliği nedeniyle görevlerin geciktirildiği süreyi ölçer. Bu gecikmeler kullanıcı deneyimini doğrudan etkilediğinden, bellek baskısının şiddetini belirlemek için uygun bir ölçütü temsil ederler. Yukarı akış çekirdeği ayrıca, ayrıcalıklı kullanıcı alanı işlemlerinin ( lmkd gibi) bu gecikmeler için eşikleri belirlemesine ve bir eşik lmkd çekirdekteki olaylara abone olmasına izin veren PSI monitörlerini de içerir.

PSI monitörlerine karşı vmpressure sinyalleri

Çünkü vmpressure sinyalleri (bellek basınç algılama için çekirdek tarafından üretilen ve kullanılan lmkd ) çoğu zaman çok sayıda yanlış pozitif arasında, lmkd bellek gerçek basınç altında olup olmadığını belirlemek için filtreleme yapmak gerekir. Bu, gereksiz lmkd ve ek hesaplama kaynaklarının kullanımına neden olur. PSI monitörlerinin kullanılması, daha doğru bellek basıncı algılama ile sonuçlanır ve filtreleme ek yükünü en aza indirir.

PSI monitörlerini kullanma

vmpressure olayları yerine PSI monitörlerini kullanmak için ro.lmk.use_psi özelliğini yapılandırın. Varsayılan değer true , PSI lmkd için varsayılan bellek basıncı algılama mekanizmasını izler. PSI monitörleri çekirdek desteği gerektirdiğinden, çekirdek PSI arka alan yamalarını içermeli ve PSI desteği etkinleştirilmiş olarak derlenmelidir ( CONFIG_PSI=y ).

Çekirdek içi LMK sürücüsünün dezavantajları

Android, aşağıdakiler de dahil olmak üzere bir dizi sorun nedeniyle LMK sürücüsünü kullanımdan kaldırıyor:

  • Düşük RAM cihazlarının agresif bir şekilde ayarlanması gerekiyordu ve o zaman bile büyük dosya destekli aktif sayfa önbelleği olan iş yüklerinde kötü performans gösterecekti. Zayıf performans savurma ile sonuçlandı ve öldürme olmadı.
  • LMK çekirdek sürücüsü, bellek baskısına dayalı ölçeklendirme olmaksızın boş bellek sınırlarına dayanıyordu.
  • Tasarımın sağlamlığı nedeniyle, iş ortakları genellikle sürücüyü kendi cihazlarında çalışacak şekilde özelleştirdiler.
  • LMK sürücüsü, hedefleri aramak ve öldürmek gibi ağır işlemler için tasarlanmamış olan ve vmscan sürecini yavaşlatan slab shrinker API'ye vmscan .

Kullanıcı alanı lmkd

Kullanıcı alanı lmkd , çekirdek içi sürücü ile aynı işlevselliği uygular, ancak bellek baskısını tespit etmek ve tahmin etmek için mevcut çekirdek mekanizmalarını kullanır. Bu tür mekanizmalar arasında, bellek basınç seviyeleri hakkında bildirimler almak için çekirdek tarafından üretilen vmpressure olayları veya basınç vmpressure bilgileri (PSI) monitörlerinin kullanılması ve işlemin önemine bağlı olarak her işlem için ayrılan bellek kaynaklarını sınırlamak için bellek cgroup özelliklerinin kullanılması yer alır.

Android 10'da kullanıcı alanı lmkd'yi kullanma

Android 9 ve sonraki sürümlerde, bir çekirdek içi LMK sürücüsü algılanmazsa kullanıcı alanı lmkd etkinleştirilir. Kullanıcı alanı lmkd bellek cgrupları için çekirdek desteği gerektirdiğinden, çekirdek aşağıdaki yapılandırma ayarlarıyla derlenmelidir:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

Stratejileri öldür

lmkd , vmpressure olaylarına veya PSI monitörlerine, bunların önem derecesine ve takas kullanımı gibi diğer ipuçlarına dayalı öldürme stratejilerini destekler. Öldürme stratejileri düşük bellekli ve yüksek performanslı cihazlar arasında farklılık gösterir:

  • Düşük bellekli cihazlarda, sistem normal bir çalışma modu olarak daha yüksek bellek baskısına tolerans göstermelidir.
  • Yüksek performanslı cihazlarda, bellek baskısı anormal bir durum olarak görülmeli ve genel performansı etkilemeden önce düzeltilmelidir.

ro.config.low_ram özelliğini kullanarak öldürme stratejisini yapılandırabilirsiniz (ayrıntılar için bkz. Düşük RAM Yapılandırması ).

lmkd ayrıca, çekirdek içi LMK sürücüsü (yani, boş bellek ve dosya önbellek eşikleri) ile aynı stratejileri kullanarak öldürme kararları verdiği eski bir modu destekler. Eski modu etkinleştirmek için ro.lmk.use_minfree_levels özelliğini true .

Lmkd'yi yapılandırma

Aşağıdaki özellikleri kullanarak belirli bir cihaz için lmkd yapılandırın.

Emlak Kullanım Varsayılan
ro.config.low_ram Aygıtın düşük RAM mi yoksa yüksek performanslı bir aygıt mı olduğunu belirtin. false
ro.lmk.use_psi PSI monitörlerini kullanın ( vmpressure olayları yerine). true
ro.lmk.use_minfree_levels İşlem öldürme kararları vermek için boş bellek ve dosya önbellek eşiklerini kullanın (yani, çekirdek içi LMK sürücüsünün işlevselliğiyle eşleşin). false
ro.lmk.low Düşük vmpressure seviyesinde öldürülmeye uygun süreçler için minimum oom_adj puanı. 1001
(devre dışı)
ro.lmk.medium Orta vmpressure düzeyinde öldürülmeye uygun süreçler için minimum oom_adj puanı. 800
(önbelleğe alınmış veya gerekli olmayan hizmetler)
ro.lmk.critical Kritik vmpressure düzeyinde vmpressure uygun süreçler için minimum oom_adj puanı. 0
(herhangi bir süreç)
ro.lmk.critical_upgrade Kritik seviyeye yükseltmeyi etkinleştirin. false
ro.lmk.upgrade_pressure Sistem çok fazla mem_pressure için seviyenin yükseltildiği maksimum mem_pressure . 100
(devre dışı)
ro.lmk.downgrade_pressure Bir vmpressure olayının göz ardı edildiği minimum mem_pressure , çünkü yeterli boş bellek hala mevcuttur. 100
(devre dışı)
ro.lmk.kill_heaviest_task Herhangi bir uygun göreve karşı (hızlı karar) en ağır uygun görevi (en iyi karar) öldürün. true
ro.lmk.kill_timeout_ms Bir öldürmeden sonra ek öldürmenin yapılmayacağı milisaniye cinsinden süre. 0
(devre dışı)
ro.lmk.debug lmkd hata ayıklama günlüklerini etkinleştirin. false

Örnek cihaz yapılandırması:

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

Android 11'de Kullanıcı Alanı lmkd

Android 11, yeni bir öldürme stratejisi sunarak lmkd iyileştiriyor. Öldürme stratejisi, Android 10'da tanıtılan bellek basıncı algılama için bir PSI mekanizması kullanır. Android 11'deki lmkd , bellek yetersizliğini ve performans düşüşünü önlemek için bellek kaynağı kullanım düzeylerini ve lmkd hesaplar. Bu öldürme stratejisi, önceki stratejilerin yerini alır ve hem yüksek performanslı hem de düşük RAM (Android Go) cihazlarda kullanılabilir.

Çekirdek gereksinimleri

Android 11 cihazlar için, lmkd aşağıdaki çekirdek özelliklerini gerektirir:

  • PSI yamalarını ekleyin ve PSI'yı etkinleştirin (arka portlar Android ortak çekirdeklerinde 4.9, 4.14 ve 4.19'da mevcuttur).
  • PIDFD destek yamalarını dahil edin (arka kapılar Android ortak çekirdeklerinde 4.9, 4.14 ve 4.19'da mevcuttur).
  • Düşük RAM'li cihazlar için, bellek cgruplarını dahil edin.

Çekirdek aşağıdaki yapılandırma ayarlarıyla derlenmelidir:

CONFIG_PSI=y

Android 11'de lmkd'yi yapılandırma

Android 11'deki bellek öldürme stratejisi, aşağıda listelenen ayar düğmelerini ve varsayılanları destekler. Bu özellikler hem yüksek performanslı hem de düşük RAM cihazlarında çalışır.

Emlak Kullanım Varsayılan
Yüksek performans Düşük RAM
ro.lmk.psi_partial_stall_ms Düşük bellek bildirimini tetiklemek için milisaniye cinsinden kısmi PSI durma eşiği. Cihaz bellek basıncı bildirimlerini çok geç alırsa, daha önceki bildirimleri tetiklemek için bu değeri azaltın. Bellek basıncı bildirimleri gereksiz şekilde tetiklenirse, cihazı gürültüye karşı daha az duyarlı hale getirmek için bu değeri artırın. 70 200
ro.lmk.psi_complete_stall_ms Kritik bellek bildirimlerini tetiklemek için milisaniye cinsinden tam PSI durma eşiği. Cihaz kritik bellek basıncı bildirimlerini çok geç alırsa, daha önceki bildirimleri tetiklemek için bu değeri azaltın. Kritik bellek basıncı bildirimleri gereksiz şekilde tetiklenirse, cihazı gürültüye daha az duyarlı hale getirmek için bu değeri artırın. 700
ro.lmk.thrashing_limit Toplam dosya destekli sayfa önbelleği boyutunun yüzdesi olarak maksimum çalışma kümesi sonuçları. Bu değerin üzerindeki çalışma kümesi sonuçları, sistemin sayfa önbelleğini çöpe attığı anlamına gelir. Bellek baskısı sırasında cihazın performansı etkilenirse, atılmayı sınırlamak için değeri azaltın. Cihazın performansı, çarpma nedenleriyle gereksiz yere kesilirse, daha fazla darbeye izin vermek için değeri artırın. 100 30
ro.lmk.thrashing_limit_decay Çökme eşiği azalması, bir öldürmeden sonra bile sistem düzelmediğinde eşiği düşürmek için kullanılan orijinal eşiğin yüzdesi olarak ifade edilir. Sürekli savurmak gereksiz öldürmeler üretirse, değeri azaltın. Bir öldürmeden sonra sürekli saldırıya tepki çok yavaşsa, değeri artırın. 10 50
ro.lmk.swap_util_max Takas edilebilir toplam belleğin yüzdesi olarak maksimum takas belleği miktarı. Değiştirilen bellek bu sınırın üzerine çıktığında, bu, sistemin değiştirilebilir belleğinin çoğunu değiştirdiği ve hala baskı altında olduğu anlamına gelir. Bu, değiştirilemeyen ayırmalar bellek baskısı oluşturduğunda meydana gelebilir ve bu, takas edilebilir belleğin çoğu zaten değiştirilmiş olduğundan, takasla rahatlatılamaz. Varsayılan değer 100'dür ve bu denetimi etkin bir şekilde devre dışı bırakır. Takas kullanımı ro.lmk.swap_free_low_percentage bellek baskısı sırasında aygıtın performansı etkilenirse ve serbest takas düzeyi ro.lmk.swap_free_low_percentage düzeyine ro.lmk.swap_free_low_percentage , takas kullanımını sınırlamak için değeri azaltın. 100 100

Aşağıdaki eski ayar düğmeleri de yeni öldürme stratejisiyle çalışır.

Emlak Kullanım Varsayılan
Yüksek performans Düşük RAM
ro.lmk.swap_free_low_percentage Toplam takas alanının yüzdesi olarak serbest takas seviyesi. "lmkd" bu değeri, sistemin ne zaman takas alanından yoksun olarak değerlendirileceği bir eşik olarak kullanır. Takasta çok fazla alan varken "lmkd" öldürürse, yüzdeyi azaltın. "Lmkd" öldürmeleri çok geç olursa, OOM öldürmelerinin gerçekleşmesine izin verirse, yüzdeyi artırın. 20 10
ro.lmk.debug Bu, "lmkd" hata ayıklama günlüklerini etkinleştirir. Ayarlama sırasında hata ayıklamayı etkinleştirin. false