Какие процессы убивает OOM Killer в Linux?

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

Ответ

OOM Killer (Out-of-Memory Killer) — это механизм ядра Linux, который принудительно завершает процессы, когда система исчерпывает доступную память и своп, чтобы предотвратить полный крах. Он не выбирает процессы случайно, а по алгоритму, оценивающему "плохость" (oom_score).

Какие процессы в зоне риска:

  1. Процессы, потребляющие большой объём памяти. Чем больше резидентной памяти (RSS) использует процесс, тем выше его счётчик.
  2. Процессы, порождающие много дочерних процессов. Если дочерний процесс утекает по памяти, OOM Killer может убить родителя.
  3. Процессы с низким значением oom_score_adj. Это параметр, который можно задать для увеличения или уменьшения вероятности быть убитым. По умолчанию у критичных системных процессов (например, systemd) он отрицательный.
  4. Процессы, запущенные от непривилегированного пользователя. У процессов root обычно меньше шансов быть убитыми.

Практика в DevOps:

  • Мониторинг: Логи OOM Killer можно найти в dmesg или /var/log/kern.log. Сообщение будет содержать Out of memory: Killed process.
  • Защита критичных процессов: Для важных сервисов (базы данных, очереди) можно понизить oom_score_adj.
    # Защитить процесс с PID 1234 от OOM Killer
    echo -1000 > /proc/1234/oom_score_adj
  • Профилактика: Основной метод — настройка лимитов памяти.
    • В Docker: Использовать флаги --memory и --memory-reservation.
      docker run --memory="512m" --memory-reservation="256m" my-app
    • На уровне системы: Использование cgroups (Control Groups) для ограничения памяти, выделяемой группе процессов.
  • Настройка ядра: Параметры vm.overcommit_memory и vm.panic_on_oom влияют на поведение при нехватке памяти.