是否可以测量Linux进程的累积IO等待时间?
在Linux上,我可以使用哪个C API获取退出子进程的磁盘IO等待总时间(绝对值)?例如,PID为1234的进程运行10秒,等待IO操作完成3秒 背景: 我试图找出磁盘的慢度在多大程度上导致了应用程序的慢度。换句话说:应用程序需要等待多长时间才能完成磁盘操作,以毫秒为单位 虽然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结构提供,
/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一样。我错过什么了吗?