Kernel panic: Out of memory and no killable processes — Настройка OOM Killer в Linux
Архитектура ошибки и симптомы сбоя
Сбой «Kernel panic - not syncing: Out of memory and no killable processes...» возникает, когда подсистема управления виртуальной памятью (VMM) полностью исчерпала физическую RAM и область подкачки (Swap), а стандартный механизм OOM Killer не смог найти ни одного пользовательского процесса, допустимого к завершению (либо все оставшиеся процессы защищены через oom_score_adj=-1000, либо система находится в режиме принудительной паники).
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| vm.panic_on_oom | sysctl: 1 или 2 | Флаг принудительного вызова Kernel Panic вместо завершения процесса-нарушителя. |
| vm.overcommit_memory | sysctl: 0, 1, 2 | Политика выделения виртуальной памяти ядром Linux. |
| oom_score_adj | -1000 | Процесс полностью защищен от завершения Out-Of-Memory киллером. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Отключение паники при OOM (возврат стандартного OOM Killer)
Проверьте текущие параметры ядра и верните стандартное поведение:
# Проверка текущих параметров:
sysctl vm.panic_on_oom
# Отключение принудительной паники ядра:
sudo sysctl -w vm.panic_on_oom=0
# Фиксация в /etc/sysctl.d/99-memory.conf:
echo "vm.panic_on_oom = 0" | sudo tee -a /etc/sysctl.d/99-memory.conf
sudo sysctl -p /etc/sysctl.d/99-memory.confСценарий 2: Расширение и настройка файла подкачки (Swap)
Если Swap отсутствует или имеет слишком малый объем:
# Создание Swap-файла размером 8GB
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# Добавление в /etc/fstab для автозагрузки
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstabСценарий 3: Настройка резервирования памяти и лимитов cgroups
- Для серверов баз данных (PostgreSQL/MySQL) настройте
vm.min_free_kbytes, чтобы ядро всегда сохраняло пул памяти для сетевых буферов. - Ограничивайте память контейнеров Docker/Kubernetes через
memory.max, чтобы утечки в микросервисах не роняли хостовую ОС.
Инженеры ITSTM выполнят профилирование потребления RAM, настроят лимиты cgroups v2 и оптимизируют СУБД для исключения простоев production-систем.
Частые вопросы (FAQ)
Почему OOM Killer не смог завершить ни один процесс?
Такое происходит, если vm.panic_on_oom установлен в значение 1 (всегда паниковать при OOM), либо если память занята процессами ядра (Slab/Dentry кэш), которые OOM Killer физически не может завершить.
Как защитить критически важный сервис от OOM Killer?
Установите в systemd-юните сервиса директиву OOMScoreAdjust=-1000. Это защитит процесс от убийства, однако убедитесь, что в системе есть другие процессы, которые OOM сможет закрыть в случае исчерпания RAM.