在 Windows 上以编程方式获取每个进程的磁盘 io 统计信息?

Posted

技术标签:

【中文标题】在 Windows 上以编程方式获取每个进程的磁盘 io 统计信息?【英文标题】:Programmatically getting per-process disk io statistics on Windows? 【发布时间】:2010-12-11 00:38:33 【问题描述】:

我想显示一个进程列表(Windows、C++)以及它们从磁盘读取和写入的数量(以 KB/秒为单位)。

Windows 7 的资源监视器有这个能力,所以我应该也能做到。

但是,我无法找到相关的 API 调用或在 perfmon 计数器中找到任何内容。谁能给我指个方向?

【问题讨论】:

我认为事件跟踪 (ETW) 是唯一的出路……但是像样的 ETW 示例非常稀缺…… 【参考方案1】:

您可以致电 GetProcessIoCounters 以获取每个进程的整体磁盘 I/O 数据 - 您需要自己跟踪增量并转换为基于时间的速率。

此 API 将告诉您 I/O 操作的总数以及总字节数。

【讨论】:

如果这不能让你到达那里,你可能不得不四处挖掘并编写一个 WMI 查询。 GetProcessIoCounters() 不是为您提供包括网络在内的所有 IO 操作吗? 这为您提供磁盘 i/o、网络 i/o 和其他,如串行 i/o【参考方案2】:

WMI 可以做到,只要您定期对其进行快照以获取某个“最近”时间片的差异统计信息。 This post 提供了一种特殊的混合解决方案,VBScript 从 WMI 读取信息,Perl 不断在 Windows 控制台中呈现信息。尽管有奇怪的语言组合,但我认为它是如何获取所需信息的一个很好的例子(当然,应该很可能用 C++ 重新编码所有这些信息)。

【讨论】:

再次,所有 IO 操作的总数(与 GetProcessIoCounters() 相同)

以上是关于在 Windows 上以编程方式获取每个进程的磁盘 io 统计信息?的主要内容,如果未能解决你的问题,请参考以下文章

可以在每个会话的基础上以编程方式启用/禁用 DPI 缩放吗?

如何在 Android 上以编程方式从 Mac 地址获取 IP 地址?

如何使用 C 在 Linux 上以编程方式杀死进程树

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

在 Windows 上以编程方式降速硬盘?

如果 Itunes:Keep iTunes Folder Organized 在 Windows 上以编程方式设置,我该如何解决