Out of Memory: Kill process (oom_reaper / badness score) — Тюнинг OOM Killer
Архитектура ошибки и симптомы сбоя
Событие «Out of Memory: Kill process (oom_reaper / oom_badness score limit)» не является прямой паникой ядра, но представляет собой критический аварийный инцидент. При полном исчерпании доступной оперативной памяти алгоритм oom_badness() вычисляет процесс с наивысшим баллом потребления ресурсов и отправляет ему сигнал SIGKILL (9). Асинхронный поток oom_reaper мгновенно освобождает структуры памяти убитого процесса.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| oom_score | 0 — 1000 | Текущий балл уязвимости процесса (чем выше, тем вероятнее процесс будет убит). |
| oom_score_adj | -1000 — 1000 | Корректирующий коэффициент, задаваемый администратором вручную. |
| oom_reaper | Kernel Thread | Поток ядра, ускоряющий освобождение анонимной памяти завершенного процесса. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Защита критического процесса от убийства (1C / PostgreSQL / MySQL)
Установите наивысший приоритет защиты для сервиса через systemd-юнит:
# Внесите правки в юнит (например, /etc/systemd/system/mysqld.service.d/override.conf):
[Service]
OOMScoreAdjust=-1000
# Применение настроек:
sudo systemctl daemon-reload
sudo systemctl restart mysqldСценарий 2: Аудит процессов с наивысшим OOM Score
Проверьте текущие баллы всех запущенных процессов в системе:
# Однострочник для вывода ТОП процессов по OOM Score:
printf '%-8s %-6s %-20s %s\n' "PID" "SCORE" "NAME" "COMMAND"
for p in /proc/[0-9]*; do
pid=$(basename "$p")
if [ -f "$p/oom_score" ]; then
score=$(cat "$p/oom_score")
name=$(cat "$p/comm")
printf '%-8s %-6s %-20s\n' "$pid" "$score" "$name"
fi
done | sort -k2 -nr | head -n 15Сценарий 3: Настройка политики Overcommit Memory
# Запрет чрезмерного перевыделения памяти (для строгих серверов баз данных):
sudo sysctl -w vm.overcommit_memory=2
sudo sysctl -w vm.overcommit_ratio=80ITSTM проведет профилирование запросов, оптимизирует буферные пулы (shared_buffers / innodb_buffer_pool) и настроит надежный мониторинг утилизации памяти.
Частые вопросы (FAQ)
По какой формуле рассчитывается oom_badness score?
Формула оценивает объем используемой процессом физической памяти (RSS), страницы подкачки (Swap) и корректируется значением /proc/[pid]/oom_score_adj. Дополнительно учитываются привилегии root (снижают балл).
Почему OOM Killer убивает не тот процесс, который вызвал утечку?
OOM Killer выбирает процесс, освобождение которого даст максимальный объем свободной памяти при минимальном ущербе для системы. Жертвой часто становится база данных (занимающая 80% RAM), хотя утечку вызвал маленький фоновый скрипт.