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 |