豆包 linux-6.19/tools/accounting/delaytop.c 源码分析
Linux 6.19tools/accounting/delaytop.c完整源码分析
文件路径:linux-6.19/tools/accounting/delaytop.c
一、整体定位
delaytop是 Linux 6.19 新增、基于Delay Accounting + PSI 压力指标的交互式实时进程延迟排行工具(类似 top,但专门看进程阻塞延迟,不是CPU使用率)。
- 内核依赖:
CONFIG_TASK_DELAY_ACCT=y、CONFIG_PSI=y - 数据来源:内核
taskstatsnetlink 接口 +/proc/pressure/*PSI 文件 - 界面:ncurses 终端UI、实时刷新、按键排序、TopN 阻塞进程排行
- 用途:快速定位CPU调度等待、IO阻塞、内存回收、交换、内存颠簸等内核阻塞延迟根源
区别:
top:看CPU占用getdelays.c:单进程静态延迟查询- delaytop.c:全系统实时动态Top阻塞延迟排行+PSI系统压力总览
二、内核延迟分类(delaytop 统计全部类型)
内核 Delay Accounting 统计5类进程阻塞延迟(单位ns):
cpu_delay:调度延迟(就绪队列等待CPU运行)blkio_delay:块IO阻塞等待(等待磁盘完成)swapin_delay:换入内存等待freepages_delay:内存回收、页分配等待thrashing_delay:内存颠簸(频繁换入换出)
delaytop 同时读取PSI 系统全局压力(CPU/Memory/IO some/full 压力占比)。
三、源码整体结构(Linux6.19 最新版,约600行)
从上到下分为7大模块:
- 头文件、宏定义、数据结构体
- PSI 压力指标读取逻辑(/proc/pressure)
- taskstats netlink 初始化、数据接收解析
- 进程延迟数据收集、聚合、排序
- ncurses 终端UI初始化、绘制
- 主循环:定时刷新+按键交互
- 退出清理、信号处理
四、逐模块源码深度解析
4.1 头文件与核心数据结构
#include<ncurses.h>#include<linux/taskstats.h>#include<linux/genetlink.h>#include<sys/socket.h>// 单个进程延迟统计结构体(delaytop内部缓存)structtask_delay_stat{pid_tpid;charcomm[TASK_COMM_LEN];// 进程名uint64_tcpu_delay;// 调度延迟uint64_tblkio_delay;// IO阻塞uint64_tswapin_delay;uint64_tfreepages_delay;uint64_tthrashing_delay;uint64_ttotal_delay;// 总阻塞延迟};// PSI全局压力结构体structpsi_stat{uint64_tavg10,avg60,avg300;// 10s/60s/300s平均压力uint64_ttotal;// 累计压力时间};structpsi_system{struct