在Mac OS X中的每个进程磁盘读/写统计信息

28

如何在Mac OS X中以编程方式获取每个进程的磁盘I/O统计信息。在“Activity Monitor”应用程序或“top”命令中,我们只能获取整个系统的磁盘I/O统计信息。
参考类似问题 PC 上提出的。


@Anoop 这是处理器监控工具的一部分,不是用于黑客攻击。 - Raviprakash
5个回答

37

使用iotop(作为root用户),例如:

iotop -C 3 10

但是对我来说,最好的方法是:

sudo fs_usage -f filesys

非常方便。iotop只告诉我mds和mdworker正在猛烈地使用我的磁盘。fs_usage显示了Mail.app中正在索引的无数文件,因此指出了问题所在的正确方向。 - ski_squaw
8
请注意,在El Capitan系统中,iotop无法工作,因为iotop依赖于dtrace。而El Capitan的根浸(SIP)模式会禁用dtrace - bric3
2
这在 Sierra 上也是有问题的。 - user189198

4

由于这里没有关于如何以编程方式执行此操作的答案,因此在此提供更多信息。如果您可以使用C/C++/ObjectiveC ++,则可以从libproc中获取一些信息。函数proc_pid_rusage为给定进程提供了大量资源信息,但与您的问题相关的是:

struct rusage_info_v3 {
    ...
    uint64_t ri_diskio_bytesread;
    uint64_t ri_diskio_byteswritten;
    ...
};

示例代码:

pid_t pid = 10000;
rusage_info_current rusage;
if (proc_pid_rusage(pid, RUSAGE_INFO_CURRENT, (void **)&rusage) == 0)
{
    cout << rusage.ri_diskio_bytesread << endl;
    cout << rusage.ri_diskio_byteswritten << endl;
}

请查看<libproc.h><sys/resource.h>了解更多信息。

但是 proc_pid_rusage 总是返回 -1,错误码为 22。 - holybiner

3

由于OP特别询问了磁盘I/O统计信息,我建议

sudo fs_usage -f diskio

与接受的答案中提到的-f filesys相反,该选项仅关注读/写事件。(不知道当时是否不存在diskio选项。)


2

活动监视器在“磁盘”选项卡中显示每个进程的I/O统计信息(也许这是自提问以来的新功能)。请查看“字节写入”和“字节读取”列。enter image description here


4
这些是过程终身内的总计数,不显示类似于top或iotop的周期/当前统计信息。 我不知道为什么苹果认为这些统计信息有用。 人们想要像iotop一样的功能。 - theferrit32
我最后只能按“写入字节数”之类的顺序进行排序,并用眼睛手动跟踪增量。很遗憾,这完全不是编程式的。 - rogerdpack
你知道这些聚合计数是怎么产生的吗?它只是不断地对所有小的磁盘写入/读取进行求和吗?我可以通过终端访问那些聚合数字吗? - alexx0186
@theferrit32 为什么你认为聚合计数没有用?如果“人们”想要iotop输出,他们可以使用iotop。 - Jake

1
我发现了 iStat Menus,它位于菜单栏中。只显示前 5 个磁盘读/写用户(我不确定是否为总和,但它不会排序)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接