Planetahost VPS
Перейти к основному контенту

Кто убил мой сайт? Разбираемся с OOM Killer в Linux

intro-who-omm-killer-linux-planetahost.png

Введение

Иногда владельцы VPS сталкиваются со странной ситуацией:

  • сайт внезапно перестаёт открываться;

  • база данных отключается;

  • панель управления становится недоступна;

  • сервер начинает сильно тормозить;

  • отдельные приложения неожиданно завершаются.

При этом сам VPS продолжает работать и даже отвечает по SSH.

Во многих случаях причиной оказывается OOM Killer (Out Of Memory Killer) - это встроенный механизм ядра Linux, который автоматически завершает процессы при критической нехватке оперативной памяти.


Зачем нужен OOM Killer

Когда системе перестаёт хватать памяти, она оказывается в опасном состоянии.

Если не принять меры:

  • новые процессы не смогут запускаться;

  • приложения начнут зависать;

  • ядро может потерять стабильность;

  • сервер станет полностью недоступен.

Чтобы избежать полного зависания системы, Linux выбирает один или несколько процессов и принудительно завершает их для освобождения памяти. Именно этим занимается OOM Killer.


Проверяем наличие событий OOM

Если сервер не отвечает на запросы SSH, то можно подключится по VNC/IPMI и посмотреть, что происходит на экране. Если сработка была, то на экране будет предупреждение:

изображение.png

Если доступ к SSH есть, но все жутко тормозит, то смотрим логи.

Для современных систем

journalctl -k | grep -i oom

Либо:

journalctl -k | grep -i "killed process"

Пример вывода:

изображение.png

Это сообщение из лога ядра Linux означает, что OOM Killer сработал и принудительно завершил процесс, потому что системе не хватало оперативной памяти:

  • Out of memory - ядро обнаружило критическую нехватку памяти.

  • Killed process 1005 - уничтожен процесс с PID 1005.

  • (stress-ng-vm) - имя процесса. Это стандартный инструмент для стресс-тестирования памяти (часть пакета stress-ng). Он специально потребляет память, чтобы спровоцировать OOM.


Для старых систем

dmesg | grep -i oom

или

dmesg | grep -i "killed process"