Что такое OOM (Out Of Memory) в Linux?

«Что такое OOM (Out Of Memory) в Linux?» — вопрос из категории Linux, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

OOM (Out Of Memory) — это состояние, когда ядро Linux не может удовлетворить запрос на выделение памяти, и все доступная оперативная память (RAM) и swap исчерпаны.

Что происходит при OOM? Ядро активирует OOM Killer, который по своему алгоритму выбирает и принудительно завершает один или несколько процессов (SIGKILL), чтобы освободить память и стабилизировать систему.

Практическая работа с OOM:

  • Проверить настройки overcommit:
    sysctl vm.overcommit_memory
    cat /proc/sys/vm/overcommit_memory
  • Посмотреть текущие оценки процессов: Можно увидеть, какие процессы являются первыми кандидатами на завершение.
    # Вывести список процессов с их oom_score (чем выше, тем вероятнее завершение)
    for proc in /proc/[0-9]*/; do pid=$(basename $proc); if [ -f "$proc/oom_score" ]; then printf "PID: %5s Score: %5s Adj: %5s Cmd: " $pid $(cat $proc/oom_score) $(cat $proc/oom_score_adj 2>/dev/null); cat $proc/cmdline; echo; fi; done | sort -k3 -rn | head -20

Основные причины OOM в DevOps-практике:

  1. Утечки памяти в приложениях.
  2. Некорректные или отсутствующие лимиты памяти для контейнеров. Например, контейнер без -m в Docker может занять всю память хоста.
  3. Недостаточный мониторинг. Система достигает предела до того, как сработают алерты.
  4. Неправильная настройка vm.overcommit_memory. Значение 1 (always overcommit) может отложить, но усугубить проблему.

Профилактика: Помимо настройки oom_score_adj для критичных сервисов, ключевая задача — внедрение лимитов (cgroups) и активного мониторинга с помощью таких инструментов, как node_exporter для Prometheus.