soft lockup 排查
当某个 CPU 长时间不让出调度时,内核看门狗会报 soft lockup,dmesg 中显示 BUG: soft lockup 并附上卡住位置的调用栈。常见原因是驱动或内核代码路径长时间占用 CPU、关闭抢占的时间过久,或是硬中断处理过长。判定阈值由 kernel.watchdog_thresh 控制(默认 10 秒量级),看门狗本身受 kernel.watchdog 开关控制。日志中的调用栈与 CPU 编号是最有价值的线索。
基本信息
| 日志 | dmesg -T 中搜索 soft lockup |
|---|---|
| 阈值 | kernel.watchdog_thresh,默认 10 秒量级 |
| 开关 | kernel.watchdog |
| 相关现象 | hard LOCKUP 更严重,连中断都无法响应 |
| 关键信息 | 调用栈与 CPU 编号 |
典型使用场景
- 系统出现短暂失去响应
- 内核日志出现 BUG: soft lockup
- 排查驱动或内核模块导致的卡顿
- 虚拟机上甄别误报
- 长期稳定性观测与现场留证
排查
排查
dmesg -T | grep -iE 'soft lockup|hard LOCKUP' | tail -5
sysctl kernel.watchdog kernel.watchdog_thresh
cat /proc/sys/kernel/watchdog
ps -eo pid,psr,pcpu,comm --sort=-pcpu | head -10 # 是否长期占满单核
mpstat -P ALL 1 3 | grep -v Average
journalctl -k --no-pager | grep -i lockup | tail -5关键项读法
| 项 | 含义 | 注意 |
|---|---|---|
| soft lockup | 某核长时间不让出调度 | 多为驱动或内核路径长时间占用 |
| hard LOCKUP | 连中断都无法响应 | 更严重,常伴随硬件或固件问题 |
| watchdog_thresh | 判定阈值 | 调大只是延后报告 |
| 调用栈与 CPU 编号 | 日志中的关键信息 | 用于定位到具体代码路径和核 |
调大阈值只是让报告更晚,根因在调用栈里;日志附近的关键栈要完整保存下来再分析。
虚拟化环境中的误报需要结合宿主侧观察,只盯虚机日志容易得出错误结论。
常见诱因
- 驱动问题:网卡、存储或虚拟化驱动在中断路径中长时间循环
- 内核模块:第三方模块关闭抢占的时间过久
- 硬中断处理过长:中断风暴下单个核长时间停留在中断上下文
- 虚拟化设备:虚机与宿主交互异常导致长时间占用
- 硬件与固件:微码或固件缺陷引发的异常行为
硬件锁定通常指向更底层的问题:中断被长时间屏蔽多与驱动缺陷或硬件异常相关,处置优先级高于软锁定。