Düşük Bellekli Öldürücü Programı

Android düşük bellek öldürücü arka plan programı ( lmkd ) işlemi, çalışan bir Android sisteminin bellek durumunu izler ve sistemin performansını kabul edilebilir düzeylerde tutmak için en az gerekli işlemleri öldürerek yüksek bellek baskısına tepki verir.

Bellek baskısı hakkında

Birden fazla 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. Sistemin belleğinin yetersiz kaldığı bir durum olan bellek baskısı , Android'in önemsiz işlemleri azaltarak veya sonlandırarak, kritik olmayan önbelleğe alınmış kaynakları boşaltmak için işlemler talep ederek vb. yoluyla belleği boşaltmasını (baskıyı hafifletmek için) gerektirir.

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

Basınç durma bilgisi

Android 10 ve sonraki sürümler, bellek basıncı tespiti için çekirdek basıncı durma bilgisi (PSI) monitörlerini kullanan yeni bir lmkd modunu destekler. Yukarı akış çekirdeğindeki (4.9 ve 4.14 çekirdeklerine desteklenen) PSI yama seti, bellek yetersizliği nedeniyle görevlerin geciktiği süreyi ölçer. Bu gecikmeler kullanıcı deneyimini doğrudan etkilediğinden, bellek baskısının ciddiyetini belirlemek için uygun bir ölçüyü temsil eder. Yukarı akış çekirdeği ayrıca ayrıcalıklı kullanıcı alanı işlemlerinin ( lmkd gibi) bu gecikmeler için eşikleri belirlemesine ve bir eşik aşıldığında çekirdekten gelen olaylara abone olmasına izin veren PSI monitörlerini de içerir.

PSI monitörleri ve vmbasınç sinyalleri

vmpressure sinyalleri (bellek basıncı tespiti için çekirdek tarafından oluşturulan ve lmkd tarafından kullanılan) sıklıkla ç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 uyandırmalarına ve ek hesaplama kaynaklarının kullanılmasına neden olur. PSI monitörlerinin kullanılması, daha doğru bellek basıncı algılamasıyla sonuçlanır 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 PSI'nın lmkd için bellek basıncı algılamanın varsayılan mekanizmasını izlemesini sağlar. PSI monitörleri çekirdek desteği gerektirdiğinden, çekirdeğin PSI destek bağlantı düzeltme eklerini içermesi ve PSI desteği etkinleştirilmiş olarak 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ırmıştır:

  • Düşük RAM'li cihazların agresif bir şekilde ayarlanması gerekiyordu ve o zaman bile büyük dosya destekli aktif sayfa önbelleğine sahip iş yüklerinde düşük performans gösteriyorlardı. Kötü performans, darbelere ve öldürme olmamasına neden oldu.
  • LMK çekirdek sürücüsü, bellek baskısına dayalı ölçeklendirme olmaksızın boş bellek sınırlarına dayanıyordu.
  • Tasarımın katılığı nedeniyle iş ortakları genellikle sürücüyü kendi cihazlarında çalışacak şekilde özelleştiriyordu.
  • LMK sürücüsü, hedefleri aramak ve öldürmek gibi ağır işlemler için tasarlanmamış olan levha küçültücü API'sine bağlandı ve bu da vmscan sürecini yavaşlattı.

Kullanıcı alanı lmkd

Kullanıcı alanı lmkd çekirdek içi sürücüyle aynı işlevselliği 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ıncı düzeyleri hakkında bildirim almak için çekirdek tarafından oluşturulan vmpressure olaylarının veya basınç duraklama bilgileri (PSI) monitörlerinin kullanılmasını ve sürecin önemine göre her bir işleme tahsis edilen bellek kaynaklarını sınırlamak için bellek grubu özelliklerinin kullanılmasını içerir.

Android 10'da kullanıcı alanı lmkd'yi kullanma

Android 9 ve sonraki sürümlerde, çekirdek içi bir 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, çekirdeğin aşağıdaki yapılandırma ayarlarıyla derlenmesi gerekir:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

Stratejileri öldür

Userspace 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. Öldürme stratejileri, düşük belleğe sahip ve yüksek performanslı cihazlar arasında farklılık gösterir:

  • Düşük bellekli cihazlarda sistem, normal çalışma modu olarak daha yüksek bellek basıncını tolere etmelidir.
  • Yüksek performanslı cihazlarda bellek baskısı anormal bir durum olarak görülmeli ve genel performansı etkilemeden düzeltilmelidir.

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

Userspace lmkd ayrıca çekirdek içi LMK sürücüsüyle aynı stratejileri (yani boş bellek ve dosya önbellek 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 belirli bir cihaz için yapılandırın.

Mülk Kullanmak Varsayılan
ro.config.low_ram Cihazın düşük RAM'li mi yoksa yüksek performanslı bir cihaz 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 (yani çekirdek içi LMK sürücüsünün işlevselliğini eşleştirmek) için boş bellek ve dosya önbellek eşiklerini kullanın. false
ro.lmk.low Düşük vmpressure düzeyinde sonlandırılmaya uygun işlemler için minimum oom_adj puanı. 1001
(engelli)
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 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 süreç)
ro.lmk.critical_upgrade Kritik düzeye yükseltmeyi etkinleştirin. false
ro.lmk.upgrade_pressure Sistemin çok fazla yer değiştirmesi nedeniyle seviyenin yükseltildiği maksimum mem_pressure . 100
(engelli)
ro.lmk.downgrade_pressure Yeterli boş bellek hala mevcut olduğundan bir vmpressure olayının yok sayıldığı minimum mem_pressure . 100
(engelli)
ro.lmk.kill_heaviest_task Uygun herhangi bir göreve (hızlı karar) karşı en ağır uygun görevi (en iyi karar) sonlandırın. true
ro.lmk.kill_timeout_ms Bir öldürmeden sonra başka bir öldürmenin yapılmayacağı milisaniye cinsinden 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ştiriyor. Öldürme stratejisi, Android 10'da tanıtılan bellek baskısı tespiti için bir PSI mekanizması kullanıyor. Android 11'deki lmkd , bellek açlığını ve performans düşüşünü önlemek için bellek kaynağı kullanım düzeylerini ve darbeyi hesaba katıyor. Bu öldürme stratejisi önceki stratejilerin yerine geçer 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ı ekleyin ve PSI'yı etkinleştirin (Android ortak çekirdekleri 4.9, 4.14 ve 4.19'da bulunan destek bağlantıları).
  • PIDFD destek yamalarını ekleyin (Android ortak çekirdekleri 4.9, 4.14 ve 4.19'da bulunan destek bağlantıları).
  • Düşük RAM'li cihazlar için bellek grupları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 hafıza ö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 hafıza basıncı bildirimlerini çok geç alırsa bildirimlerin daha erken tetiklenmesi için bu değeri azaltın. Bellek basıncı bildirimleri gereksiz yere tetiklenirse, cihazın gürültüye karşı daha az duyarlı olmasını sağlamak 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 bildirimlerin daha erken tetiklenmesi için bu değeri azaltın. Kritik bellek basıncı bildirimleri gereksiz yere tetiklenirse, cihazın gürültüye karşı daha az duyarlı olmasını sağlamak için bu değeri artırın. 700
ro.lmk.thrashing_limit Maksimum çalışma kümesi miktarı, toplam dosya destekli sayfa önbellek boyutunun yüzdesi olarak yeniden başlatılır. Bu değerin üzerindeki çalışma seti hataları, sistemin sayfa önbelleğini çökerttiğinin düşünüldüğü anlamına gelir. Bellek baskısı sırasında cihazın performansı etkilenirse, çöp atmayı sınırlamak için değeri azaltın. Cihazın performansı gereksiz yere çökertilirse, daha fazla çarpmaya izin verecek şekilde değeri artırın. 100 30
ro.lmk.thrashing_limit_decay Çarpıcı eşik azalması, sistem bir öldürmeden sonra bile iyileşemediğinde eşiği düşürmek için kullanılan orijinal eşiğin yüzdesi olarak ifade edilir. Sürekli vurma gereksiz öldürmelere neden oluyorsa değeri azaltın. Öldürmeden sonra sürekli darbeye 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ı. Değiştirilen belleğin bu sınırı aşması, sistemin değiştirilebilir belleğinin çoğunu değiştirdiği ve hâlâ baskı altında olduğu anlamına gelir. Bu durum, değiştirilemeyen ayırmalar, değiştirilebilir belleğin çoğu zaten değiştirilmiş olduğundan değiştirmeyle giderilemeyen bellek baskısı oluşturduğunda meydana gelebilir. Varsayılan değer 100'dür ve bu, bu kontrolü etkili bir şekilde devre dışı bırakır. Takas kullanımı yüksekken ve ücretsiz takas düzeyi ro.lmk.swap_free_low_percentage düşmüyorken 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 aynı zamanda yeni öldürme stratejisiyle de ç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çlığı çeken bir sistem olarak değerlendirileceğine ilişkin bir eşik olarak kullanır. Takasta çok fazla alan varken 'lmkd' öldürülürse yüzdeyi azaltın. 'Lmkd' öldürmeleri çok geç gerçekleşirse, OOM öldürmelerinin gerçekleşmesine 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