Ответ
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) и мониторинг, чтобы предотвращать ситуации с нехваткой памяти.