OOM katili hangi süreci ilk önce öldüreceğine nasıl karar veriyor?


92

Bu cevap, OOM durumuna karşılık geldiğinde, çekirdek tarafından yapılan eylemleri açıklar sysctl vm.overcommit_memory.

Ne zaman overcommit_memory0 veya 1 olarak ayarlanmıştır, overcommitetkindir ve programlar gerçekten mevcut olandan daha fazla bellek ayırmaya izin verilir.

Şimdi bu durumda hafızamız tükenirse ne olur? OOM katili hangi süreci ilk önce öldüreceğine nasıl karar veriyor?


1
Değerlerin 1 2 - 0 ve 1 olmadığına inanıyorum.
fpmurphy

Burada serverfault.com/questions/606185/… , 0 ve 1 doğru değerlerdir.
Rui F Ribeiro

1
Mevcut mükemmel bir tanım yoktur linux-mm.org/OOM_Killer
Jarek Przygodzki

Göre kernel.org/doc/Documentation/vm/overcommit-accounting 0, 1, ve 2 tüm geçerli değerlerdir.
Derek Lewis,

Yanıtlar:


109

Bellek, işlemler tarafından, sistemin kararlılığını tehdit edebilecek ölçüde ayrıntılı bir şekilde kullanılmışsa, OOM katili resmin içine girer.

NOT: Çekirdeğin çalıştırmaya çalıştığı işlemin geri kalanının düzgün çalışması için yeterli bellek serbest bırakılıncaya kadar öldürme işlemlerine devam etmek OOM Katilinin görevidir.

OOM Killer, öldürmek için en iyi süreci seçmek zorundadır . Burada en iyisi , öldürme sırasında maksimum belleği boşaltacak olan ve aynı zamanda sistem için en az önem taşıyan işlemi ifade eder.

Birincil hedef, yapılan hasarı en aza indiren ve aynı zamanda boş kalan bellek miktarını en yükseğe çıkaran en az sayıda işlemi öldürmektir.

Bunu kolaylaştırmak için, çekirdek oom_scoreişlemlerin her biri için bir tutar . Görebilirsiniz oom_scoresüreçlerin her birinin /procaltında dosya sistemi piddizininde.

$ cat /proc/10292/oom_score

oom_scoreHerhangi bir işlemin değeri ne kadar yüksek olursa, bellek dışı bir durumda OOM Katili tarafından öldürülme olasılığı da o kadar yüksek olur .

Nasıl OOM_Scorehesaplanır?

David'in yama setinde eski kötülük () buluşma neredeyse tamamen ortadan kalktı. Bunun yerine hesaplama, mevcut belleğin yüzde kaçının işlem tarafından kullanıldığına dair basit bir soruya dönüşür. Eğer sistemin bir bütün olarak hafızası yetersiz ise, o zaman "mevcut hafıza" sistem için mevcut olan tüm RAM ve takas alanlarının toplamıdır.

Bunun yerine, OOM durumuna belirli bir cpuset / kontrol grubuna izin verilen hafızanın tüketilmesi neden olmuşsa, o zaman "kullanılabilir hafıza" bu kontrol grubuna tahsis edilen toplam tutardır. Bir hafıza politikası tarafından getirilen sınırların aşılması durumunda da benzer bir hesaplama yapılır. Her durumda, sürecin bellek kullanımı, yerleşik setinin (kullandığı RAM sayfalarının sayısı) ve takas kullanımının toplamı olarak kabul edilir.

Bu hesaplama sonuç olarak yüzde-on sayı üretir; Kullanılabilir hafızanın her baytını kullanan bir işlem 1000 puan alırken, hafızanın hiç kullanılmadığı bir işlem sıfır puan alır. Bu puan için çok az sayıda sezgisel tweaks var, ancak kod, kullanıcının sahip olduğu işlemlerden biraz daha değerli olduğu düşüncesiyle, hala kök işlemlere ait puandan küçük bir miktar (30) çıkartıyor.

Uygulanan bir başka ince ayar, her işlemin oom_score_adj değişkeninde depolanan değeri / proc ile ayarlanabilen değer eklemektir. Bu düğme, her bir işlemin kullanıcı alanındaki OOM katiline çekiciliğinin ayarlanmasını sağlar; -1000 olarak ayarlamak, OOM ölümlerini tamamen devre dışı bırakırken, +1000 olarak ayarlamak ilişkili süreçte büyük bir hedefi boyamakla eşdeğerdir.

Referanslar

http://www.queryhome.com/15491/whats-happening-kernel-starting-killer-choose-which-process https://serverfault.com/a/571326


3
Güzelliğin de bir rolü yok mu?
AslaMind9
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.