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 çalışmasını sağlamak için en az gerekli işlemleri öldürerek yüksek bellek basıncına tepki verir.
Bellek basıncı hakkında
Birden çok 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. Bellek baskısı , sistemin bellekte yetersiz kaldığı bir durum, Android'in önemsiz işlemleri azaltarak veya öldürerek, kritik olmayan önbelleğe alınmış kaynakları boşaltmak için işlemler talep ederek vb. belleği boşaltmasını (baskıyı hafifletmek için) gerektirir.
Tarihsel olarak, Android, sabit kodlanmış değerlere bağlı katı bir mekanizma olan bir çekirdek içi düşük bellek öldürücü (LMK) sürücüsü kullanarak sistem bellek basıncını izledi. Çekirdek 4.12'den itibaren, LMK sürücüsü yukarı akış çekirdeğinden kaldırılır ve kullanıcı alanı lmkd
, bellek izleme ve işlem öldürme görevlerini gerçekleştirir.
Basınç durak bilgisi
Android 10 ve sonraki sürümleri, bellek basıncı algılaması için çekirdek basınç duraklama bilgisi (PSI) monitörlerini kullanan yeni bir lmkd
modunu destekler. Yukarı akış çekirdeğindeki (4.9 ve 4.14 çekirdeğe geri aktarılan) PSI düzeltme eki, bellek yetersizliği nedeniyle görevlerin ertelendiği süreyi ölçer. Bu gecikmeler kullanıcı deneyimini doğrudan etkilediğinden, bellek basıncının ciddiyetini belirlemek için uygun bir ölçü temsil ederler. Yukarı akış çekirdeği ayrıca ayrıcalıklı kullanıcı alanı işlemlerinin ( lmkd
gibi) bu gecikmeler için eşikler belirlemesine ve bir eşik aşıldığında çekirdekten olaylara abone olmasına izin veren PSI monitörlerini de içerir.
Vmpressure sinyallerine karşı PSI monitörleri
vmpressure
sinyalleri (bellek basıncı algılaması için çekirdek tarafından oluşturulan ve lmkd
tarafından kullanılan) genellikle ç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
ve ek hesaplama kaynaklarının kullanılmasına neden olur. PSI monitörlerinin kullanılması, daha doğru bellek basıncı algılaması sağlar 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 lmkd
için varsayılan bellek basıncı algılama mekanizmasını izlemesini sağlar. PSI monitörleri çekirdek desteği gerektirdiğinden, çekirdeğin PSI backport yamalarını içermesi ve PSI desteği etkinleştirilerek 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ırıyor:
- Düşük RAM'li aygıtların agresif bir şekilde ayarlanması gerekiyordu ve o zaman bile büyük dosya destekli etkin sayfa önbelleği olan iş yüklerinde düşük performans gösterecekti. Kötü performans, thrashing ile sonuçlandı ve öldürme olmadı.
- LMK çekirdek sürücüsü, bellek basıncına dayalı hiçbir ölçekleme olmaksızın boş bellek sınırlarına dayanıyordu.
- Tasarımın sertliği nedeniyle iş ortakları genellikle sürücüyü kendi cihazlarında çalışacak şekilde özelleştirdi.
- LMK sürücüsü, hedef arama ve onları öldürme gibi ağır işlemler için tasarlanmayan ve
vmscan
sürecini yavaşlatan levha küçültme API'sine bağlandı.
kullanıcı alanı lmkd
Kullanıcı alanı lmkd
, çekirdek içi sürücüyle aynı işlevi 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ınç seviyeleri hakkında bildirimler almak için çekirdek tarafından oluşturulan vmpressure
olaylarını veya basınç durma bilgisi (PSI) monitörlerini kullanmayı ve işlemin önemine göre her bir işleme ayrılan bellek kaynaklarını sınırlamak için bellek grubu özelliklerini kullanmayı içerir.
Android 10'da userspace lmkd'yi kullanma
Android 9 ve sonraki sürümlerde, bir çekirdek içi 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, çekirdek aşağıdaki yapılandırma ayarlarıyla derlenmelidir:
CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
Stratejileri öldür
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. Kill stratejileri, düşük bellekli ve yüksek performanslı cihazlar arasında farklılık gösterir:
- Düşük bellekli cihazlarda, sistem normal bir çalışma modu olarak daha yüksek bellek basıncını tolere etmelidir.
- Yüksek performanslı cihazlarda, bellek basıncı anormal bir durum olarak görülmeli ve genel performansı etkilemeden önce düzeltilmelidir.
ro.config.low_ram
özelliğini kullanarak kill stratejisini yapılandırabilirsiniz. Ayrıntılar için Düşük ram yapılandırmasına bakın.
lmkd
ayrıca, ç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 belirli bir aygıt için lmkd
yapılandırın.
Mülk | Kullanmak | Varsayılan |
---|---|---|
ro.config.low_ram | Aygıtın düşük RAM mi yoksa yüksek performanslı bir aygıt 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 için boş bellek ve dosya önbelleği eşiklerini kullanın (yani, çekirdek içi LMK sürücüsünün işlevselliğini eşleştirin). | false |
ro.lmk.low | Düşük vmpressure seviyesinde öldürülmeye uygun süreçler için minimum oom_adj puanı. | 1001 (engelli) |
ro.lmk.medium | Orta vmpressure düzeyinde öldürülmeye uygun süreçler için minimum oom_adj puanı. | 800 (önbelleğe alınmış veya gerekli olmayan hizmetler) |
ro.lmk.critical | Kritik vmpressure düzeyinde öldürülmeye uygun süreçler için minimum oom_adj puanı. | 0 (herhangi bir süreç) |
ro.lmk.critical_upgrade | Kritik seviyeye yükseltmeyi etkinleştirin. | false |
ro.lmk.upgrade_pressure | Sistem çok fazla değiş tokuş yaptığı için seviyenin yükseltildiği maksimum mem_pressure . | 100 (engelli) |
ro.lmk.downgrade_pressure | Hâlâ yeterli boş bellek olduğu için bir vmpressure olayının yok sayıldığı minimum mem_pressure . | 100 (engelli) |
ro.lmk.kill_heaviest_task | Herhangi bir uygun göreve (hızlı karar) karşı en ağır uygun görevi (en iyi karar) öldürün. | true |
ro.lmk.kill_timeout_ms | Bir öldürmeden sonraki milisaniye cinsinden ek öldürme yapılmayacak olan 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ştirir. Öldürme stratejisi, Android 10'da tanıtılan bellek basıncı algılaması için bir PSI mekanizması kullanır. Android 11'de lmkd
, bellek açlığını ve performans düşüşünü önlemek için bellek kaynağı kullanım düzeylerini ve thrashing'i hesaplar. Bu öldürme 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 cihazlar için lmkd
, aşağıdaki çekirdek özelliklerini gerektirir:
- PSI yamalarını dahil edin ve PSI'yi etkinleştirin (arka planlar, Android ortak çekirdekleri 4.9, 4.14 ve 4.19'da mevcuttur).
- PIDFD destek yamalarını dahil edin (Android ortak çekirdekleri 4.9, 4.14 ve 4.19'da mevcut olan destekler).
- Düşük RAM aygıtları için bellek gruplarını dahil edin.
Ç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ı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, bellek basıncı bildirimlerini çok geç alırsa, daha önceki bildirimleri tetiklemek için bu değeri azaltın. Bellek basıncı bildirimleri gereksiz yere tetiklenirse, 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 milisaniye cinsinden tam PSI durma eşiği. Cihaz kritik bellek basıncı bildirimlerini çok geç alırsa, daha önceki bildirimleri tetiklemek için bu değeri azaltın. Kritik bellek basıncı bildirimleri gereksiz yere tetiklenirse, cihazı gürültüye karşı daha az duyarlı hale getirmek için bu değeri artırın. | 700 | |
ro.lmk.thrashing_limit | Maksimum çalışma kümesi miktarı, dosya destekli toplam sayfa önbelleği boyutunun bir yüzdesi olarak sıfırlanır. Bu değerin üzerindeki çalışma kümesi arızaları, sistemin sayfa önbelleğini thrashing olarak kabul edildiği anlamına gelir. Hafıza baskısı sırasında cihazın performansı etkilenirse, thrashing'i sınırlamak için değeri azaltın. Cihazın performansı, thrashing nedenleriyle gereksiz yere kesilirse, daha fazla thrashing'e izin vermek için değeri artırın. | 100 | 30 |
ro.lmk.thrashing_limit_decay | Çarpma eşiği düşüşü, sistem bir öldürmeden sonra bile iyileşmediğinde eşiği düşürmek için kullanılan orijinal eşiğin yüzdesi olarak ifade edilir. Sürekli thrashing gereksiz öldürmelere neden oluyorsa değeri azaltın. Bir öldürmeden sonra sürekli dövülmeye tepki çok yavaşsa, değeri artırın. | 10 | 50 |
ro.lmk.swap_util_max | Değiştirilebilir toplam belleğin yüzdesi olarak değiştirilen maksimum bellek miktarı. Değiştirilen bellek bu sınırı aştığında, sistemin değiştirilebilir belleğinin çoğunu değiştirdiği ve hala baskı altında olduğu anlamına gelir. Bu, değiştirilemeyen ayırmalar, değiştirilebilen belleğin çoğu zaten değiştirildiğinden, değiştirilerek giderilemeyen bellek baskısı oluşturduğunda olabilir. Varsayılan değer 100'dür ve bu denetimi etkin bir şekilde devre dışı bırakır. Takas kullanımı yüksekken ve serbest takas seviyesi ro.lmk.swap_free_low_percentage 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 de yeni öldürme stratejisiyle ç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ç bırakılmış olarak kabul edileceğine ilişkin bir eşik olarak kullanır. Takas işleminde çok fazla alan varken lmkd öldürürse, yüzdeyi azaltın. "lmkd" öldürmeleri çok geç gerçekleşir ve OOM öldürmelerinin gerçekleşmesine izin verirse, 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 |