首页/系统/Linux 内核与性能调优速查/kernel.hung_task_timeout_secs 任务挂起告警
sysctl 内核参数72 条

kernel.hung_task_timeout_secs 任务挂起告警

处于 D(不可中断睡眠)状态超过阈值的任务会被记录告警(默认 120 秒);可配置直接 panic 作为自愈手段。

挂起任务的判定

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_secsD 状态持续多久判定挂起调大只是延后告警时间
hung_task_panic检测到挂起是否 panic置 1 会重启机器,需评估业务可用性
hung_task_warnings最多打印多少条告警置 -1 不限制,便于保留现场证据
dmesg 中的调用栈挂起任务的完整栈定位阻塞点的关键信息,应完整保存
D 状态长时间不退出多与存储、网络文件系统或驱动阻塞相关,先看调用栈落在哪个内核函数,再顺着找后端设备。
多个任务同时进入 D 状态通常是系统层面的 I/O 问题,而不是单个进程故障,此时排查方向应转向存储与文件系统。

排查顺序

  • 先读 dmesg 的调用栈,确认阻塞发生在哪个子系统
  • 再用 ps 的 wchan 看还有哪些任务卡在同一等待点
  • 结合 iostat、挂载点状态与后端存储健康度判断根因

易错点

  • 只调大阈值:延后告警但不解决阻塞源,应先读 dmesg 里的调用栈
  • 未评估就开启 hung_task_panic:会在生产环境引入重启,必须结合业务可用性权衡
  • 日志被环形缓冲区冲掉:未及时采集就只剩告警尾部,建议尽早导出或加大日志容量
  • 只看进程状态不看等待点:wchan 与调用栈才能区分是磁盘、网络存储还是驱动
  • 把 D 状态当僵尸进程处理:两者语义与处置方式完全不同

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/kernel.rst
  • Linux 内核 Documentation/admin-guide/sysctl/index.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌