Как Linux выбирает, какой из процессов нужно завершить при нехватке памяти

«Как Linux выбирает, какой из процессов нужно завершить при нехватке памяти» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Когда система исчерпывает доступную физическую память и пространство подкачки (swap), активируется Out-Of-Memory (OOM) Killer — компонент ядра Linux, который принудительно завершает процесс(-ы), чтобы освободить память и предотвратить крах всей системы.

Алгоритм выбора жертвы: OOM Killer оценивает каждый процесс и присваивает ему «оценку плохости» (oom_score). Процесс с наибольшей оценкой будет завершён. Оценка рассчитывается на основе:

  1. Использование памяти: Основной фактор. Учитывается резидентный набор (RSS), размер стека, размер таблиц страниц и память, используемая потомками. Чем больше памяти потребляет процесс, тем выше его oom_score.
  2. Корректировка оценочного балла (oom_score_adj): Это значение от -1000 до 1000, которое администратор или родительский процесс могут задать для тонкой настройки приоритета завершения. Положительное значение увеличивает шансы быть убитым, отрицательное — уменьшает.
    • -1000 означает «никогда не убивать этот процесс».
    • Значение по умолчанию для большинства процессов — 0.
  3. Прочие эвристики: Предпочтение отдаётся процессам, использующим много памяти в течение долгого времени, процессам, запущенным от 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.