Когда в Linux заканчивается оперативная память, система стоит перед критическим выбором: зависнуть полностью или пожертвовать одним из процессов, чтобы выжить. За это жёсткое, но необходимое решение отвечает механизм OOM Killer (Out-of-Memory Killer).

Он не убивает процессы случайно. Вместо этого для каждого вычисляется "рейтинг плохости". Процесс с наивысшим рейтингом признаётся наименее важным и подлежит уничтожению. В расчёте участвуют почти все процессы, кроме init и потоков ядра (kernel threads).

Мы не будем вдаваться сейчас в детали реализации этого механизма - об этом написано уже множество статей. Вместо этого мы сразу посмотрим на сервере какой рейтинг у каждого процесса с помощью однострочника:

for p in /proc/[0-9]*; do pid=${p##*/}; [ -r $p/oom_score ] && printf "%4s %5s %8s %s\n" "$(cat $p/oom_score 2>/dev/null)" "$(cat $p/oom_score_adj 2>/dev/null)" "$pid" "$(cat $p/comm 2>/dev/null)"; done | sort -nr | column -t

Нам интересны 1 и 3 колонки, в которых oom_score и PID соответственно. Наш вывод говорит что, если придет oom kill, то первый “на вылет” fail2ban-server. 

700  0      131351  fail2ban-server
693  0      1254    node
692  0      131649  fwupd

А теперь самое интересное...На самом деле можно принудительно вызывать oom killer командой:

$ sudo echo f > /proc/sysrq-trigger

$ sudo dmesg

[114247.906865] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/system.slice/fail2ban.service,task=fail2ban-server,pid=131351,uid=0

[114247.906966] Out of memory: Killed process 131351 (fail2ban-server) total-vm:886820kB, anon-rss:19928kB, file-rss:30592kB, shmem-rss:0kB, UID:0 pgtables:628kB oom_score_adj:0

Совпадение это или нет мы не знаем. Но я почти уверен, что 10 лет назад один из контибьютов в ядро Linux (mchehab) сделал отсылку к Call Of Duty намеренно. ?

Так что [PRESS F TO PAY RESPECTS] как говорится...

_________________

Хватит читать DevOps-статьи от людей без продакшена. Я рассказываю про свой реальный опыт в своем Telegram-канале DevOps Brain ? ↩

Комментарии (1)