Что важнее для OOM-killer: потребление памяти процессом или его приоритет?

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

Ответ

Приоритет процесса является определяющим фактором. OOM-killer в Linux при выборе жертвы руководствуется значением oom_score каждого процесса. Этот балл рассчитывается на основе двух ключевых параметров:

  1. oom_score_adj (приоритет): Это управляемый пользователем параметр от -1000 до 1000. Чем он ниже, тем меньше шансов, что процесс будет убит. Это главный рычаг влияния.
  2. Потребление памяти: Процент используемой процессом физической памяти. Это вторичный фактор, который учитывается внутри своего «весового класса», заданного oom_score_adj.

Практический пример: Допустим, у нас есть критичная база данных (PID 1234) и кэширующий процесс. Чтобы защитить БД, я явно понижу её oom_score_adj:

echo -100 > /proc/1234/oom_score_adj

Теперь, даже если БД потребляет много памяти, её oom_score будет низким. OOM-killer сначала убьёт другие процессы с более высоким oom_score_adj, даже если они используют меньше памяти.

Важный нюанс: Процесс с oom_score_adj = -1000 никогда не будет убит OOM-killer'ом. Однако, если система абсолютно исчерпает память и не сможет даже обслужить самого киллера, ядро может вызвать панику.