Ответ
Когда система исчерпывает доступную физическую память и пространство подкачки (swap), активируется Out-Of-Memory (OOM) Killer — компонент ядра Linux, который принудительно завершает процесс(-ы), чтобы освободить память и предотвратить крах всей системы.
Алгоритм выбора жертвы: OOM Killer оценивает каждый процесс и присваивает ему «оценку плохости» (oom_score). Процесс с наибольшей оценкой будет завершён. Оценка рассчитывается на основе:
- Использование памяти: Основной фактор. Учитывается резидентный набор (RSS), размер стека, размер таблиц страниц и память, используемая потомками. Чем больше памяти потребляет процесс, тем выше его
oom_score. - Корректировка оценочного балла (oom_score_adj): Это значение от -1000 до 1000, которое администратор или родительский процесс могут задать для тонкой настройки приоритета завершения. Положительное значение увеличивает шансы быть убитым, отрицательное — уменьшает.
-1000означает «никогда не убивать этот процесс».- Значение по умолчанию для большинства процессов — 0.
- Прочие эвристики: Предпочтение отдаётся процессам, использующим много памяти в течение долгого времени, процессам, запущенным от root, и процессам, непосредственно выполняющим работу пользователя (в отличие от системных демонов).
Практическое управление:
# Посмотреть текущий oom_score и oom_score_adj для процесса
cat /proc/<PID>/oom_score
cat /proc/<PID>/oom_score_adj
# Защитить критичный процесс (например, SSH-демон) от OOM Killer
echo -1000 > /proc/$(pidof sshd)/oom_score_adj
# Указать, что процесс можно убить в первую очередь
echo 1000 > /proc/<PID>/oom_score_adj
Важно: OOM Killer — это крайняя мера. В правильно настроенной системе ему должна предшествовать агрессивная очистка кэша страниц и активное использование swap. Настройка параметра vm.swappiness и мониторинг памяти с помощью инструментов вроде prometheus/alertmanager помогают предотвращать срабатывание OOM Killer.