【Linux 维测专栏 1 -- Hung Task 分析与验证】

文章目录

  • [Linux Hung Task 简介](#Linux Hung Task 简介)
    • [1. Hung Task 概述](#1. Hung Task 概述)
    • [2. D 状态与 Hung Task](#2. D 状态与 Hung Task)
    • [3. Hung Task 的工作原理](#3. Hung Task 的工作原理)
    • [4. Hung Task 的配置](#4. Hung Task 的配置)
    • [5. Hung Task 的典型输出](#5. Hung Task 的典型输出)
    • [6. Hung Task 的应用场景](#6. Hung Task 的应用场景)
    • [7. kernel 配置](#7. kernel 配置)
      • [7.1 编译选项](#7.1 编译选项)
      • [7.2 参数控制](#7.2 参数控制)
      • [7.3 验证方法](#7.3 验证方法)
      • [4. 扩展接口](#4. 扩展接口)
    • [8. 注意事项](#8. 注意事项)

Linux Hung Task 简介

1. Hung Task 概述

Hung Task 是 Linux 内核中的一个检测机制,用于监控长时间处于 D 状态(不可中断睡眠状态) 的任务(进程或线程)。如果某个任务在 D 状态停留时间过长,内核会认为该任务可能已经"挂起"(Hung),并触发相应的警告或调试信息,帮助开发者定位问题。

2. D 状态与 Hung Task

  • D 状态(不可中断睡眠状态)

    任务在等待某些内核资源(如 I/O 操作、锁等)时进入 D 状态。

    在 D 状态的任务不会响应信号(如 SIGKILL ),因此无法被强制终止。

    如果任务长时间处于 D 状态,可能会导致系统性能下降或死锁。

  • Hung Task 检测

    Hung Task 机制会定期扫描系统中的任务,检查是否有任务在 D 状态停留时间超过预设阈值。

    如果检测到 Hung Task,内核会记录相关信息(如任务名称、PID、堆栈跟踪等),并触发警告。

3. Hung Task 的工作原理

  • 初始化

    在内核启动时,Hung Task 检测机制会初始化一个内核线程(khungtaskd),用于定期扫描系统中的任务。

  • 任务扫描

    khungtaskd 线程会定期(默认每 120 秒)遍历所有任务,检查其状态和处于 D 状态的时间。

  • 阈值判断

    如果某个任务在 D 状态的时间超过预设阈值(默认 120 秒),则判定为 Hung Task。

  • 触发警告

    内核会记录 Hung Task 的详细信息,包括:

    • 任务名称和 PID。
    • 任务的堆栈跟踪。

这些信息会通过内核日志(dmesg)输出,便于开发者分析。

4. Hung Task 的配置

Hung Task 的行为可以通过以下内核参数进行配置:

  • hung_task_timeout_secs

    定义任务在 D 状态的最大允许时间(单位:秒)。

    默认值:120 秒。
    示例:hung_task_timeout_secs=60。

  • hung_task_panic

    如果设置为 1,当检测到 Hung Task 时,内核会直接触发 panic。

    默认值:0(仅记录警告,不触发 panic)。
    示例:hung_task_panic=1。

  • hung_task_check_count

    定义每次扫描时检查的任务数量。

    默认值:1024。
    示例hung_task_check_count=2048

  • hung_task_warnings

    定义最大警告次数。超过该次数后,不再记录 Hung Task 警告。

    默认值:10。
    示例hung_task_warnings=5

5. Hung Task 的典型输出

当检测到 Hung Task 时,内核日志中会输出类似以下信息:

bash 复制代码
INFO: task mytask:1234 blocked for more than 120 seconds.
      Tainted: G           OE
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
mytask      D ffffffff810a3b80     0  1234   1233 0x00000000
Call Trace:
 [<ffffffff810a3b80>] ? __schedule+0x320/0x8c0
 [<ffffffff810a3b80>] ? __schedule+0x320/0x8c0
 [<ffffffff810a3b80>] ? __schedule+0x320/0x8c0
  • 任务名称:mytask。
  • PID:1234。
  • 阻塞时间:超过 120 秒。
  • 堆栈跟踪:显示任务在内核中的调用路径。

6. Hung Task 的应用场景

  • 调试死锁

    当任务因竞争锁资源而进入 D 状态时,Hung Task 可以帮助定位死锁问题。

  • 分析 I/O 问题:

    如果任务因等待 I/O 操作而挂起,Hung Task 可以提供堆栈信息,帮助分析 I/O 瓶颈。

  • 系统性能监控:

    通过 Hung Task 检测,可以及时发现系统中的异常任务,避免系统性能下降。

7. kernel 配置

7.1 编译选项

csharp 复制代码
# hung task
CONFIG_DETECT_HUNG_TASK=y
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=30
CONFIG_TEST_LOCKUP=m

7.2 参数控制

hung_task参数控制节点:/proc/sys/kernel/

c 复制代码
hung_task_all_cpu_backtrace       // 打印所有core的调用栈
hung_task_panic                   // hung task触发panic
hung_task_check_count             //一次check 多少进程
hung_task_timeout_secs            // hung task 判断标准
hung_task_check_interval_secs     // khungd隔多久检查一次,取 和 hung_task_timeout_secs    比较的最小值
hung_task_warnings                // warnings 次数

7.3 验证方法

验证命令

c 复制代码
echo 1 > /proc/sys/kernel/hung_task_all_cpu_backtrace
echo 20 > /proc/sys/kernel/hung_task_timeout_secs
modprobe test_lockup time_secs=100 iterations=40 state=D

4. 扩展接口

编译打开:CONFIG_DETECT_HUNG_TASK_EXT

c 复制代码
echo on > /sys/kernel/hung_task/enable      // 打开ext
echo "whitelist,xxx" > /sys/kernel/hung_task/monitorlist   // 添加白名单程序,格式:whitelist,xxx,yyy,zzz

8. 注意事项

  • 性能开销:

    Hung Task 检测会定期扫描任务列表,可能对系统性能产生一定影响。在高负载系统中,建议根据实际情况调整检测频率。

  • 误报问题:

    某些任务可能因长时间等待合法资源而处于 D 状态,导致误报。需要结合具体场景分析。

通过 Hung Task 机制,Linux 内核能够有效监控系统中的异常任务,帮助开发者快速定位和解决系统挂起问题。

相关推荐
吉凶以情迁25 分钟前
window服务相关问题探索 go语言服务开发探索调试
linux·服务器·开发语言·网络·golang
柏木乃一2 小时前
Linux初步认识与指令与权限
linux·运维·服务器·shell·权限
Joemt2 小时前
ubuntu源码编译安装cmake高版本、pybind11安装、crow使用
linux·运维·ubuntu
huohuopro2 小时前
在linux(ubuntu)服务器上安装NTQQ并使用
linux·ubuntu
Jooolin3 小时前
Ubuntu?Centos?还是 redhat?Linux 系统选哪个?
linux·ubuntu·ai编程
Sadsvit3 小时前
Linux 进程管理与计划任务
linux·服务器·网络
bigcarp3 小时前
linux + 宝塔面板 部署 django网站 启动方式:uwsgi 和gunicorn如何选择 ?
linux·运维·django
爱凤的小光3 小时前
图漾相机-ROS1_SDK_ubuntu 4.X.X版本编译
linux·数码相机·ubuntu
六点半8884 小时前
【Linux】vim—基操
linux·vim·excel