Düşük bellek öldürücü arka plan programı

Android düşük bellek durumunda işlem sonlandırma arka plan programı (lmkd) işlemi, çalışan bir Android sisteminin bellek durumunu izler ve sistemin kabul edilebilir düzeyde performans göstermesini sağlamak için en az gerekli işlemleri sonlandırarak yüksek bellek kullanımına tepki verir.

Bellek baskısı hakkında

Android sisteminde birden fazla işlem paralel olarak çalıştırıldığında sistem belleğinin tükendiği ve daha fazla bellek gerektiren işlemlerin belirgin gecikmeler yaşadığı durumlar ortaya çıkabilir. Bellek baskısı, sistemin belleğinin azaldığı bir durumdur. Bu durumda Android'in, önemsiz işlemleri sınırlayarak veya sonlandırarak, işlemlerden kritik olmayan önbelleğe alınmış kaynakları boşaltmalarını isteyerek vb. bellek baskısını azaltmak için bellek boşaltması gerekir.

Android, geçmişte sistem belleği baskısını izlemek için çekirdek içi düşük bellek sorunu (LMK) sürücüsünü kullanıyordu. Bu sürücü, sabit kodlanmış değerlere bağlı olan katı bir mekanizmaydı. Kernel 4.12'den itibaren LMK sürücüsü yukarı akış kernel'inden kaldırıldı ve kullanıcı alanı lmkd bellek izleme ve işlem sonlandırma görevlerini gerçekleştiriyor.

Basınç durdurma bilgileri

Android 10 ve sonraki sürümlerde, bellek baskısı algılama için çekirdek baskısı durdurma bilgilerini (PSI) kullanan yeni bir lmkd modu desteklenir. Yukarı akış çekirdeğindeki PSI yama seti (4.9 ve 4.14 çekirdeklerine geri taşınmıştır), görevlerin bellek yetersizliği nedeniyle ne kadar süreyle geciktiğini ölçer. Bu gecikmeler kullanıcı deneyimini doğrudan etkilediğinden bellek baskısının önem derecesini belirlemek için uygun bir metriktir. Yukarı akış çekirdeği, ayrıcalıklı kullanıcı alanı işlemlerinin (ör. lmkd) bu gecikmeler için eşikler belirtmesine ve bir eşik ihlal edildiğinde çekirdekten gelen etkinliklere abone olmasına olanak tanıyan PSI monitörlerini de içerir.

KMSİ monitörleri ve vmpressure sinyalleri

vmpressure sinyalleri (bellek basıncı algılama için çekirdek tarafından oluşturulur ve lmkd tarafından kullanılır) genellikle çok sayıda yanlış pozitif içerdiğinden lmkd, belleğin gerçek bir baskı altında olup olmadığını belirlemek için filtreleme yapmalıdır. Bu durum, gereksiz lmkd uyandırmalara ve ek bilgi işlem kaynaklarının kullanılmasına neden olur. PSI izleme sonuçlarının kullanılması, bellek basıncının daha doğru şekilde algılanmasını sağlar ve filtreleme ek yükünü en aza indirir.

PSI monitörlerini kullanma

vmpressure etkinlikleri yerine PSI izleyicilerini kullanmak için ro.lmk.use_psi özelliğini yapılandırın. Varsayılan değer true olduğundan PSI, lmkd için varsayılan bellek baskısı algılama mekanizmasıdır. PSI izleyicileri çekirdek desteği gerektirdiğinden çekirdek, PSI geri bağlantı yamalarını içermeli ve PSI desteği etkinleştirilmiş olarak (CONFIG_PSI=y) derlenmelidir.

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

Android, aşağıdakiler de dahil olmak üzere çeşitli sorunlar nedeniyle LMK sürücüsünün desteğini sonlandırıyor:

  • Düşük RAM'li cihazların agresif bir şekilde ayarlanması gerekiyordu ve bu durumda bile büyük dosya destekli etkin sayfa önbelleği olan iş yüklerinde kötü performans gösteriyordu. Kötü performans nedeniyle aşırı bellek kullanımı yaşanıyor ve hiç düşman öldüremiyorsunuz.
  • LMK çekirdek sürücüsü, bellek baskısına göre ölçeklendirme yapmadan boş bellek sınırlarına dayanıyordu.
  • Tasarımın katılığı nedeniyle iş ortakları genellikle sürücüyü cihazlarında çalışacak şekilde özelleştiriyordu.
  • LMK sürücüsü, hedef arama ve hedefleri sonlandırma gibi ağır işlemler için tasarlanmamış olan slab shrinker API'sine bağlanıyordu. Bu durum vmscan işlemini yavaşlatıyordu.

Userspace lmkd

Kullanıcı alanı lmkd, çekirdek içi sürücüyle aynı işlevselliği uygular ancak bellek baskısını algılamak ve tahmin etmek için mevcut çekirdek mekanizmalarını kullanır. Bu tür mekanizmalar arasında, bellek baskısı seviyeleri hakkında bildirim almak için çekirdek tarafından oluşturulan vmpressure etkinliklerinin veya baskı durdurma bilgisi (PSI) monitörlerinin kullanılması ve her işleme ayrılan bellek kaynaklarını işlem önemine göre 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, çekirdek içi LMK sürücüsü algılanmazsa kullanıcı alanı lmkd etkinleştirilir. Kullanıcı alanı lmkd bellek cgroup'ları 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

Öldürme stratejileri

Kullanıcı alanı, lmkd olaylarına veya PSI monitörlerine, bunların ciddiyetine ve takas kullanım oranı gibi diğer ipuçlarına dayalı sonlandırma stratejilerini destekler.vmpressure Sonlandırma stratejileri, düşük bellekli ve yüksek performanslı cihazlar arasında farklılık gösterir:

  • Belleği az olan cihazlarda sistem, normal ç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 değerlendirilmeli ve genel performansı etkilemeden önce düzeltilmelidir.

Sonlandırma stratejisini ro.config.low_ram özelliğini kullanarak yapılandırabilirsiniz.

Kullanıcı alanı lmkd, çekirdek içi LMK sürücüsüyle aynı stratejileri (ör. boş bellek ve dosya önbelleği eşikleri) kullanarak sonlandırma kararları verdiği 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 cihaz için lmkd yapılandırın.

Özellik Kullan Varsayılan
ro.config.low_ram Cihazın düşük RAM'li mi yoksa yüksek performanslı mı olduğunu belirtin. false
ro.lmk.use_psi PSI monitörlerini (vmpressure etkinlikleri yerine) kullanın. true
ro.lmk.use_minfree_levels İşlem sonlandırma kararları vermek için ücretsiz bellek ve dosya önbelleği eşiklerini kullanın (yani çekirdek içi LMK sürücüsünün işlevselliğiyle eşleşir). false
ro.lmk.low Düşük vmpressure düzeyinde sonlandırılmaya uygun işlemler için minimum oom_adj puanı. 1001
(devre dışı)
ro.lmk.medium Orta vmpressure düzeyinde sonlandırılmaya uygun işlemler için minimum oom_adj puanı. 800
(önbelleğe alınmış veya temel olmayan hizmetler)
ro.lmk.critical Kritik vmpressure düzeyinde sonlandırılmaya uygun işlemler için minimum oom_adj puanı. 0
(herhangi bir işlem)
ro.lmk.critical_upgrade Kritik düzeye yükseltmeyi etkinleştirin. false
ro.lmk.upgrade_pressure Sistem çok fazla yer değiştirme işlemi yaptığından seviyenin yükseltildiği maksimum mem_pressure. 100
(devre dışı)
ro.lmk.downgrade_pressure Yeterli boş bellek hala mevcut olduğundan vmpressure olayının yoksayıldığı minimum mem_pressure. 100
(devre dışı)
ro.lmk.kill_heaviest_task Uygun görevlerden herhangi birini (hızlı karar) değil, en ağır olanı (en iyi karar) sonlandırın. false
ro.lmk.kill_timeout_ms Başka bir sonlandırma yapılmayacaksa sonlandırmadan sonraki süre (milisaniye cinsinden). 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 sonlandırma stratejisi sunarak lmkd iyileştirir. Sonlandırma stratejisi, Android 10'da kullanıma sunulan bellek baskısı algılama için bir PSI mekanizması kullanır. Android 11'deki lmkd, bellek kaynaklarının kullanım düzeylerini ve aşırı bellek kullanımını hesaba katarak bellek yetersizliğini ve performans düşüşünü önler. Bu sonlandırma 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 cihazlarda lmkd için aşağıdaki çekirdek özellikleri gerekir:

  • PSI yamalarını ekleyin ve PSI'yı etkinleştirin (Android ortak çekirdekleri 4.9, 4.14 ve 4.19'da geri bağlantılar mevcuttur).
  • PIDFD destek yamalarını ekleyin (Android ortak çekirdekleri 4.9, 4.14 ve 4.19'da geri bağlantılar mevcuttur).
  • Düşük RAM'li cihazlar için bellek cgroup'larını ekleyin.

Ç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 sonlandırma stratejisi, aşağıda listelenen ayarlama düğmelerini ve varsayılanları destekler. Bu özellikler hem yüksek performanslı hem de düşük RAM'li cihazlarda çalışır.

Özellik Kullan 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 duraklatma eşiği. Cihaz, bellek baskısı bildirimlerini çok geç alıyorsa daha erken bildirimleri tetiklemek için bu değeri düşürün. Bellek baskısı bildirimleri gereksiz yere tetikleniyorsa cihazın gürültüye karşı daha az hassas olması 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 durdurma eşiği. Cihaz, kritik bellek baskısı bildirimlerini çok geç alıyorsa daha erken bildirimleri tetiklemek için bu değeri düşürün. Kritik bellek baskısı bildirimleri gereksiz yere tetikleniyorsa cihazın gürültüye karşı daha az hassas olması 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 yeniden hata sayısı. Bu değerin üzerindeki çalışma kümesi yeniden hata oluşturma sayısı, sistemin sayfa önbelleğini aşırı kullandığı anlamına gelir. Cihazın performansı bellek kullanımı sırasında etkileniyorsa değeri düşürerek bellek kullanımını sınırlayın. Cihazın performansı gereksiz yere aşırı bellek kullanımı nedeniyle kilitleniyorsa, daha fazla aşırı bellek kullanımına izin vermek için değeri artırın. 100 30
ro.lmk.thrashing_limit_decay Sistem, sonlandırmadan sonra bile kurtarılamadığında eşiği düşürmek için kullanılan orijinal eşiğin yüzdesi olarak ifade edilen, aşırı bellek kullanımı eşiği azalması. Sürekli olarak aşırı bellek kullanımı gereksiz sonlandırmalar yapıyorsa değeri düşürün. Bir sonlandırmadan sonra sürekli olarak aşırı bellek kullanımına verilen yanıt çok yavaşsa değeri artırın. 10 50
ro.lmk.swap_util_max Toplam değiştirilebilir belleğin yüzdesi olarak maksimum değiştirilen bellek miktarı. Takas belleği bu sınırı aştığında sistemin, takas edilebilir belleğinin çoğunu takas ettiği ve hâlâ baskı altında olduğu anlaşılır. Bu durum, değiştirilemeyen ayırmalar bellek baskısı oluşturduğunda meydana gelebilir. Bu baskı, değiştirilebilir belleğin çoğu zaten değiştirildiği için değiştirme işlemiyle giderilemez. Varsayılan değer 100'dür. Bu değer, söz konusu kontrolü etkili bir şekilde devre dışı bırakır. Takas kullanımı yüksekken bellek baskısı sırasında cihazın performansı etkileniyorsa ve boş takas seviyesi ro.lmk.swap_free_low_percentage'ya düşmüyorsa takas kullanımını sınırlamak için değeri düşürün. 100 100

Aşağıdaki eski ince ayarlar düğmeleri de yeni sonlandırma stratejisiyle çalışır.

Özellik Kullan 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`, sistemi takas alanı yetersiz olarak değerlendirme eşiği olarak bu değeri kullanır. Takas alanında çok fazla yer varken `lmkd` işlemi sonlandırırsa yüzdeyi düşürün. `lmkd` sonlandırmaları çok geç gerçekleşerek OOM sonlandırmalarına izin veriyorsa 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