【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 内核能够有效监控系统中的异常任务,帮助开发者快速定位和解决系统挂起问题。

相关推荐
M78佐菲7 分钟前
ARM学习笔记(12)
linux·arm开发·笔记·嵌入式硬件·学习
可涵不会debug29 分钟前
C++ std::bind 实战教程:线程池、回调场景全覆盖
linux·开发语言·c++
青梅味猪大肠1 小时前
【操作系统-26】进程互斥软件实现-Peterson算法
linux·运维·服务器
wdfk_prog2 小时前
Wi-Fi Direct教程 01:在 Ubuntu 搭建双 mac80211_hwsim + wpa_supplicant 2.12
linux·运维·服务器·ubuntu·ros·wifi-direct
Vcaker3 小时前
Linux学习36-k8s集群升级及kube-vip高可用
linux·运维·学习
skywalk81633 小时前
Deepseek harness的4种模式 配置文件内容
linux·人工智能·ubuntu·deepseek·harness
沫璃染墨4 小时前
《从零入门Linux系统篇(五十一):线程篇·四——pthread线程库详解:从线程创建到终止与分离》
linux·运维·服务器·开发语言·c++·系统架构·线程
YYRAN_ZZU4 小时前
GMSL开发加解串配置介绍
linux·嵌入式硬件
云计算练习生4 小时前
什么是上下文切换?进程切换时 CPU 到底在保存什么
linux·服务器·操作系统·进程切换
用户0510122572964 小时前
RGA(二)——RK3588 的核拓扑与能力差异
linux·嵌入式