Kernel panic: Soft lockup - CPU# stuck for 22s! — Исправление зависания ядра Linux
Архитектура ошибки и симптомы сбоя
Сообщение «Kernel panic - not syncing: Soft lockup - CPU# stuck for 22s!» генерируется сторожевым таймером планировщика ядра Linux. Это означает, что ядро застряло в цикле внутри режима ядра (kernel space) более чем на 22 секунды, не давая другим процессам получить процессорное квантование времени. Прерывания при этом работают, но планировщик задач не может выполнить смену контекста.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| Soft Lockup | Kernel Loop | Бесконечный цикл или длительная блокировка в ядре без освобождения ресурсов. |
| Watchdog Timer | 22 seconds | Превышение порога (обычно 2 * watchdog_thresh + 2 сек). |
| kernel.softlockup_panic | 1 | Вызов перезагрузки / паники ядра при обнаружении soft lockup. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Отключение Transparent Huge Pages (THP)
В 60% случаев на серверах баз данных (Redis, MongoDB, PostgreSQL, 1С) причиной Soft Lockup является процесс khugepaged, дефрагментирующий память:
# Временное отключение:
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
# Перманентное отключение через GRUB в /etc/default/grub:
GRUB_CMDLINE_LINUX_DEFAULT="transparent_hugepage=never"Сценарий 2: Тюнинг параметров ввода-вывода (Dirty Pages)
Если ядро зависает при сбросе огромных массивов данных на медленный диск:
# Уменьшение размера грязных страниц в памяти:
sudo sysctl -w vm.dirty_background_ratio=5
sudo sysctl -w vm.dirty_ratio=10
# Увеличение таймаута сторожевого таймера до 30 секунд:
sudo sysctl -w kernel.watchdog_thresh=30Сценарий 3: Настройка параметров виртуализации KVM
Если Linux запущен в виртуалке, активируйте поддержку KVM Async Page Faults и PV Spinlocks на хосте.
Специалисты ITSTM оптимизируют подсистемы ввода-вывода, стек TCP и менеджмент памяти под специфику вашего enterprise-стека.
Частые вопросы (FAQ)
Приводит ли Soft Lockup всегда к падению сервера?
Нет. По умолчанию ядро выводит стек трейс в dmesg и пытается продолжить работу. Но если в sysctl включен параметр kernel.softlockup_panic=1, ядро немедленно уходит в Kernel Panic.
Как найти процесс, вызвавший Soft Lockup?
В выводе Call Trace в dmesg найдите строку 'Comm: <имя_процесса>'. Она указывает на задачу, выполнявшуюся на данном ядре процессора в момент зависания.