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

标签 linux performance io profiling

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

背景: 我试图找出磁盘缓慢对应用程序缓慢的影响。换句话说:应用程序必须等待磁盘操作完成多长时间(以毫秒为单位)?

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

CPU 时间是在 *rusage 上提供的wait4()的结构或 getrusage()功能,但没有 IO 等待时间。

顶部显示的 IO 等待时间没有帮助,因为它是按一段时间内的比率计算的(% = IOwait_time/Idle_Time over last 5 seconds)。基于此信息,无法可靠地计算进程在整个生命周期内的累积 IO 等待时间。

我不能做任何繁重的用户空间分析,因为它会减慢应用程序的速度。在最好的情况下,我想在子进程终止时收集进程的总 IO 等待时间。

来自答案和评论:

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

@gavv:讨论了在退出之前捕获进程的好方法: Extract all statistic of a process from /proc just before the process exit (Linux)

@盖乌斯mentions他仍然能够阅读/proc/<pid>/stat即使在进程退出后不久。

最佳答案

查看 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 方法可能会使您的系统变得笨拙(因为许多进程将无法退出),因此另一种方法是通过 连接一个负责显示统计信息的函数>/proc/ 文件系统。相关代码在内核源码中的/fs/proc/stat.c

关于linux - 是否可以测量 Linux 进程的累积 IO 等待时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49734845/

相关文章:

php - 查找最活跃的玩家(表中满足条件的条目数最多)

java - "garbage collection rate"是什么意思,它能提供什么好处?

haskell - 如何从 Haskell 中任意类型 [a] 的标准输入中读取列表?

linux - 在 linux 终端中查找并删除文件名中包含相同字符串的文件

php - 我如何计时PHP的microtime本身?

python read(4) 返回长度为 1 而不是 4 的字符串

c++ - 确定流结束时的 EOF 问题

linux - DMZ 上单个 Linux 服务器中多个站点的 WordPress 实现

php - Excel 导出 : browser hangs up

linux - 如何将 qsub 输出流定向到 pwd 而不是 home