大家好,我是bug菌~
在Linux内核中,Softlockup和Hung task都是任务调度异常的情况,但它们的检测机制、触发条件和关注点有所不同:
Softlockup(软锁死)
定义
· 指某个CPU核心上的内核任务长时间占用CPU而不调度,导致该CPU上的调度器无法运行其他任务
· 核心是任务正在运行但长时间不释放CPU
检测机制
· 由NMI watchdog(不可屏蔽中断看门狗)检测
· 每个CPU核心都有一个watchdog线程定期唤醒并检查时间戳
· 如果某个CPU上的任务运行时间超过阈值(通常20秒)且watchdog线程无法运行,则触发softlockup
常见原因
· 内核代码中的无限循环或长时间循环
· 抢占被禁用时间过长
· 中断处理程序执行时间过长
· 内核bug导致的死循环
典型表现
BUG: soft lockup - CPU#1 stuck for 23s! [bash:1234]Hung task(任务挂起)
定义
· 指用户空间任务在D状态(不可中断睡眠)停留时间过长
· 核心是任务在等待某些资源但永远得不到
检测机制
· 由内核的hung task检测器(khungtaskd内核线程)定期扫描
· 检查所有任务的D状态持续时间
· 默认阈值通常为120秒
常见原因
· 等待永远不会发生的I/O操作(如故障的磁盘)
· 内核驱动bug导致资源永远不可用
· 死锁或资源竞争
· 网络文件系统超时
典型表现
INFO: task bash:1234 blocked for more than 120 seconds主要区别对比
维度 Softlockup Hung Task
任务状态 正在运行(R状态) 不可中断睡眠(D状态)
检测对象 CPU核心使用情况 单个任务的调度状态
检测机制 NMI watchdog定时器 khungtaskd线程扫描
触发条件 CPU被独占超过阈值 D状态持续时间过长
默认阈值 通常20秒 通常120秒
关注焦点 CPU调度问题 I/O/资源等待问题
常见根源 内核bug、死循环 硬件故障、驱动bug、死锁
调试与处理
Softlockup调试
# 查看配置cat/proc/sys/kernel/watchdog_thresh# 调整阈值(秒)echo30>/proc/sys/kernel/watchdog_thresh# 获取堆栈信息echol>/proc/sysrq-triggerdmesg|tail-50Hung task调试
# 查看配置cat/proc/sys/kernel/hung_task_timeout_secscat/proc/sys/kernel/hung_task_panic# 强制结束挂起任务echof>/proc/sysrq-trigger# 触发OOM killer实际场景示例
· Softlockup:内核模块中的while(1)循环,没有cond_resched()
· Hung task:NFS服务器宕机后,客户端进程在mount点上等待响应
总结
· Softlockup是"活锁"——任务在运行但独占CPU
· Hung task是"死等"——任务在等待永远不会到来的资源
两者都表示系统出现异常,但诊断时需要区分问题的性质:是CPU调度问题还是资源等待问题。实际工作中,softlockup通常更紧急,因为它直接影响CPU的可用性。