Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以测量Linux进程的累积IO等待时间?_Linux_Performance_Io_Profiling - Fatal编程技术网

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

是否可以测量Linux进程的累积IO等待时间?,linux,performance,io,profiling,Linux,Performance,Io,Profiling,在Linux上,我可以使用哪个C API获取退出子进程的磁盘IO等待总时间(绝对值)?例如,PID为1234的进程运行10秒,等待IO操作完成3秒 背景: 我试图找出磁盘的慢度在多大程度上导致了应用程序的慢度。换句话说:应用程序需要等待多长时间才能完成磁盘操作,以毫秒为单位 虽然Linux内核在IO上提供了每个进程的一些统计信息(/proc//IO),但我没有找到任何方法来获取正在运行(已完成)进程的累积等待时间 CPU时间通过wait4()或getrusage()函数的*rusage结构提供,

在Linux上,我可以使用哪个C API获取退出子进程的磁盘IO等待总时间(绝对值)?例如,PID为1234的进程运行10秒,等待IO操作完成3秒

背景: 我试图找出磁盘的慢度在多大程度上导致了应用程序的慢度。换句话说:应用程序需要等待多长时间才能完成磁盘操作,以毫秒为单位

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

CPU时间通过
wait4()
getrusage()
函数的
*rusage
结构提供,但没有IO等待时间

顶部显示的IO等待时间没有帮助,因为它是按一段时间内的速率计算的(%=IOwait\u time/Idle\u time over last 5 seconds)。基于此信息,不可能可靠地计算进程在其生命周期内的累积IO等待时间

我无法进行任何大量的用户空间分析,因为这会降低应用程序的速度。在最好的情况下,我希望在子进程终止时收集进程的总IO等待时间

来自答案和评论:

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

@gavv:讨论了在退出前捕获进程的好方法:


@盖尤斯说,即使在流程退出后不久,他仍然能够阅读
/proc//stat

检查
人工流程
,每个流程的
/proc/stat
条目:

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

根据您想要达到的精度,“实用”方法可以获得值范围,从每隔
n
秒运行一次后台脚本到
cat/proc/pid/stat
到使用
kprobes
陷阱
系统退出
和读取
/proc/pid/stat
,同时防止进程退出


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

非常感谢@emmrk提供的有用提示!您是否可以用以下信息扩展答案:收集此iowait变量最终值的实用方法是什么?中的用户Gaius建议在使用wait()调用收集进程状态后读取/proc条目,但它保证工作吗?没有明确承诺在进程退出后保留/proc/[pid]。激活on进程可能是一个合适的答案,但如果在许多进程上激活它,会有什么开销?答案仍然有点模糊。我希望从问题的上下文来看,我需要一个C API来收集IO等待时间,而不是一个shell脚本或分析工具。我对通过轮询获得的中间结果也不感兴趣,而是对IO等待时间计数器的最终状态感兴趣。“让我知道我是否应该调整这个问题,使它更清楚。”安东戈卢贝夫说,这一点都不明显<代码>kprobe不是严格的分析。如果您想要C API,则没有。但是您可以使用与计算
iowait
/fs/proc/stat.C
中所示的方法相同的方法。我刚刚意识到,/proc//stat文件的每个进程版本不包括有关进程IO等待时间的信息,就像/proc/stat一样。我错过什么了吗?