Page tree

OOM Killer — механизм ядра Linux, который при исчерпании доступной памяти принудительно завершает отдельные процессы на сервере для освобождения RAM. Освободившаяся память передается ядру ОС, а после перенаправляется тому процессу, которому ее было недостаточно.

OOM Killer использует определенный набор правил для выбора процесса, который нужно "убить". В целом, в первую очередь будут завершены недавно запущенные пользовательские процессы, которые требуют большого объема памяти и/или имеют множество дочерних процессов; в последнюю очередь будут завершаться системные процессы пользователя root, запущенные значительное время назад.

В связи с тем, что OOM killer "убивает" процессы с помощью SIGKILL, что не дает возможности корректного завершения процессов, сохранения данных и пр., частое срабатывание этого механизма может приводить к серьезным последствиям в работе системе. 

Что делать при срабатывании OOM killer

  • Если вы замечаете такое поведение только при больших нагрузках, например, при проведении работ по оптимизации сервера и др., можно временно отключить антивирусное ПО. Это позволит освободить до нескольких сотен мегабайт оперативной памяти, чтобы необходимые процессы были успешно выполнены. Разумеется, это снижает безопасность вашего сервера, поэтому рекомендуется использовать этот вариант только в качестве временной меры. 
  • Если OOM killer срабатывает регулярно, необходимо проанализировать работу сервера, баз данных, сайтов и провести оптимизацию, чтобы устранить причину проблемы.
  • Если сервер оптимизирован, но памяти постоянно не хватает, увеличьте ее объем или перейдите на тариф с большим количеством RAM (см. Конфигурация VDS).
  • Также есть возможность установить приоритет определенному процессу, чтобы запретить OOM killer его завершать. Значение приоритета хранится в файле /proc/$PID/oom_adj, который создается при запуске каждого процесса. Для установки приоритета необходимо узнать PID конкретного процесса, после чего воспользоваться командой:
echo -17 > /proc/PID_процесса/oom_adj

Можно использовать название процесса; на примере sshd:

pgrep -f "/usr/sbin/sshd" | while read PID; do echo -17 > /proc/$PID/oom_adj; done

Устанавливаемый приоритет в данном случае — -17. Более безопасный вариант - использовать приоритет -15. В этом случае процесс будет одним из последних, которые OOM killer завершит, но при этом отсутствует полный запрет на завершение, который в критических ситуациях может привести к kernel panic.

  • No labels