W jaki sposób zabójca OOM decyduje, który proces zabić jako pierwszy?


92

Ta odpowiedź wyjaśnia działania podejmowane przez jądro po napotkaniu sytuacji OOM na podstawie wartości sysctl vm.overcommit_memory.

Gdy overcommit_memoryjest ustawiony na 0 lub 1, overcommitjest włączony, a programy mogą przydzielać więcej pamięci, niż jest w rzeczywistości dostępne.

Co się stanie, gdy w tej sytuacji zabraknie nam pamięci? W jaki sposób zabójca OOM decyduje, który proces zabić jako pierwszy?


1
Uważam, że wartości wynoszą 1 na 2 - nie 0 i 1.
fpmurphy

Stąd serverfault.com/questions/606185/... , 0 i 1 są poprawnymi wartościami.
Rui F Ribeiro

1
Doskonały opis jest dostępny na linux-mm.org/OOM_Killer
Jarek Przygódzki

Według kernel.org/doc/Documentation/vm/overcommit-accounting 0, 1 i 2 są poprawnymi wartościami.
Derek Lewis,

Odpowiedzi:


109

Jeśli procesy zostaną wyczerpane przez pamięć w stopniu, który może zagrozić stabilności systemu, wówczas pojawia się zabójca OOM.

UWAGA: Zadaniem OOM Killera jest kontynuowanie zabijania procesów, dopóki nie zostanie zwolniona wystarczająca ilość pamięci dla płynnego funkcjonowania reszty procesu, który jądro próbuje uruchomić.

OOM Killer musi wybrać najlepsze procesy do zabicia. Najlepsze tutaj odnosi się do tego procesu, który zwolni maksymalną pamięć po zabiciu i jest również najmniej ważny dla systemu.

Podstawowym celem jest zabicie jak najmniejszej liczby procesów, które minimalizują wyrządzone szkody, a jednocześnie maksymalizują ilość uwolnionej pamięci.

Aby to ułatwić, jądro utrzymuje oom_scoredla każdego z procesów. Możesz zobaczyć oom_scorekażdy z procesów w /procsystemie plików w pidkatalogu.

$ cat /proc/10292/oom_score

Im wyższa wartość oom_scoredowolnego procesu, tym większe prawdopodobieństwo zabicia przez zabójcę OOM w sytuacji braku pamięci.

Jak OOM_Scoreoblicza się?

W zestawie łat Davida stare heurystyki złych () prawie całkowicie zniknęły. Zamiast tego obliczenia stają się prostym pytaniem, jaki procent dostępnej pamięci jest wykorzystywany przez proces. Jeśli w całym systemie brakuje pamięci, wówczas „dostępna pamięć” jest sumą całej pamięci RAM i przestrzeni wymiany dostępnej dla systemu.

Jeżeli zamiast tego sytuacja OOM jest spowodowana wyczerpaniem pamięci dozwolonej dla danego zestawu procesorów / grupy kontrolnej, wówczas „dostępna pamięć” jest całkowitą ilością przydzieloną tej grupie kontrolnej. Podobne obliczenia wykonuje się, jeśli przekroczone zostaną ograniczenia nałożone przez zasady pamięci. W każdym przypadku użycie pamięci przez proces jest uważane za sumę jego zestawu rezydentnego (liczby stron pamięci RAM, z których korzysta) i zużycia wymiany.

W wyniku tych obliczeń powstaje liczba procent razy dziesięć; proces wykorzystujący każdy bajt dostępnej pamięci będzie miał wynik 1000, podczas gdy proces bez pamięci w ogóle uzyska wynik zero. Istnieje bardzo niewiele poprawek heurystycznych w tym wyniku, ale kod wciąż odejmuje niewielką ilość (30) od wyniku procesów będących własnością root, uważając, że są one nieco bardziej wartościowe niż procesy należące do użytkownika.

Kolejną poprawką, która jest stosowana, jest dodanie wartości przechowywanej w zmiennej oom_score_adj każdego procesu, którą można dostosować za pomocą / proc. To pokrętło pozwala dostosować atrakcyjność każdego procesu do zabójcy OOM w przestrzeni użytkownika; ustawienie go na -1000 całkowicie wyłączy zabójstwa OOM, a ustawienie na +1000 jest odpowiednikiem malowania dużego celu na powiązanym procesie.

Bibliografia

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


3
Czy uprzejmość też nie odgrywa roli?
neverMind9,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.