Ответ
OOM (Out Of Memory) — это состояние, когда ядро Linux не может удовлетворить запрос на выделение памяти, и все доступная оперативная память (RAM) и swap исчерпаны.
Что происходит при OOM? Ядро активирует OOM Killer, который по своему алгоритму выбирает и принудительно завершает один или несколько процессов (SIGKILL), чтобы освободить память и стабилизировать систему.
Практическая работа с OOM:
- Проверить настройки overcommit:
sysctl vm.overcommit_memory cat /proc/sys/vm/overcommit_memory - Посмотреть текущие оценки процессов: Можно увидеть, какие процессы являются первыми кандидатами на завершение.
# Вывести список процессов с их oom_score (чем выше, тем вероятнее завершение) for proc in /proc/[0-9]*/; do pid=$(basename $proc); if [ -f "$proc/oom_score" ]; then printf "PID: %5s Score: %5s Adj: %5s Cmd: " $pid $(cat $proc/oom_score) $(cat $proc/oom_score_adj 2>/dev/null); cat $proc/cmdline; echo; fi; done | sort -k3 -rn | head -20
Основные причины OOM в DevOps-практике:
- Утечки памяти в приложениях.
- Некорректные или отсутствующие лимиты памяти для контейнеров. Например, контейнер без
-mв Docker может занять всю память хоста. - Недостаточный мониторинг. Система достигает предела до того, как сработают алерты.
- Неправильная настройка
vm.overcommit_memory. Значение1(always overcommit) может отложить, но усугубить проблему.
Профилактика: Помимо настройки oom_score_adj для критичных сервисов, ключевая задача — внедрение лимитов (cgroups) и активного мониторинга с помощью таких инструментов, как node_exporter для Prometheus.