延迟记账¶
当任务等待某些内核资源可用时,例如,一个可运行的任务可能等待空闲的CPU来运行,它们会遇到执行延迟。
每个任务的延迟记账功能测量任务在以下情况下经历的延迟:
等待CPU(同时处于可运行状态)
完成由任务发起的同步块I/O
换入页面
内存回收
抖动
直接压缩
写保护复制
IRQ/SOFTIRQ
并通过taskstats接口将这些统计信息提供给用户空间。
这些延迟为适当设置任务的CPU优先级、IO优先级和rss限制值提供了反馈。重要任务的长时间延迟可能会触发提高其相应的优先级。
该功能通过使用taskstats接口,还提供了为属于线程组(对应于传统的Unix进程)的所有任务(或线程)聚合的延迟统计信息。这是内核更有效完成的常用聚合。
用户空间实用程序,特别是资源管理应用程序,也可以将延迟统计信息聚合到任意组中。为了实现这一点,任务的延迟统计信息在其生命周期内以及退出时都可用,从而确保可以进行连续和完整的监控。
接口¶
延迟记账使用taskstats接口,该接口在本目录的单独文档中详细描述。Taskstats向用户空间返回一个通用数据结构,对应于每个pid和每个tgid的统计信息。延迟记账功能填充此结构的特定字段。请参阅
include/uapi/linux/taskstats.h
了解有关延迟记账的字段的描述。它通常采用计数器的形式,返回CPU、同步块I/O、swapin、内存回收、抖动页面缓存、直接压缩、写保护复制、IRQ/SOFTIRQ等累积延迟。
取一个任务的给定计数器(例如cpu_delay_total)的两个连续读数之差,将给出任务在该时间间隔内等待相应资源所经历的延迟。
当任务退出时,包含每个任务统计信息的记录将发送到用户空间,而无需命令。如果它是线程组中最后一个退出的任务,则还会发送每个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 0.000ms
SWAP count delay total delay average
0 0 0.000ms
RECLAIM count delay total delay average
0 0 0.000ms
THRASHING count delay total delay average
0 0 0.000ms
COMPACT count delay total delay average
0 0 0.000ms
WPCOPY count delay total delay average
0 0 0.000ms
IRQ count delay total delay average
0 0 0.000ms
获取pid 1的IO记账,仅适用于-p
# ./getdelays -i -p 1
printing IO accounting
linuxrc: read=65536, write=0, cancelled_write=0
以上命令可以与-v一起使用以获取更多调试信息。