Как защитить критически важный процесс от OOM Killer в Linux?

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

Ответ

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

Основной метод: настройка oom_score_adj.

Значение oom_score_adj может быть от -1000 (никогда не убивать) до +1000 (убить в первую очередь). Для защиты процесса:

# Устанавливаю максимальный отрицательный приоритет для существующего процесса
echo -1000 | sudo tee /proc/<PID>/oom_score_adj

# Для демона, управляемого systemd, добавляю настройку в юнит-файл
sudo systemctl edit my-critical-service

Содержимое файла override для systemd:

[Service]
OOMScoreAdjust=-1000

Для Docker-контейнеров:

docker run --name my-db --oom-score-adj -1000 -d postgres:15

Для Kubernetes Pod:

apiVersion: v1
kind: Pod
metadata:
  name: critical-app
spec:
  containers:
  - name: app
    image: myapp:latest
    resources:
      requests:
        memory: "512Mi"
      limits:
        memory: "1Gi"
    securityContext:
      # Задаёт низкий приоритет для OOM Killer
      oomScoreAdj: -1000

Важные замечания:

  • Это не отменяет лимиты памяти. Процесс всё равно не сможет использовать больше памяти, чем доступно системе или разрешено cgroup.
  • Защита одного процесса повышает шансы на завершение других. Нужно аккуратно подходить к настройке всей системы.
  • Лучшая защита — это адекватное выделение ресурсов (memory limits в K8s) и мониторинг, чтобы предотвращать ситуации с нехваткой памяти.