“INFO: rcu detected stall”是Linux内核RCU子系统主动报告的严重调度异常信号,表明某CPU长时间未响应,常由驱动缺陷、硬件故障或内核配置不当引发,需结合dmesg、/proc/interrupts、/proc/softirqs等定位根因。

“INFO: rcu detected stall” 是 Linux 内核 RCU(Read-Copy-Update)子系统检测到 CPU 长时间未响应调度或无法完成 RCU 宽限期的警告,通常意味着某个 CPU 核心被长时间占用(比如死循环、高优先级中断持续抢占、内核锁竞争、硬件异常等),导致 RCU 机制超时。这不是单纯“CPU 卡死”的最终结果,而是内核主动发现并报告的**严重调度异常信号**,常伴随系统响应迟缓、软中断堆积、ksoftirqd 持续 100%、网络收发停滞、定时器不准等现象。
确认是否真为 RCU Stall(而非误报或瞬时抖动)
RCU stall 默认超时为 21 秒(CONFIG_RCU_CPU_STALL_TIMEOUT=21),但部分内核或配置可能更短。先排除瞬时干扰:
- 检查 dmesg -T | grep -i "rcu.*stall" 是否重复出现(尤其在负载稳定后仍频繁触发);
- 对比 /proc/sys/kernel/rcu_cpu_stall_timeout 值,确认当前阈值;
- 观察 stall 信息末尾是否带 “detected by CPU X”,定位具体卡住的 CPU;
- 用 cat /proc/interrupts 查看该 CPU 上中断计数是否异常飙升(如某一 irq 几秒内增长数万次);
- 运行 watch -n1 'cat /proc/softirqs' 看 HI/NET_RX/TIMER 等列是否持续猛增。
排查常见硬件与驱动诱因
多数真实 RCU stall 源于底层驱动或硬件问题,尤其是以下几类:
- 网卡驱动缺陷:特别是使用老旧或非主线驱动(如某些 Realtek、Intel 万兆旧版 ixgbe、某些 Broadcom BCM57xx)时,在高包率或特定丢包场景下可能陷入 softirq 死循环;
- PCIe 设备异常:坏掉的 NVMe SSD、故障 GPU、劣质雷电扩展坞可能引发 AER 错误或持续 MSI 中断,阻塞 CPU;检查 dmesg | grep -i "aer\|pcie\|nvme\|error";
- ACPI 或固件 bug:某些笔记本/服务器 BIOS 存在 SMI(System Management Interrupt)风暴,完全绕过 Linux 调度,导致 CPU 看似“消失”;可尝试加启动参数 acpi_enforce_resources=lax acpi_irq_balance=off 临时规避;
- 内存 ECC 错误或不稳定:silent corruption 可能导致内核路径异常挂起,查看 /var/log/mcelog 或 dmesg | grep -i "mce\|ecc\|memory"。
软件与内核配置层面缓解与诊断
若暂无法更换硬件或驱动,可通过内核参数和运行时调优争取诊断窗口和稳定性:
- 启动时添加 rcu_cpu_stall_timeout=60 延长检测窗口,避免误报掩盖真实问题;
- 启用 RCU 调试:加 rcu_trace 和 rcu_nocb_poll(需 CONFIG_RCU_NOCB_CPU=y),再配合 cat /sys/kernel/debug/rcu/* 查看各 CPU 宽限期状态;
- 禁用 NO_HZ_FULL(即 nohz_full= 不设或清空)——该模式对 RCU 敏感,容易在单核绑定场景触发 stall;
- 用 perf record -e irq:softirq_entry -a sleep 10 && perf script 抓取软中断热点,定位是哪个 softirq(NET_RX?SCHED?)长期霸占 CPU;
- 检查是否启用了 CONFIG_PREEMPT_RT 补丁且配置不当——实时补丁对 RCU 要求更严,错误的线程优先级或锁嵌套极易引发 stall。
快速应急与长期规避建议
线上系统发生 stall 时,优先保服务、留线索:
- 立即执行 echo w > /proc/sysrq-trigger(同步脏页)、echo t > /proc/sysrq-trigger(打印当前所有任务栈),获取关键现场;
- 若系统尚可响应,运行 crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /proc/kcore 分析内核内存(需提前装 debuginfo);
- 临时规避:对已知问题设备,用 echo 0 > /sys/bus/pci/devices/XXXX:XX:XX.X/enable 热拔插禁用(谨慎操作);
- 长期方案:升级至较新稳定内核(≥5.10+ 对 RCU stall 的诊断信息更全),使用主线驱动(如替换 r8169 为 r8168、用 mlx5_core 替代老旧 mlx4);
- 生产环境避免将关键服务绑定到单个 CPU 并启用 nohz_full,RCU 在非对称负载下更易暴露缺陷。








