- A+
Delay accounting
延时统计
任务在执行时等待某个内核资源会意外遇到延迟,例如可运行的任务正在等待空闲CPU。
per-task的延时统计功能测量下列情况下任务经历的延迟:
- 正在等待CPU,waiting for a CPU (while being runnable)
- 同步块I/O的完成,completion of synchronous block I/O initiated by the task
- 正在页面内交换,swapping in pages
- 内存回收,memory reclaim
- 占满页面缓存,thrashing page cache
- 直接压缩,direct compact
- 写保护拷贝,write-protect copy
这些统计功能通过taskstats接口提供给用户空间使用。
这些延迟给设置CPU优先级,IO优先级和合适的RSS限制提供了反馈。重要任务的长期延迟可以作为一个触发器来提高它的优先级。
这个功能,通过使用taskstats接口,也为所有的线程组(传统的UNIX进程)中的任务或者线程提供了延时统计,这种收集比内核收集更有效。
用户空间的应用,特别是资源管理应用程序,也能收集延迟统计到任意分组。要使能这个功能,任务的延迟统计能在整个生存周期内和退出时都可用,需要保证连续的和完全的监测。
接口
延迟统计使用的taskstats接口在本目录下的文档中被详细地描述。Taskstats给用户空间返回一个per-pid和per-tgid统计的通用数据结构。延迟统计功能计算这个结构中的具体数据域。参看include/uapi/linux/taskstats.h
中的与延迟统计有关的数据域描述。
它一般以计数器的形式返回累计延迟(for cpu, sync block I/O, swapin, memory reclaim, thrash page cache, direct compact, write-protect copy等)。
获取任务计数器(cpu_delay_total)的两个连续读数的差异,由于等待这个间隔内的相关资源也会带来任务延迟。
当任务退出时,per-task统计的记录被发送给用户空间。如果它是线程组中最后退出的任务,per-tgid统计也会被发送。更多细节由taskstats接口描述给出。
在tools/accounting目录下的用户空间程序getdelays.c允许运行简单的命令和显示相关的延迟统计信息。它也用作taskstats的简单示例。
使用
编译内核:
CONFIG_TASK_DELAY_ACCT=y CONFIG_TASKSTATS=y
延迟统计启动时默认是禁止的,要使能它,增加delayacct
到内核启动选项。要么使用sysctl kernel.task_delayacct在运行时来切换状态。注意只要在使能之后启动任务,它就有delayacct信息。
系统系统之后,使用跟getdelays.c相似的程序来访问任务或者任务组(tgid)相关的延迟。应用程序也允许执行命令和查看相关的延迟。
getdelays命令的一般格式:
getdelays [-dilv] [-t tgid] [-p pid]
获取自系统启动以来PID 10的延迟:
# ./getdelays -d -p 10 (output similar to next case)
获取自系统启动以来tgid 5中所有pid的延迟总和:
# ./getdelays -d -t 5 print delayacct stats ON TGID 5 CPU count real total virtual total delay total delay average 8 7000000 6872122 3382277 0.423ms IO count delay total delay average 0 0 0ms SWAP count delay total delay average 0 0 0ms RECLAIM count delay total delay average 0 0 0ms THRASHING count delay total delay average 0 0 0ms COMPACT count delay total delay average 0 0 0ms WPCOPY count delay total delay average 0 0 0ms
获取pid1的IO统计:
# ./getdelays -i -p 1 printing IO accounting linuxrc: read=65536, write=0, cancelled_write=0
上述命令可以使用-v来获取等多调试信息。
英文原文:
https://www.kernel.org/doc/html/latest/accounting/delay-accounting.html