CPU 与调度60 条

soft lockup 排查

某 CPU 长时间不让出调度时内核报 soft lockup(dmesg 可见 BUG: soft lockup),常见于驱动或内核路径长时间占用/关抢占。

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 编号日志中的关键信息用于定位到具体代码路径和核
调大阈值只是让报告更晚,根因在调用栈里;日志附近的关键栈要完整保存下来再分析。
虚拟化环境中的误报需要结合宿主侧观察,只盯虚机日志容易得出错误结论。

常见诱因

  • 驱动问题:网卡、存储或虚拟化驱动在中断路径中长时间循环
  • 内核模块:第三方模块关闭抢占的时间过久
  • 硬中断处理过长:中断风暴下单个核长时间停留在中断上下文
  • 虚拟化设备:虚机与宿主交互异常导致长时间占用
  • 硬件与固件:微码或固件缺陷引发的异常行为
硬件锁定通常指向更底层的问题:中断被长时间屏蔽多与驱动缺陷或硬件异常相关,处置优先级高于软锁定。

易错点

  • 只调大阈值:报告被延后但问题仍在,应优先保存完整调用栈
  • 忽略日志滚落:内核环形缓冲区会覆盖,需要尽早采集
  • 把虚拟化开销当软锁定:应结合宿主侧观察确认
  • 为消除噪声关闭看门狗:会同时失去发现问题的能力
  • 不记录 CPU 编号:缺失定位到具体核的关键线索

数据来源与参考

  • Linux 内核 Documentation/admin-guide/lockup-watchdogs.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌