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 üzeri, 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 (çekirdek tarafından bellek basıncı tespiti için 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 kullanın
Android 9 ve üzeri sürümlerde, ç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, ç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ır
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 seviyeye 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 basıncı 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 bildirimleri daha erken tetiklemek 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 |