Jak korzystać z oom_score_adj?

24

11.04 /proc/[pid]zawiera oom_score_adj, ale man procopisuje stare oom_adj. Bezskutecznie szukałem informacji o tym, jak z tego korzystać.

Muszę ustalić, że procesy zapoczątkowane przez „pbs” lub „gridengine” są zabijane, zanim cokolwiek innego zostanie zabite. Jak mogę to zrobić?

bmargulies
źródło
Aby na stałe wprowadzić tę zmianę dla usług zarządzanych przez Upstart: Jak na stałe ustawić korekty zabójcy OOM dla demonów? .
gertvdijk
To już odpowiedź. Odsyła do tego. :)
gertvdijk
Ale nie na tej stronie :-)
bmargulies

Odpowiedzi:

13

Oparty na moich własnych pytaniach i odpowiedziach na Unix i Linux na podobne pytanie.

Jak Stuart bardzo dobrze wskazał w swojej odpowiedzi , prawidłowe wartości to liczby całkowite z zakresu od -1000 do 1000 dla oom_score_adj. Im niższa wartość, tym mniejsza szansa, że ​​zostanie zabita.

Bardzo niewygodne jest zmienianie tej wartości raz po raz po ponownym uruchomieniu aplikacji. Informacje są po prostu tracone po zakończeniu procesu. Upstart (demon init w Ubuntu), ma fajną opcję do skonfigurowania demonów, aby upewnić się, że jest ustawiony za każdym razem, gdy (ponownie) się uruchomi:

oom score

[...] snip [...]

Przykład:

# this application is a "resource hog"
oom score 1000

expect daemon
respawn
exec /usr/bin/leaky-app

Zasadniczo możesz więc edytować /etc/init/myservice.confplik konfiguracyjny dla usług, które chcesz zmienić, aby uwzględnić linię oom score -1000. Zakładam, że usługi „pbs” lub „gridengine”, o których mówisz w swoim pytaniu, obsługują Upstart, w przeciwnym razie będziesz potrzebować innego sposobu, aby to zmienić na stałe.

gertvdijk
źródło
7

Jeśli możesz zmodyfikować skrypt startowy spawnujący proces, który chcesz ustawić jako priorytet dla oom-killera, dodaj do skryptu startowego następujące elementy:

echo 1000 > /proc/self/oom_score_adj

Wartość jest dziedziczona dla procesów potomnych.

użytkownik1338062
źródło
6

Jeśli ustawisz wysoką (ish) wartość dla oom_adj lub oom_score_adj, zostaną one zabite jako pierwsze. na przykład

echo 15 > /proc/[pid]/oom_adj

oom_adj zmienia się z -16 na 15 i jak wspomniano powyżej oom_score_adj akceptuje -1000 do 1000

Stuart
źródło
Aby to zrobić, musisz być rootem. sudo sh -c "echo -1000 > /proc/[PID]/oom_score_adj"
Adil
2
W rzeczywistości możesz zwiększyć wynik dla swoich procesów bez korzenia („tak, to może zostać zabity przez zagładę”). Zmniejszenie (poniżej 0) wymaga rootowania.
Piskvor
5

Sprawdzanie kodu jest zawsze dobrym pomysłem. Zwykle używam funkcji wyszukiwania kernel.org, ale obecnie nie działa. Github też wykonuje dobrą robotę. Znalazłem to:

Zamiast tego dodaje się nowy przestrajalny, / proc / pid / oom_score_adj, który zawiera się w przedziale od -1000 do +1000. Można go wykorzystać do spolaryzowania heurystyki, tak że niektóre zadania nigdy nie są brane pod uwagę przy zabijaniu ofiar, podczas gdy inne zawsze mogą być brane pod uwagę. Wartość jest dodawana bezpośrednio do wyniku badness (), więc wartość -500, na przykład, oznacza zdyskontowanie 50% zużycia pamięci w porównaniu z innymi zadaniami w systemie, związanym z mempolicy, w procesorze lub współużytkowanie tego samego kontrolera pamięci.

Od https://github.com/mirrors/linux-2.6/commit/a63d83f427fbce97a6cea0db2e64b0eb8435cd10#include/linux/oom.h

falstaff
źródło
DZIĘKUJEMY za wskaźnik, ale mam nadzieję, że ktoś przejedzie obok i nakręci przepis na cały problem, który wydaje się organizować ustawienie tej wartości dla demona exec pbs, zanim rozwiąże jakiekolwiek zadania.
bmargulies