Düşük bellek katil arka plan programı

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 performans göstermesini sağlamak için en az gerekli olan işlemleri sonlandırarak yüksek bellek baskısına tepki verir.

Bellek baskısı hakkında

Paralel olarak birden fazla işlem çalıştıran bir Android sistemi, sistem belleğinin tükendiği ve daha fazla bellek gerektiren işlemlerin belirgin gecikmeler yaşadığı durumlarla karşılaşabilir. Sistemde bellek sıkıntısı yaşandığı durumlarda ortaya çıkan bellek baskısı, Android'in önemli olmayan işlemleri yavaşlatarak veya sonlandırarak, işlemlerin kritik olmayan önbelleğe alınmış kaynakları serbest bırakmasını isteyerek vb. bellek boşaltmasını (baskıyı azaltmak için) gerektirir.

Android, geçmişte sistem bellek baskısını, sabit kodlu değerlere dayanan katı bir mekanizma olan çekirdek içi düşük bellek öldürücü (LMK) sürücü kullanarak izliyordu. 4.12 çekirdeğinden itibaren LMK sürücüsü yayın öncesi çekirdekten kaldırıldı ve kullanıcı alanı lmkd bellek izleme ve işlem sonlandırma görevlerini gerçekleştiriyor.

Basınç durması bilgileri

Android 10 ve sonraki sürümler, bellek basıncı algılama için çekirdek basınç duraklatma bilgilerini (PSI) kullanan yeni bir lmkd modunu destekler. Yukarı yönlü çekirdekteki PSI yama grubu (4.9 ve 4.14 çekirdeklerine geri bağlanmıştır), bellek sıkıntıları nedeniyle görevlerin geciktiği süreyi ölçer. Bu gecikmeler kullanıcı deneyimini doğrudan etkilediği için bellek basıncının önem düzeyini belirlemek için uygun bir metriktir. Yukarı yönlü çekirdek, ayrıca ayrıcalıklı kullanıcı alanı işlemlerinin (lmkd gibi) bu gecikmeler için eşikler belirtmesine ve bir eşik ihlal edildiğinde çekirdekteki etkinliklere abone olmasına olanak tanıyan PSI monitörleri de içerir.

KMSİ monitörleri ve vmpressure sinyalleri

vmpressure sinyalleri (bellek baskısı algılaması 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 baskı altında olup olmadığını belirlemek için filtreleme yapmalıdır. Bu durum, gereksiz lmkd uyanma ve ek bilgi işlem kaynağı kullanımına neden olur. PSI monitörleri kullanmak, daha doğru bellek basıncı algılanmasına neden olur ve filtreleme yükü en aza indirir.

PSI monitörlerini kullanma

vmpressure etkinlikleri yerine PSI monitörleri kullanmak için ro.lmk.use_psi özelliğini yapılandırın. Varsayılan değer true olduğundan PSI, lmkd için bellek basıncı algılamanın varsayılan mekanizmasını izler. PSI monitörleri çekirdek desteği gerektirdiğinden, çekirdek PSI geri bağlantı yamalarını içermeli ve PSI desteği etkinleştirilmiş şekilde derlenmelidir (CONFIG_PSI=y).

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

Android, aşağıdakiler gibi ç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 içeren iş yüklerinde kötü performans gösteriyordu. Kötü performans, rakiplerin savaşı kazanmasına ve hiçbir düşmanın öldürülmemesine neden oldu.
  • LMK çekirdek sürücüsü, bellek baskısına göre ölçeklendirme yapmadan, kullanılabilir bellek sınırlarını kullanıyordu.
  • Tasarımın katılığı nedeniyle iş ortakları, sürücüyü genellikle cihazlarında çalışacak şekilde özelleştiriyordu.
  • LMK sürücüsü, hedef arama ve öldürme gibi ağır işlemler için tasarlanmamış olan slab shrinker API'ye bağlandı ve vmscan işlemini yavaşlattı.

Userspace lmkd

Kullanıcı alanı lmkd, çekirdek içi sürücüyle aynı işlevi uygular ancak bellek baskısını algılamak ve tahmin etmek için mevcut çekirdek mekanizmalarını kullanır. Bellek basıncı seviyeleri hakkında bildirim almak için çekirdek tarafından oluşturulan vmpressure etkinlikleri veya basınç duraklatma bilgileri (PSI) monitörlerini kullanma ve her işleme ayrılan bellek kaynaklarını işlem önemine göre sınırlamak için bellek cgroup özelliklerini kullanma bu mekanizmalara örnek gösterilebilir.

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. lmkd kullanıcı alanı, 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 sonlandırma

Kullanıcı alanı lmkd, vmpressure etkinliklerine 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, belleği düşük ve performansı yüksek cihazlar arasında farklılık gösterir:

  • Bellek miktarı düşük cihazlarda sistem, normal çalışma modu olarak daha yüksek bellek baskısına izin vermelidir.
  • Yüksek performanslı cihazlarda bellek baskısı anormal bir durum olarak değerlendirilmeli ve genel performansı etkilemeden önce düzeltilmelidir.

ro.config.low_ram mülkünü kullanarak öldürme stratejisini yapılandırabilirsiniz.

Kullanıcı alanı lmkd, ç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 lmkd özelliğini belirli bir cihaz için yapılandırın.

Özellik Kullanım Varsayılan
ro.config.low_ram Cihazın düşük RAM'e sahip 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ı almak için boş bellek ve dosya önbelleği eşiklerini kullanın (yani, çekirdek içi LMK sürücüsünün işleviyle eşleşin). false
ro.lmk.low Düşük vmpressure seviyesinde sonlandırılmaya uygun süreçler için minimum oom_adj puanı. 1001
(devre dışı)
ro.lmk.medium Orta vmpressure seviyesinde sonlandırılmaya uygun süreçler için minimum oom_adj puanı. 800
(önbelleğe alınan veya gerekli olmayan hizmetler)
ro.lmk.critical Kritik vmpressure seviyesinde 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 takas yaptığı için seviyenin yükseltildiği maksimum mem_pressure. 100
(devre dışı)
ro.lmk.downgrade_pressure Henüz yeterli miktarda boş bellek bulunduğundan vmpressure etkinliğinin yok sayıldığı minimum mem_pressure. 100
(devre dışı)
ro.lmk.kill_heaviest_task Uygun görevler arasından en ağır olanı (en iyi karar) veya uygun görevler arasından en hızlı olanı (hızlı karar) sonlandırın. false
ro.lmk.kill_timeout_ms Bir öldürme işleminden sonra ek öldürme işlemi yapılmayacağı durumlarda 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ında lmkd

Android 11, yeni bir öldürme stratejisi sunarak lmkd'i iyileştirir. Öldürme stratejisi, Android 10'da kullanıma sunulan bellek basıncı algılama için PSI mekanizmasını kullanır. Android 11'deki lmkd, bellek kaynaklarının kullanım düzeylerini ve bellek sıkıntısını önlemek için bellek sarmalayıcıyı hesaba katar. Bu öldürme stratejisi önceki stratejilerin yerini alır ve hem yüksek performanslı hem de düşük RAM'e sahip (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'yi etkinleştirin (Android'in ortak çekirdekleri 4.9, 4.14 ve 4.19'da geri taşımalar kullanılabilir).
  • PIDFD destek yamalarını ekleyin (Android'in ortak çekirdeklerinde 4.9, 4.14 ve 4.19 sürümlerinde mevcut geri taşımalar).
  • Düşük RAM'li cihazlar için bellek cgroup'leri 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 öldürme stratejisi, aşağıda listelenen ayar düğmelerini ve varsayılan değerleri destekler. Bu özellikler hem yüksek performanslı hem de düşük RAM'e sahip cihazlarda çalışır.

Özellik 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, hafıza baskısı bildirimlerini çok geç alıyorsa daha erken bildirimler tetiklemek için bu değeri azaltın. Bellek baskısı bildirimleri gereksiz yere tetikleniyorsa 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 bildirimlerinin tetiklenmesi için milisaniye cinsinden tam PSI durma eşiği. Cihaz kritik hafıza baskısı bildirimlerini çok geç alıyorsa daha erken bildirim tetiklemek için bu değeri düşürün. Kritik bellek baskısı bildirimleri gereksiz yere tetikleniyorsa cihazı gürültüye karşı daha az duyarlı hale getirmek için bu değeri artırın. 700
ro.lmk.thrashing_limit Dosya destekli toplam sayfa önbelleği boyutunun yüzdesi olarak maksimum çalışma alanı yeniden ayarlama miktarı. Çalışma alanı bu değerin üzerinde yeniden ayarlanırsa sistemin sayfa önbelleğini aşırı kullandığı kabul edilir. Bellek baskısı sırasında cihazın performansı etkileniyorsa aşırı bellek kullanımı Cihazın performansı, gereksiz yere aşırı kullanım nedeniyle devre dışı bırakılıyorsa daha fazla aşırı kullanıma izin vermek için değeri artırın. 100 30
ro.lmk.thrashing_limit_decay Sistem, kapatıldıktan sonra bile iyileşmediğinde eşiği düşürmek için kullanılan orijinal eşiğin yüzdesi olarak ifade edilen aşırı işleme eşiği azalması. Sürekli sarma işlemi gereksiz öldürme işlemleri yapıyorsa değeri düşürün. Öldürme işleminden sonra sürekli tıklama işlemine verilen yanıt çok yavaşsa değeri artırın. 10 50
ro.lmk.swap_util_max Değiştirilebilir toplam belleğin yüzdesi olarak maksimum değiştirilebilir bellek miktarı. Değiştirilen bellek bu sınırı aştığında, sistemin değiştirilebilir belleğinin büyük kısmını değiştirdiği ve hâlâ baskı altında olduğu anlamına gelir. Bu durum, değiştirilebilir olmayan ayırmalar bellek baskısı oluşturduğunda meydana gelebilir. Değiştirilebilir belleğin çoğu zaten değiştirilmiş olduğundan bu baskı, takasla hafifletilemez. Varsayılan değer 100'dür ve bu denetimi devre dışı bırakır. Değişim kullanımı yüksekken bellek baskısı sırasında cihazın performansı etkileniyorsa ve ücretsiz değişim seviyesi ro.lmk.swap_free_low_percentage'e düşmüyorsa değişim kullanımını sınırlamak için değeri düşürün. 100 100

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

Özellik Kullanım 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", sistemin takas alanı sıkıntısı çektiği kabul edilecek durum için bu değeri eşik olarak kullanır. Değişimde çok fazla alan varken "lmkd" işlemini sonlandırıyorsa yüzdeyi düşürün. "lmkd" tarafından yapılan öldürmeler çok geç gerçekleşirse ve OOM öldürmelerine izin verilirse 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