是否可以测量Linux进程的累积IO等待时间?

时间:2018-04-09 14:02:04

标签: linux performance io profiling

我可以使用哪个C API来获取Linux上现有子进程的IO等待时间计数器的绝对终端值?

背景: 我试图找出磁盘的缓慢程度导致应用程序运行缓慢的程度。换句话说:应用程序必须等待磁盘完成多长时间,以毫秒为单位?

虽然,Linux内核在IO(/ proc // io)上为每个进程提供了一些统计信息,但我没有找到任何方法来获得正在运行(已完成)进程的累积等待时间。

CPU时间类似于wait4()或getrusage()函数的* rusage结构,但不是IO等待时间。

顶部显示的IO等待时间(%wa [it])或iotop没有帮助,因为它显示为速率(%= IOwait_time / Total_Idle_Time),而不是绝对值,例如在[ms]。

我无法进行任何繁重的用户空间分析,因为它会降低应用程序的速度。必须在子进程终止时收集IO等待时间度量的最终值而没有开销。

编辑:

@emmrk提供了有关检查每个进程统计信息资源/ proc // stat进程统计信息接口的提示。不幸的是,这个资源(与系统范围的/ proc / stat相反)不提供IO等待计数器。

在下面的回答中讨论了在存在之前捕获进程的方法(@gavv),但是没有显示这种方法的开销: Extract all statistic of a process from /proc just before the process exit (Linux)

@Gaius mentions即使在流程退出后不久,他仍然能够读取/ proc // stat。这非常方便,但目前还不清楚这是多么稳定。

1 个答案:

答案 0 :(得分:0)

查看man procfs,每个进程/proc/stat条目:

         iowait (since Linux 2.5.41)
            (5) Time waiting for I/O to complete.

修改

取决于您想要达到的准确度,"实用"获取值的范围从运行后台脚本到每cat /proc/pid/statn到使用kprobes陷阱sys_exit并阅读/proc/pid/stat,同时阻止进程离开。

kprobe方法可能会使您的系统变得笨拙(因为很多进程都无法退出),因此另一种方法是通过{{1连接负责显示统计数据的函数fs。相关代码位于内核源代码中的/proc/