Android düşük bellek durumunda işlem sonlandırma arka plan programı (lmkd
) işlemi, çalışan bir Android sisteminin bellek durumunu izler ve sistemin kabul edilebilir düzeyde performans göstermesini sağlamak için en az gerekli işlemleri sonlandırarak yüksek bellek kullanımına tepki verir.
Bellek baskısı hakkında
Android sisteminde birden fazla işlem paralel olarak çalıştırıldığında sistem belleğinin tükendiği ve daha fazla bellek gerektiren işlemlerin belirgin gecikmeler yaşadığı durumlar ortaya çıkabilir. Bellek baskısı, sistemin belleğinin azaldığı bir durumdur. Bu durumda Android'in, önemsiz işlemleri sınırlayarak veya sonlandırarak, işlemlerden kritik olmayan önbelleğe alınmış kaynakları boşaltmalarını isteyerek vb. bellek baskısını azaltmak için belleği boşaltması gerekir.
Android, geçmişte sistem belleği baskısını izlemek için çekirdek içi düşük bellek sorunu (LMK) sürücüsünü kullanıyordu. Bu sürücü, sabit kodlanmış değerlere bağlı olan katı bir mekanizmaydı. Kernel 4.12'den itibaren LMK sürücüsü yukarı akış kernel'inden kaldırıldı ve kullanıcı alanı lmkd
bellek izleme ve işlemi sonlandırma görevlerini gerçekleştiriyor.
Basınç durdurma bilgileri
Android 10 ve sonraki sürümlerde, bellek baskısı algılama için çekirdek baskısı durdurma bilgisi (PSI) monitörlerini kullanan yeni bir lmkd
modu desteklenir. Yukarı akış çekirdeğindeki PSI yama seti (4.9 ve 4.14 çekirdeklerine geri taşınmıştır), görevlerin bellek yetersizliği nedeniyle ne kadar süreyle geciktiğini ölçer. Bu gecikmeler kullanıcı deneyimini doğrudan etkilediğinden bellek baskısının önem derecesini belirlemek için uygun bir metriktir. Yukarı akış çekirdeği, ayrıcalıklı kullanıcı alanı işlemlerinin (ör. lmkd
) bu gecikmeler için eşikler belirtmesine ve bir eşik ihlal edildiğinde çekirdekten gelen etkinliklere abone olmasına olanak tanıyan PSI monitörlerini de içerir.
PSI monitörleri ve vmpressure sinyalleri
vmpressure
sinyalleri (bellek basıncı algılama 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
uyandırmalara ve ek bilgi işlem kaynaklarının kullanılmasına neden olur. PSI izleme sonuçlarının kullanılması, bellek basıncının daha doğru şekilde algılanmasını sağlar ve filtreleme ek yükünü en aza indirir.
PSI monitörlerini kullanma
vmpressure
etkinlikleri yerine PSI izleyicilerini kullanmak için ro.lmk.use_psi
özelliğini yapılandırın. Varsayılan değer true
olduğundan PSI, lmkd
için varsayılan bellek baskısı algılama mekanizmasıdır. PSI izleyicileri çekirdek desteği gerektirdiğinden çekirdek, PSI geri bağlantı yamalarını içermeli ve PSI desteği etkinleştirilmiş (CONFIG_PSI=y
) olarak derlenmelidir.
Çekirdek içi LMK sürücüsünün dezavantajları
Android, aşağıdakiler de dahil olmak üzere ç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 olan iş yüklerinde kötü performans gösteriyordu. Kötü performans nedeniyle disk belleği değişimi yapıldı ve hiçbir düşman öldürülmedi.
- LMK çekirdek sürücüsü, bellek baskısına göre ölçeklendirme yapmadan boş bellek sınırlarına dayanıyordu.
- Tasarımın katılığı nedeniyle iş ortakları genellikle sürücüyü cihazlarında çalışacak şekilde özelleştiriyordu.
- LMK sürücüsü, hedef arama ve hedefleri sonlandırma gibi ağır işlemler için tasarlanmamış olan slab shrinker API'sine bağlanıyordu. Bu durum,
vmscan
işlemini yavaşlatıyordu.
Userspace lmkd
Kullanıcı alanı lmkd
, çekirdek içi sürücüyle aynı işlevselliği uygular ancak bellek baskısını algılamak ve tahmin etmek için mevcut çekirdek mekanizmalarını kullanır. Bu tür mekanizmalar arasında, bellek baskısı seviyeleri hakkında bildirim almak için çekirdek tarafından oluşturulan vmpressure
etkinliklerinin veya baskı durdurma bilgisi (PSI) monitörlerinin kullanılması ve her işleme ayrılan bellek kaynaklarını işlem önemine göre sınırlamak için bellek cgroup özelliklerinin kullanılması yer alır.
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. Kullanıcı alanı lmkd
bellek cgroup'ları 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
Sonlandırma stratejileri
Kullanıcı alanı, vmpressure
etkinliklerine veya PSI
izleyicilerine, bunların ciddiyetine ve takas kullanımı gibi diğer ipuçlarına dayalı sonlandırma stratejilerini lmkd
destekler. Düşük bellekli ve yüksek performanslı cihazlar arasındaki işlem sonlandırma
stratejileri farklıdır:
- Düşük belleğe sahip cihazlarda sistem, normal çalışma modu olarak daha yüksek bellek baskısına tolerans göstermelidir.
- 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.
Kullanıcı alanı lmkd
, çekirdek içi LMK sürücüsüyle aynı stratejileri (ör. boş bellek ve dosya önbelleği eşikleri) kullanarak sonlandırma kararları verdiği 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 cihaz için lmkd
yapılandırın.
Özellik | Kullan | 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 izleyicilerini kullanın (vmpressure etkinlikleri yerine). |
true |
ro.lmk.use_minfree_levels
|
İşlem sonlandırma kararları vermek için ücretsiz bellek ve dosya önbelleği eşiklerini kullanın (yani çekirdek içi LMK sürücüsünün işlevselliğiyle eşleşir). | false
|
ro.lmk.low
|
Düşük vmpressure seviyesinde sonlandırılmaya uygun işlemler için minimum oom_adj puanı.
|
1001 (devre dışı) |
ro.lmk.medium
|
Orta vmpressure seviyesinde sonlandırılmaya uygun işlemler için minimum oom_adj puanı.
|
800 (önbelleğe alınan 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 işlem) |
ro.lmk.critical_upgrade
|
Kritik düzeye yükseltmeyi etkinleştirin. | false
|
ro.lmk.upgrade_pressure
|
Sistem çok fazla yer değiştirme işlemi yaptığından seviyenin yükseltildiği maksimum mem_pressure .
|
100 (devre dışı) |
ro.lmk.downgrade_pressure
|
Yeterli boş bellek olduğundan vmpressure
etkinliğinin yoksayıldığı minimum mem_pressure .
|
100 (devre dışı) |
ro.lmk.kill_heaviest_task
|
Uygun görevlerden herhangi birini (hızlı karar) değil, en ağır olanı (en iyi karar) sonlandırın. | false
|
ro.lmk.kill_timeout_ms
|
Başka bir öldürme işlemi yapılmayacaksa öldürme işleminden sonraki 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ı lmkd
Android 11, yeni bir sonlandırma stratejisi sunarak lmkd
iyileştirir. Sonlandırma stratejisi, Android 10'da kullanıma sunulan bellek baskısı algılama için bir PSI mekanizması kullanır. Android 11'deki lmkd
, bellek kaynaklarının kullanım düzeylerini ve bellek yetersizliğini önlemek için bellek yetersizliğini hesaba katar.
Bu sonlandırma 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 cihazlarda lmkd
için aşağıdaki çekirdek özellikleri gerekir:
- PSI yamalarını ekleyin ve PSI'yı etkinleştirin (Android ortak çekirdekleri 4.9, 4.14 ve 4.19'da geri bağlantılar mevcuttur).
- PIDFD destek yamalarını içerir (Android ortak çekirdekleri 4.9, 4.14 ve 4.19'da geri bağlantılar mevcuttur).
- Düşük RAM'li cihazlar için bellek cgroup'ları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 bellek kapatma stratejisi, aşağıdaki ayarlama düğmelerini ve varsayılanları destekler. Bu özellikler hem yüksek performanslı hem de düşük RAM'li cihazlarda çalışır.
Özellik | Kullan | 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 duraklatma eşiği. Cihaz, bellek baskısı bildirimlerini çok geç alıyorsa daha erken bildirimleri tetiklemek için bu değeri düşürün. Bellek baskısı bildirimleri gereksiz yere tetikleniyorsa cihazın gürültüye karşı hassasiyetini azaltmak için bu değeri artırın. | 70 |
200 |
ro.lmk.psi_complete_stall_ms |
Önemli bellek bildirimlerini tetiklemek için milisaniye cinsinden tam PSI duraklatma eşiği. Cihaz, kritik bellek baskısı bildirimlerini çok geç alıyorsa daha erken bildirimleri tetiklemek için bu değeri düşürün. Kritik bellek baskısı bildirimleri gereksiz yere tetikleniyorsa cihazın gürültüye karşı daha az hassas olması için bu değeri artırın. | 700 |
|
ro.lmk.thrashing_limit |
Toplam dosya destekli sayfa önbelleği boyutunun yüzdesi olarak maksimum çalışma kümesi yeniden hata sayısı. Bu değerin üzerindeki çalışma kümesi yeniden hata oluşturma sayısı, sistemin sayfa önbelleğini aşırı kullandığı anlamına gelir. Bellek kullanımı sırasında cihazın performansı etkileniyorsa değeri düşürerek bellek kullanımını sınırlayın. Cihazın performansı gereksiz yere kilitlenmeye neden olan nedenlerle düşürülüyorsa daha fazla kilitlenmeye izin vermek için değeri artırın. | 100 |
30 |
ro.lmk.thrashing_limit_decay |
Sistem, sonlandırmadan sonra bile kurtarılamadığında eşiği düşürmek için kullanılan orijinal eşiğin yüzdesi olarak ifade edilen, aşırı yüklenme eşiği düşüşü. Sürekli olarak gereksiz sonlandırmalar yapılıyorsa değeri düşürün. Bir sonlandırma işleminden sonra sürekli olarak disk belleği kullanma işlemine 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ştirilmiş bellek miktarı. Takas edilen bellek bu sınırı aştığında sistemin, takas edilebilir belleğinin büyük bir kısmını takas ettiği ve hâlâ baskı altında olduğu anlaşılır.
Bu durum, değiştirilemeyen ayırmalar bellek baskısı oluşturduğunda meydana gelebilir. Bu baskı, değiştirilebilir belleğin çoğu zaten değiştirildiği için değiştirme işlemiyle giderilemez. Varsayılan değer 100'dür. Bu değer, söz konusu kontrolü etkili bir şekilde devre dışı bırakır. Takas kullanımı yüksekken bellek baskısı sırasında cihazın performansı etkileniyorsa ve boş takas seviyesi ro.lmk.swap_free_low_percentage 'ya düşmüyorsa takas kullanımını sınırlamak için değeri düşürün. |
100 |
100 |
Aşağıdaki eski ayarlama düğmeleri de yeni sonlandırma stratejisiyle çalışır.
Özellik | Kullan | 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`, sistemi takas alanı yetersiz olarak değerlendireceği eşik olarak bu değeri kullanır. Takas alanında çok fazla yer varken `lmkd` işlemi sonlandırırsa yüzdeyi azaltın. `lmkd` sonlandırmaları çok geç gerçekleşerek OOM sonlandırmalarına izin veriyorsa 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 |