Ответ
OOM Killer (Out-of-Memory Killer) — это механизм ядра Linux, который принудительно завершает процессы в ситуации исчерпания оперативной памяти (OOM), чтобы предотвратить полный крах системы.
Как он выбирает "жертву"? Алгоритм основывается на оценке oom_score для каждого процесса. Чем выше оценка, тем выше вероятность завершения. На неё влияют:
- Объем потребляемой памяти.
- Приоритет процесса (
oom_score_adj). - Время работы процесса.
- Привилегии пользователя.
Практический пример настройки: Чтобы защитить критически важный процесс (например, базу данных), можно понизить его oom_score.
# Узнаем PID процесса
pgrep postgres
# Защищаем процесс от OOM Killer, установив минимальный корректирующий коэффициент
echo -1000 > /proc/$(pgrep postgres)/oom_score_adj
# Проверяем текущий oom_score
cat /proc/$(pgrep postgres)/oom_score
Мониторинг и диагностика: После инцидента OOM проверьте логи ядра.
# Поиск записей об OOM в логах ядра
dmesg -T | grep -i "killed process"
# Или в системном журнале
journalctl --since "2 hours ago" | grep -i oom
Профилактика в DevOps-контексте:
- Настройка политики overcommit: Параметр
vm.overcommit_memory(0 – эвристическая, 1 – всегда, 2 – не превышать сумму RAM + swap). Для предсказуемости в продакшене часто используют2. - Управление памятью в контейнерах: Всегда задавайте лимиты памяти (
-m,--memory-reservation) в Docker/Kubernetes, чтобы контейнер не мог исчерпать память хоста. - Адекватный размер swap: Наличие swap-раздела даёт системе буфер и время для реакции, хотя и снижает производительность.
- Мониторинг: Используйте Prometheus с Alertmanager для отслеживания использования памяти и прогнозирования OOM.