Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
oom_reaper / oom_badness score limit Linux / DevOps

Out of Memory: Kill process (oom_reaper / badness score) — Тюнинг OOM Killer

Обновлено: 18.08.2026  ·  Официальная база знаний

Архитектура ошибки и симптомы сбоя

Событие «Out of Memory: Kill process (oom_reaper / oom_badness score limit)» не является прямой паникой ядра, но представляет собой критический аварийный инцидент. При полном исчерпании доступной оперативной памяти алгоритм oom_badness() вычисляет процесс с наивысшим баллом потребления ресурсов и отправляет ему сигнал SIGKILL (9). Асинхронный поток oom_reaper мгновенно освобождает структуры памяти убитого процесса.

Диагностическая таблица параметров сбоя

ПараметрЗначениеИнженерный смысл сбоя
oom_score0 — 1000Текущий балл уязвимости процесса (чем выше, тем вероятнее процесс будет убит).
oom_score_adj-1000 — 1000Корректирующий коэффициент, задаваемый администратором вручную.
oom_reaperKernel 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=80
OOM Killer убивает СУБД в разгар рабочего дня?
ITSTM проведет профилирование запросов, оптимизирует буферные пулы (shared_buffers / innodb_buffer_pool) и настроит надежный мониторинг утилизации памяти.
Практический опыт инженера: При настройке vm.overcommit_memory=2 всегда следите, чтобы размер Swap был равен или превышал объем физической RAM, иначе система не сможет выделить память под новые процессы.

Частые вопросы (FAQ)

По какой формуле рассчитывается oom_badness score?

Формула оценивает объем используемой процессом физической памяти (RSS), страницы подкачки (Swap) и корректируется значением /proc/[pid]/oom_score_adj. Дополнительно учитываются привилегии root (снижают балл).

Почему OOM Killer убивает не тот процесс, который вызвал утечку?

OOM Killer выбирает процесс, освобождение которого даст максимальный объем свободной памяти при минимальном ущербе для системы. Жертвой часто становится база данных (занимающая 80% RAM), хотя утечку вызвал маленький фоновый скрипт.