我可以使用哪个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。这非常方便,但目前还不清楚这是多么稳定。
答案 0 :(得分:0)
查看man procfs
,每个进程/proc/stat
条目:
iowait (since Linux 2.5.41)
(5) Time waiting for I/O to complete.
修改强>
取决于您想要达到的准确度,"实用"获取值的范围从运行后台脚本到每cat /proc/pid/stat
秒n
到使用kprobes
陷阱sys_exit
并阅读/proc/pid/stat
,同时阻止进程离开。
kprobe
方法可能会使您的系统变得笨拙(因为很多进程都无法退出),因此另一种方法是通过{{1连接负责显示统计数据的函数fs。相关代码位于内核源代码中的/proc/
。