RCU Stall detected on CPU — Диагностика и устранение сбоев RCU в Linux
Архитектура ошибки и симптомы сбоя
Сообщение «RCU Stall detected on CPU (rcu_sched detected stalls on CPUs/tasks)» означает, что подсистема ядра RCU (Read-Copy Update) зафиксировала зависание одного из процессорных ядер внутри RCU-критической секции. Процессор не прошел через так называемое «состояние покоя» (quiescent state) за отведенный интервал времени (обычно 21 секунда), блокируя освобождение устаревших структур памяти всеми остальными ядрами ОС.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| RCU (Read-Copy Update) | Lockless Sync Subsystem | Высокопроизводительный механизм синхронизации структур ядра без классических блокировок. |
| Quiescent State | RCU Grace Period | Момент переключения контекста, подтверждающий выход CPU из критической секции чтения. |
| rcu_cpu_stall_timeout | 21 (seconds) | Пороговое время ожидания grace period до генерации стектрейса. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Проверка Steal Time на виртуальных серверах (KVM / Proxmox / AWS)
В 75% случаев RCU Stall на VDS/VPS вызывается оверселлингом CPU на хосте (гипервизор отбирает процессорные такты у виртуалки):
# Мониторинг показателя %st (Steal Time):
top -b -n 1 | grep "%Cpu"
# Если показатель %st > 5-10%, хост перегружен ресурсами других ВМ.Сценарий 2: Увеличение таймаута RCU для высоконагруженных платформ
Если система выполняет тяжелые непрерывные вычисления без вытеснения:
# Временное увеличение таймаута до 60 секунд:
sudo sysctl -w kernel.rcu_cpu_stall_timeout=60
# Фиксация в параметрах GRUB (/etc/default/grub):
GRUB_CMDLINE_LINUX="rcupdate.rcu_cpu_stall_timeout=60"
sudo update-grubСценарий 3: Изоляция прерываний и тюнинг CPU Affinity
Если на одном ядре CPU0 сконцентрированы все аппаратные прерывания сети и дисков, RCU-поток вытесняется. Установите и запустите irqbalance:
sudo apt-get install irqbalance
sudo systemctl enable --now irqbalanceITSTM проведет аудит инфраструктуры гипервизоров, исключит влияние CPU Steal Time и сбалансирует нагрузки vCPU для стабильного SLA.
Частые вопросы (FAQ)
Приводит ли RCU Stall к полной остановке системы?
Не всегда. Ядро выводит предупреждение и Call Trace в dmesg. Однако продолжающийся stall приводит к исчерпанию памяти (структуры RCU не освобождаются) и последующему Hard/Soft Lockup.
Что означает буква 'g' и 'c' в строке статуса RCU stall?
В логах RCU 'g' (grace period number) указывает номер текущего периода очистки, а 'c' (completed) — номер последнего завершенного периода. Разница между ними отражает масштаб задержки синхронизации.