【发布时间】:2015-05-26 05:28:51
【问题描述】:
有一个 WinAPI 函数 GetProcessIoCounters 提供给定进程的所有 I/O 操作的详细信息:读/写操作数和自进程启动以来读/写的字节数。很可能任务管理器使用此功能来显示这些数字:
有没有一种相对简单的方法来获得相同或相似的统计数据,但对于整个系统,因为它开始?
请注意,它与枚举所有当前进程并总结GetProcessIoCounters的结果是不一样的,因为有进程启动,运行一段时间并结束。在我打电话给GetProcessIoCounters的时候,这样的进程已经不存在了,但是我想知道系统的整体I/O。
我打算每隔一小时左右收集一次这些统计数据并将它们记录到数据库中以供将来分析和帮助调试。
我正在寻找一种在没有 WMI 的情况下在 Windows XP 上工作的方法(我们使用显着缩减的 Windows XP Embedded),但如果这种方法仅适用于更高版本的 Windows,请分享。最终它会很有用。
更新
我尝试了Jerry Coffin建议的DeviceIoControl(IOCTL_DISK_PERFORMANCE)方法。
我必须运行diskperf.exe -Y 才能使其工作。我什至不必重新启动,但没有它DeviceIoControl 失败并出现GetLastError=31(连接到系统的设备无法运行。)DeviceIoControl 在重新启动后继续工作,无需再次运行diskperf.exe -Y ,但重新启动后对DeviceIoControl 的第一次调用在所有字段(BytesRead、BytesWritten、ReadCount、WriteCount)中返回零。进一步的调用返回非零统计数据。显然,系统启动时有一些实质性的磁盘活动,但没有计算在内。因此,看起来重启后对DeviceIoControl 的第一次调用确实启用/启动了计数器。
如果我运行diskperf.exe -N,那么DeviceIoControl 会立即停止工作,无需重新启动。当我运行diskperf.exe -Y 时,DeviceIoControl 又可以正常工作了。
现在的问题是:diskperf.exe -Y 做了什么以及如何在我的程序中做同样的事情?
更新 2
我在diskperf.exe -Y 和diskperf.exe -N 之后导出了整个注册表并寻找不同之处。我能找到的唯一区别在于一个键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PartMgr
"EnableCounterForIoctl"=dword:00000001
diskperf.exe -Y 添加此密钥,diskperf.exe -N 删除它。
我尝试将这个键直接添加/删除到注册表中。
如果密钥不存在并且DeviceIoControl 不起作用(在我运行diskperf.exe -N 之后),我会像这样添加这个密钥:
reg add "HKLM\SYSTEM\CurrentControlSet\Services\PartMgr" /v EnableCounterForIoctl /t REG_DWORD /d 1
,然后DeviceIoControl 立即开始工作。
如果密钥存在并且DeviceIoControl 有效(在我运行diskperf.exe -Y 之后),我会像这样删除这个密钥:
reg delete "HKLM\SYSTEM\CurrentControlSet\Services\PartMgr" /v EnableCounterForIoctl
然后DeviceIoControl 继续工作,返回的统计数据不断增长。直到重启。
diskperf.exe 除了更改注册表值之外,还必须执行其他操作,例如强制刷新/刷新注册表。就我而言,我关心启用这些计数器,并且它似乎可以通过简单地添加注册表项来工作。
【问题讨论】: