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