内核卡死与 hung task 入门
本文对应 成长路径 高优先级:识别 soft lockup、RCU stall、hung task 等日志,并给出 初步定位方向。
三类常见「卡死」
| 类型 | 典型日志 | 含义 |
|---|---|---|
| soft lockup | BUG: soft lockup - CPU#2 stuck for 22s! | 某核长时间关中断或死循环 |
| hard lockup | NMI watchdog: Watchdog detected hard LOCKUP | 核完全无响应(更严) |
| RCU stall | rcu_sched detected stalls | RCU 宽限期未完成 |
| hung task | task 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 CPU、blocked tasks 列表。
hung task
内核 hung_task detector 检测 不可中断睡眠 过久:
echo 120 > /proc/sys/kernel/hung_task_timeout_secs常见:等锁、等 I/O、驱动 remove 死锁。
对照 /proc/
应急手段(开发板)
| 按键/命令 | 作用 |
|---|---|
SysRq t | 打印所有任务栈 |
SysRq w | 阻塞任务 |
SysRq g | 触发 crash 留 dump(需配置) |
| 串口 Magic SysRq | echo t > /proc/sysrq-trigger |
与 watchdog 关系
硬件 watchdog 在 系统无响应 时复位;日志可能来不及完整输出,需 early printk 或 pstore。
实践清单
- 在 QEMU 用 buggy 驱动 触发一次 soft lockup(实验环境)
- 保存一份含 全部任务栈 的 sysrq-t 日志作模板