Tato odpověď vysvětluje akce provedené jádrem, když dojde k situaci OOM, na základě hodnoty sysctl vm.overcommit_memory
.
Když overcommit_memory
je nastaven na 0 nebo 1, overcommit
je povoleno a programy mohou alokovat více paměti, než je skutečně dostupné.
Co se teď stane, když nám v této situaci dojde paměť? Jak funguje OOM zabiják rozhodnout, který proces zabít jako první?
Přijatá odpověď:
Pokud je paměť vyčerpávajícím způsobem spotřebována procesy do té míry, která může případně ohrozit stabilitu systému, přichází na řadu zabiják OOM.
POZNÁMKA: Úkolem OOM Killeru je pokračovat v zabíjení procesů, dokud se neuvolní dostatek paměti pro hladké fungování zbytku procesu, který se jádro pokouší spustit.
OOM Killer musí vybrat nejlepší proces(y) zabít. Nejlepší zde se odkazuje na proces, který při zabíjení uvolní maximum paměti a je také pro systém nejméně důležitý.
Primárním cílem je zabít co nejmenší počet procesů, což minimalizuje způsobené škody a zároveň maximalizuje množství uvolněné paměti.
Aby to bylo usnadněno, jádro udržuje oom_score
pro každý z procesů. Můžete vidět oom_score
každého z procesů v /proc
souborový systém pod pid
adresář.
$ cat /proc/10292/oom_score
Čím vyšší je hodnota oom_score
jakéhokoli procesu, tím vyšší je pravděpodobnost, že bude zabit OOM Killerem v situaci nedostatku paměti.
Jak je na tom OOM_Score
vypočítané?
V Davidově sadě patchů jsou staré heuristiky badness() téměř úplně
pryč. Místo toho se výpočet změní na jednoduchou otázku, jaké
procento dostupné paměti proces využívá. Pokud
má systém jako celek nedostatek paměti, pak „dostupná paměť“ je
součet veškeré paměti RAM a odkládacího prostoru, které má systém k dispozici.Pokud je místo toho situace OOM způsobena vyčerpáním paměti povolené
dané cpuset/kontrolní skupině, pak „dostupná paměť“ je celkové
množství přidělené této kontrolní skupině. Podobný výpočet se provede
, pokud byly překročeny limity stanovené zásadou paměti. V každém případě se
za využití paměti procesem považuje součet jeho rezidentní
sady (počet stránek RAM, které používá) a využití swapu.Výsledkem tohoto výpočtu je číslo procento krát deset;
proces, který využívá každý bajt paměti, kterou má k dispozici, bude
mít skóre 1 000, zatímco proces, který vůbec nepoužívá paměť, dostane
skóre nula. V tomto skóre je jen velmi málo heuristických úprav,
ale kód stále odečítá malé množství (30) od skóre
procesů vlastněných rootem na základě představy, že jsou o něco více
hodnotnější než procesy vlastněné uživateli.Jedním dalším vylepšením, které se použije, je přidání hodnoty uložené v proměnné oom_score_adj každého
procesu, kterou lze upravit pomocí /proc.
Tento knoflík umožňuje upravit atraktivitu každého procesu
OOM zabiják v uživatelském prostoru; nastavení na -1000 zcela deaktivuje zabíjení OOM
, zatímco nastavení na +1000 je ekvivalentem malování
velkého cíle na přidružený proces.
Odkazy
Související:Nevýhoda při použití chrootu ve vysoce výkonných počítačích?http://www.queryhome.com/15491/whats-happening-kernel-starting-killer-choose-which-process https://serverfault.com/a/571326