挂起任务的判定
kernel.hung_task_timeout_secs 定义挂起判定阈值:任务处于 D 状态(不可中断睡眠,TASK_UNINTERRUPTIBLE)超过该秒数(默认 120)时,内核把它的状态与调用栈打印到日志。配合 kernel.hung_task_panic=1 可以在检测到挂起时直接 panic,让机器重启实现自愈。D 状态意味着任务卡在 I/O 或驱动等待上,日志里的调用栈才是定位阻塞源的入口,调大阈值只是延后告警。
基本信息
| 参数名 | kernel.hung_task_timeout_secs |
|---|---|
| 默认值 | 120(秒) |
| 联动参数 | kernel.hung_task_panic 触发 panic,kernel.hung_task_warnings 控制打印条数 |
| 查看 | sysctl kernel.hung_task_timeout_secs kernel.hung_task_panic |
| 日志位置 | 内核环形缓冲区,用 dmesg 读取 |
典型使用场景
- 业务长时间无响应,怀疑任务卡在不可中断等待
- 存储或网络文件系统抖动导致任务大量积压
- 虚拟化环境下排查挂载点异常造成的卡顿
- 为无人值守节点配置挂起自愈策略
- 结合 dmesg 调用栈定位阻塞的内核路径
查看与排查
查看与排查
sysctl kernel.hung_task_timeout_secs kernel.hung_task_panic kernel.hung_task_warnings
dmesg -T | grep -i -A5 'hung task' | tail -30
ps -eo state,pid,wchan:20,comm | awk '$1 ~ /^D/' # 当前 D 状态任务与等待点
cat /proc/loadavg # 负载是否被 D 状态抬高
watch -n5 'ps -eo state,comm | grep -c "^D"' # D 状态任务数变化
cat /proc/meminfo | grep -i -E 'slab|swap' | head相关参数读法
| 项 | 含义 | 注意 |
|---|---|---|
| hung_task_timeout_secs | D 状态持续多久判定挂起 | 调大只是延后告警时间 |
| hung_task_panic | 检测到挂起是否 panic | 置 1 会重启机器,需评估业务可用性 |
| hung_task_warnings | 最多打印多少条告警 | 置 -1 不限制,便于保留现场证据 |
| dmesg 中的调用栈 | 挂起任务的完整栈 | 定位阻塞点的关键信息,应完整保存 |
D 状态长时间不退出多与存储、网络文件系统或驱动阻塞相关,先看调用栈落在哪个内核函数,再顺着找后端设备。
多个任务同时进入 D 状态通常是系统层面的 I/O 问题,而不是单个进程故障,此时排查方向应转向存储与文件系统。
排查顺序
- 先读 dmesg 的调用栈,确认阻塞发生在哪个子系统
- 再用 ps 的 wchan 看还有哪些任务卡在同一等待点
- 结合 iostat、挂载点状态与后端存储健康度判断根因