Düşük Bellekli 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 kabul edilebilir seviyelerde çalışmasını sağlamak için en az gerekli işlemleri öldürerek yüksek bellek basıncına tepki verir.

Bellek basıncı hakkında

Birden çok işlemi paralel olarak çalıştıran bir Android sistemi, sistem belleğinin tükendiği ve daha fazla bellek gerektiren işlemlerde gözle görülür gecikmeler yaşandığı durumlarla karşılaşabilir. Bellek baskısı , sistemin bellekte yetersiz kaldığı bir durum, Android'in önemsiz işlemleri azaltarak veya öldürerek, kritik olmayan önbelleğe alınmış kaynakları boşaltmak için işlemler talep ederek vb. belleği boşaltmasını (baskıyı hafifletmek için) gerektirir.

Tarihsel olarak, Android, sabit kodlanmış değerlere bağlı katı bir mekanizma olan bir çekirdek içi düşük bellek öldürücü (LMK) sürücüsü kullanarak sistem bellek basıncını izledi. Çekirdek 4.12'den itibaren, LMK sürücüsü yukarı akış çekirdeğinden kaldırılır ve kullanıcı alanı lmkd , bellek izleme ve işlem öldürme görevlerini gerçekleştirir.

Basınç durak bilgisi

Android 10 ve sonraki sürümleri, bellek basıncı algılaması için çekirdek basınç duraklama bilgisi (PSI) monitörlerini kullanan yeni bir lmkd modunu destekler. Yukarı akış çekirdeğindeki (4.9 ve 4.14 çekirdeğe geri aktarılan) PSI düzeltme eki, bellek yetersizliği nedeniyle görevlerin ertelendiği süreyi ölçer. Bu gecikmeler kullanıcı deneyimini doğrudan etkilediğinden, bellek basıncının ciddiyetini belirlemek için uygun bir ölçü temsil ederler. Yukarı akış çekirdeği ayrıca ayrıcalıklı kullanıcı alanı işlemlerinin ( lmkd gibi) bu gecikmeler için eşikler belirlemesine ve bir eşik aşıldığında çekirdekten olaylara abone olmasına izin veren PSI monitörlerini de içerir.

Vmpressure sinyallerine karşı PSI monitörleri

vmpressure sinyalleri (bellek basıncı algılaması için çekirdek tarafından oluşturulan ve lmkd tarafından kullanılan) genellikle çok sayıda yanlış pozitif içerdiğinden, lmkd belleğin gerçek basınç altında olup olmadığını belirlemek için filtreleme yapması gerekir. Bu, gereksiz lmkd ve ek hesaplama kaynaklarının kullanılmasına neden olur. PSI monitörlerinin kullanılması, daha doğru bellek basıncı algılaması sağlar ve filtreleme 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 , bu da lmkd için varsayılan bellek basıncı algılama mekanizmasını izlemesini sağlar. PSI monitörleri çekirdek desteği gerektirdiğinden, çekirdeğin PSI backport yamalarını içermesi ve PSI desteği etkinleştirilerek derlenmesi gerekir ( 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'li aygıtların agresif bir şekilde ayarlanması gerekiyordu ve o zaman bile büyük dosya destekli etkin sayfa önbelleği olan iş yüklerinde düşük performans gösterecekti. Kötü performans, thrashing ile sonuçlandı ve öldürme olmadı.
  • LMK çekirdek sürücüsü, bellek basıncına dayalı hiçbir ölçekleme olmaksızın boş bellek sınırlarına dayanıyordu.
  • Tasarımın sertliği nedeniyle iş ortakları genellikle sürücüyü kendi cihazlarında çalışacak şekilde özelleştirdi.
  • LMK sürücüsü, hedef arama ve onları öldürme gibi ağır işlemler için tasarlanmayan ve vmscan sürecini yavaşlatan levha küçültme API'sine bağlandı.

kullanıcı alanı lmkd

Kullanıcı alanı lmkd , çekirdek içi sürücüyle aynı işlevi uygular, ancak bellek basıncını algılamak ve tahmin etmek için mevcut çekirdek mekanizmalarını kullanır. Bu tür mekanizmalar, bellek basınç seviyeleri hakkında bildirimler almak için çekirdek tarafından oluşturulan vmpressure olaylarını veya basınç durma bilgisi (PSI) monitörlerini kullanmayı ve işlemin önemine göre her bir işleme ayrılan bellek kaynaklarını sınırlamak için bellek grubu özelliklerini kullanmayı içerir.

Android 10'da userspace 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 grupları 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 ciddiyetine ve takas kullanımı gibi diğer ipuçlarına dayalı öldürme stratejilerini destekler. Kill 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 basıncını tolere etmelidir.
  • Yüksek performanslı cihazlarda, bellek basıncı anormal bir durum olarak görülmeli ve genel performansı etkilemeden önce düzeltilmelidir.

ro.config.low_ram özelliğini kullanarak kill stratejisini yapılandırabilirsiniz. Ayrıntılar için Düşük ram yapılandırmasına bakın.

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

lmkd'yi yapılandırma

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

Mülk Kullanmak 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 sonlandırma kararları vermek için boş bellek ve dosya önbelleği eşiklerini kullanın (yani, çekirdek içi LMK sürücüsünün işlevselliğini eşleştirin). false
ro.lmk.low Düşük vmpressure seviyesinde öldürülmeye uygun süreçler için minimum oom_adj puanı. 1001
(engelli)
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 öldürülmeye 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 değiş tokuş yaptığı için seviyenin yükseltildiği maksimum mem_pressure . 100
(engelli)
ro.lmk.downgrade_pressure Hâlâ yeterli boş bellek olduğu için bir vmpressure olayının yok sayıldığı minimum mem_pressure . 100
(engelli)
ro.lmk.kill_heaviest_task Herhangi bir uygun göreve (hızlı karar) karşı en ağır uygun görevi (en iyi karar) öldürün. true
ro.lmk.kill_timeout_ms Bir öldürmeden sonraki milisaniye cinsinden ek öldürme yapılmayacak olan süre. 0
(engelli)
ro.lmk.debug lmkd hata ayıklama günlüklerini etkinleştirin. false

Örnek cihaz konfigürasyonu:

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 geliştirir. Öldürme stratejisi, Android 10'da tanıtılan bellek basıncı algılaması için bir PSI mekanizması kullanır. Android 11'de lmkd , bellek açlığını ve performans düşüşünü önlemek için bellek kaynağı kullanım düzeylerini ve thrashing'i hesaplar. Bu öldürme stratejisi, önceki stratejilerin yerini alır ve hem yüksek performanslı hem de düşük RAM'li (Android Go) cihazlarda kullanılabilir.

Çekirdek gereksinimleri

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

  • PSI yamalarını dahil edin ve PSI'yi etkinleştirin (arka planlar, Android ortak çekirdekleri 4.9, 4.14 ve 4.19'da mevcuttur).
  • PIDFD destek yamalarını dahil edin (Android ortak çekirdekleri 4.9, 4.14 ve 4.19'da mevcut olan destekler).
  • Düşük RAM aygıtları için bellek grupları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'li cihazlarda çalışır.

Mülk Kullanmak 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 yere 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 yere tetiklenirse, cihazı gürültüye karşı daha az duyarlı hale getirmek için bu değeri artırın. 700
ro.lmk.thrashing_limit Maksimum çalışma kümesi miktarı, dosya destekli toplam sayfa önbelleği boyutunun bir yüzdesi olarak sıfırlanır. Bu değerin üzerindeki çalışma kümesi arızaları, sistemin sayfa önbelleğini thrashing olarak kabul edildiği anlamına gelir. Hafıza baskısı sırasında cihazın performansı etkilenirse, thrashing'i sınırlamak için değeri azaltın. Cihazın performansı, thrashing nedenleriyle gereksiz yere kesilirse, daha fazla thrashing'e izin vermek için değeri artırın. 100 30
ro.lmk.thrashing_limit_decay Çarpma eşiği düşüşü, sistem bir öldürmeden sonra bile iyileşmediğinde eşiği düşürmek için kullanılan orijinal eşiğin yüzdesi olarak ifade edilir. Sürekli thrashing gereksiz öldürmelere neden oluyorsa değeri azaltın. Bir öldürmeden sonra sürekli dövülmeye tepki çok yavaşsa, değeri artırın. 10 50
ro.lmk.swap_util_max Değiştirilebilir toplam belleğin yüzdesi olarak değiştirilen maksimum bellek miktarı. Değiştirilen bellek bu sınırı aştığında, 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, değiştirilebilen belleğin çoğu zaten değiştirildiğinden, değiştirilerek giderilemeyen bellek baskısı oluşturduğunda olabilir. Varsayılan değer 100'dür ve bu denetimi etkin bir şekilde devre dışı bırakır. Takas kullanımı yüksekken ve serbest takas seviyesi ro.lmk.swap_free_low_percentage bellek baskısı sırasında cihazın performansı etkilenirse, 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.

Mülk Kullanmak Varsayılan
Yüksek performans Düşük RAM
ro.lmk.swap_free_low_percentage Toplam takas alanının yüzdesi olarak ücretsiz takas düzeyi. 'lmkd', bu değeri, sistemin ne zaman takas alanı aç bırakılmış olarak kabul edileceğine ilişkin bir eşik olarak kullanır. Takas işleminde çok fazla alan varken lmkd öldürürse, yüzdeyi azaltın. "lmkd" öldürmeleri çok geç gerçekleşir ve 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