Ответ
OOM Killer (Out-of-Memory Killer) — это механизм ядра Linux, который принудительно завершает процессы, когда система исчерпывает доступную память и своп, чтобы предотвратить полный крах. Он не выбирает процессы случайно, а по алгоритму, оценивающему "плохость" (oom_score).
Какие процессы в зоне риска:
- Процессы, потребляющие большой объём памяти. Чем больше резидентной памяти (RSS) использует процесс, тем выше его счётчик.
- Процессы, порождающие много дочерних процессов. Если дочерний процесс утекает по памяти, OOM Killer может убить родителя.
- Процессы с низким значением
oom_score_adj. Это параметр, который можно задать для увеличения или уменьшения вероятности быть убитым. По умолчанию у критичных системных процессов (например,systemd) он отрицательный. - Процессы, запущенные от непривилегированного пользователя. У процессов root обычно меньше шансов быть убитыми.
Практика в DevOps:
- Мониторинг: Логи OOM Killer можно найти в
dmesgили/var/log/kern.log. Сообщение будет содержатьOut of memory: Killed process. - Защита критичных процессов: Для важных сервисов (базы данных, очереди) можно понизить
oom_score_adj.# Защитить процесс с PID 1234 от OOM Killer echo -1000 > /proc/1234/oom_score_adj - Профилактика: Основной метод — настройка лимитов памяти.
- В Docker: Использовать флаги
--memoryи--memory-reservation.docker run --memory="512m" --memory-reservation="256m" my-app - На уровне системы: Использование cgroups (Control Groups) для ограничения памяти, выделяемой группе процессов.
- В Docker: Использовать флаги
- Настройка ядра: Параметры
vm.overcommit_memoryиvm.panic_on_oomвлияют на поведение при нехватке памяти.