内核卡死与 hung task 入门

本文对应 成长路径 高优先级:识别 soft lockup、RCU stall、hung task 等日志,并给出 初步定位方向


三类常见「卡死」

类型典型日志含义
soft lockupBUG: soft lockup - CPU#2 stuck for 22s!某核长时间关中断或死循环
hard lockupNMI watchdog: Watchdog detected hard LOCKUP核完全无响应(更严)
RCU stallrcu_sched detected stallsRCU 宽限期未完成
hung tasktask xxx blocked for more than 120 seconds进程 D 状态过久

soft lockup

常见原因:

  • 驱动 硬中断 / spinlock 临界区过长。
  • 关中断mdelay、大循环。
  • 实时线程 占满 CPU。

排查:

  • 日志中的 指向函数。
  • echo 1 > /proc/sys/kernel/hung_task_panic(仅调试)触发 crash 留 vmcore。
  • ftrace function_graph 看卡点。

RCU stall

常见原因:

  • 某 CPU 长时间禁抢占 未调度。
  • 关 IRQ 路径未 rcu_read_unlock 配对(驱动 bug)。
  • 极端负载下 RCU 回调 堆积。

关注 which CPUblocked tasks 列表。


hung task

内核 hung_task detector 检测 不可中断睡眠 过久:

echo 120 > /proc/sys/kernel/hung_task_timeout_secs

常见:等锁等 I/O驱动 remove 死锁

对照 /proc//stack(若仍可访问)或 sysrq-t 任务栈。


应急手段(开发板)

按键/命令作用
SysRq t打印所有任务栈
SysRq w阻塞任务
SysRq g触发 crash 留 dump(需配置)
串口 Magic SysRqecho t > /proc/sysrq-trigger

与 watchdog 关系

硬件 watchdog系统无响应 时复位;日志可能来不及完整输出,需 early printkpstore


实践清单

  • 在 QEMU 用 buggy 驱动 触发一次 soft lockup(实验环境)
  • 保存一份含 全部任务栈 的 sysrq-t 日志作模板

延伸阅读