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ı boşaltmasını isteyerek vb. bellek boşaltmasını (baskıyı azaltmak için) gerektirir.

Android geçmişte sistem bellek basıncını sabit kodlu değerlere bağlı olan katı bir mekanizma olan çekirdek içi düşük bellek katlayıcı (LMK) sürücüsü 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ğinden, bellek baskısı şiddetini belirleme açısından kullanışlı 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 basıncı 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 bir baskı altında olup olmadığını belirlemek için filtreleme yapmalıdır. Bu durum, gereksiz lmkd uyanışa ve ek bilgi işlem kaynaklarının kullanılması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ı gerekti. Böyle bir durum olsa bile dosya destekli büyük etkin sayfa önbelleğine sahip iş yüklerinde performansı düşük performans gösteriyordu. Kötü performans, paranın çekilmesine ve öldürülmemesine yol açtı.
  • 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 daraltıcı API'ye yoğunlaştı. Bu durum, vmscan sürecini 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. Bu mekanizmalar arasında, 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 yer alır.

Android 10'da kullanıcı alanı lmkd'sini 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 cgroup'leri 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.

Sonlandırma stratejisini ro.config.low_ram özelliğini kullanarak yapılandırabilirsiniz. Ayrıntılar için Düşük RAM yapılandırması başlıklı makaleyi inceleyin.

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ırın

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'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ı 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ışı bırakıldı)
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ışı bırakıldı)
ro.lmk.downgrade_pressure Henüz yeterli 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 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ında lmkd

Android 11, yeni bir öldürme stratejisi sunarak lmkd'i iyileştirir. Sonlandırma stratejisi, Android 10'da kullanıma sunulan bellek basıncı algılaması için bir PSI mekanizması 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 sıçramalarını 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'yı etkinleştirin (Android'in yaygın kullanılan 4.9, 4.14 ve 4.19 çekirdeklerinde bulunan geri bağlantı noktaları).
  • 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'e sahip 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 kullanılan kısmi PSI duraklama eşiği (milisaniye cinsinden). Cihaz, bellek baskısı bildirimlerini çok geç alırsa daha önceki bildirimleri 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 bildirimlerini tetiklemek için kullanılan tam PSI duraklama eşiği (milisaniye cinsinden). 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 basıncı sırasında cihazın performansı etkileniyorsa baskıyı sınırlandırmak için değeri düşürün. 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ı kullanım eşiği azalması. Sürekli sarma işlemi gereksiz öldürmeler 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 RAM düşük
ro.lmk.swap_free_low_percentage Toplam takas alanının yüzdesi olarak ücretsiz takas düzeyi. "lmkd", sistemin ne zaman değişim alanı eksikliği yaşandığını belirleyen eşik olarak bu değeri kullanır. Değişimde çok fazla alan varken "lmkd" sonlandırılırsa yüzdeyi azaltı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