对于像 init 这样长时间运行的进程,我可以做类似的事情
$ cat /proc/[pid]/io
如果我想查看短暂运行的进程(例如 ls 等命令行实用程序)的统计信息,我该怎么办?我什至不知道如何查看如此短暂运行的进程的pid...
答案1
基本上,听起来您需要有关在运行时分析应用程序 I/O 的一般建议。您已经这样做了,/proc/$PID/io
这将使您了解应用程序的磁盘和内存之间使用了多少带宽。轮询此文件可以让您粗略地了解该过程正在做什么,但它是一个不完整的图片,因为它只显示有多少数据被推送到磁盘或从磁盘推送。
为了解决您提出的问题,您基本上有以下选择:
使用平台仪器。在 Linux 上编写 SystemTap 脚本是功能最完整的解决方案,但取决于您想要的核心程度,这可能比您真正愿意为获得所需的好处而花费的工作量要多。
使用基于应用程序的仪器。有很多方法可以做到这一点,但是gprof 简介是一个受欢迎的选择。某些应用程序可能还提供自己的工具,但您必须检查。
也许,最好的选择是一起使用现有的平台仪表工具来达到预期的效果并充分利用它。
我不知道有哪个程序可以启动应用程序并为您完成所有这一切(并不意味着没有,只是我没有听说过)所以您最好的选择就是开始收集系统范围的信息,并在事后过滤您关心的 PID(以便您获得完整的样本)。
首先,我将启用调用execve
审核,以便您可以保存正在启动的应用程序的 PID。获得 PID 后,您可以删除审核。
运行mount debugfs -t debugfs /sys/kernel/debug
以运行 debugfs,以便您可以运行blktrace
.
在我的系统上我运行了,blktrace -d /dev/sda -a read -a write -o - | blkparse -i -
但你可以相应地调整。以下是 blktrace 输出的一些示例:
8,0 15 3 1266874889.709440165 32679 Q W 20511277 + 8 [rpc.mountd]
在上面的输出中,第五列 ( 32679
) 是与执行写入的应用程序关联的 PID。我们关心的部分是Q
(事件类型,排队)W
(RWBS 字段,W
表示这是一次写入,因为该字段中也没有,S
这意味着它是异步的。)和20511277 + 8
(操作从块号 20511277 开始并继续另外八个块)。确定读/写大小应该只是将块加在一起并乘以块大小。
blktrace
它还会告诉您不仅仅是吞吐量,它还会让您查看您关心的合并是否发生了任何事情。
一旦 blktrace 运行,您可以使用以下命令生成进程strace-c这将使您了解与每个系统调用(包括read
和write
操作)相关的平均延迟。根据每个调用所需的可靠性,延迟可能很重要,它还可以告诉您有关应用程序正在做什么的更多信息(指出需要探索调整的区域),而无需进行任何应用程序检测。
在这两者之间,您应该可以很好地了解程序正在执行的操作,而不会丢失任何数据或可能包括其他应用程序的 I/O。显然,有比我所描述的更多的方法来做到这一点,但这就是我解决问题的方法。
blkparse
例如,我们还应该能够通过扰乱 的输出选项来收集与 I/O 相关的延迟测量。我只是没有这么做,因为我和他们一起玩得还不够。
答案2
您可以在后台启动命令,然后通过变量获取其 pid $!
。
例子:
$ ls & cat /proc/$!/io
[1] 6410
rchar: 7004
wchar: 0
syscr: 13
syscw: 0
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0