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 belleği 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şlemi 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 bilgisi (PSI) monitörlerini 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.

PSI 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ş (CONFIG_PSI=y) olarak 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 disk belleği değişimi yapıldı ve hiçbir düşman öldürülmedi.
  • 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

Sonlandırma stratejileri

Kullanıcı alanı, vmpressure etkinliklerine veya PSI izleyicilerine, bunların ciddiyetine ve takas kullanımı gibi diğer ipuçlarına dayalı sonlandırma stratejilerini lmkd destekler. Düşük bellekli ve yüksek performanslı cihazlar arasındaki işlem sonlandırma stratejileri farklıdır:

  • Düşük belleğe sahip 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 izleyicilerini kullanın (vmpressure etkinlikleri yerine). 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 seviyesinde sonlandırılmaya uygun işlemler için minimum oom_adj puanı. 1001
(devre dışı)
ro.lmk.medium Orta vmpressure seviyesinde sonlandırılmaya uygun işlemler için minimum oom_adj puanı. 800
(önbelleğe alınan veya gerekli 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 olduğundan vmpressure etkinliğinin 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 öldürme işlemi yapılmayacaksa öldürme işleminden 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 bellek yetersizliğini önlemek için bellek yetersizliğini hesaba katar. 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ı içerir (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 kapatma stratejisi, aşağıdaki 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şı hassasiyetini azaltmak için bu değeri artırın. 70 200
ro.lmk.psi_complete_stall_ms Önemli bellek bildirimlerini tetiklemek için milisaniye cinsinden tam PSI duraklatma 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. Bellek kullanımı sırasında cihazın performansı etkileniyorsa değeri düşürerek bellek kullanımını sınırlayın. Cihazın performansı gereksiz yere kilitlenmeye neden olan nedenlerle düşürülüyorsa daha fazla kilitlenmeye 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ı yüklenme eşiği düşüşü. Sürekli olarak gereksiz sonlandırmalar yapılıyorsa değeri düşürün. Bir sonlandırma işleminden sonra sürekli olarak disk belleği kullanma işlemine 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ştirilmiş bellek miktarı. Takas edilen bellek bu sınırı aştığında sistemin, takas edilebilir belleğinin büyük bir kısmını 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 ayarlama 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ğerlendireceği eşik olarak bu değeri kullanır. Takas alanında çok fazla yer varken `lmkd` işlemi sonlandırırsa yüzdeyi azaltı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