【发布时间】:2012-02-13 10:12:31
【问题描述】:
我正在尝试剖析 DISK_PERFORMANCE 结构,但似乎找不到任何像样的文档。有谁知道 ReadTime 和 WriteTime 成员是什么意思?
MSDN 声称“完成读/写所需的时间”,但读/写是什么?还有它是用什么来衡量的?
【问题讨论】:
标签: c++ performance winapi performancecounter
我正在尝试剖析 DISK_PERFORMANCE 结构,但似乎找不到任何像样的文档。有谁知道 ReadTime 和 WriteTime 成员是什么意思?
MSDN 声称“完成读/写所需的时间”,但读/写是什么?还有它是用什么来衡量的?
【问题讨论】:
标签: c++ performance winapi performancecounter
更新:我不知道,但我现在知道了。
我不熟悉 DISK_PERFORMANCE,但我熟悉 HKEY_PERFORMANCE_DATA 性能数据。
Avg. Disk sec/Read 计数器报告每次读取的平均时间(还有另一个用于写入的计数器)。此计数器具有PERF_AVERAGE_TIMER 类型。你实际得到的数据是阅读的总时间和操作的总数。您获取两个样本并减去这些值以获得在采样间隔期间读取所花费的总时间以及在采样间隔期间的操作总数。然后,您将这两个值相除以获得每次读取的平均时间。
时钟频率也会与性能数据一起返回,因此您可以将时间单位转换为秒。
假设 DISK_PERFORMANCE 的工作方式类似,则 ReadTime 和 WriteTime 将是所有读取和写入所花费的总时间。不幸的是,它使用的时钟频率并不明显,但它很可能使用来自QueryPerformanceFrequency 的值。我会尝试一下,看看结果(平均读写时间)是否与您在 perfmon 中看到的值进行比较。
头文件 (winioctl.h) 没有包含太多有用的信息,但它确实表明 IOCTL_DISK_PERFORMANCE 请求被转发到 DISKPERF 过滤器驱动程序或 SIMBAD 过滤器驱动程序(模拟磁盘故障)。这意味着您应该在不同的设备类型上获得一致的结果。
更新
所以我做了研究。一些示例数据:
3579000, 42, 801881, 42, 4.46325577
3749000, 79, 839970, 79, 4.46325464
4076000, 66, 913235, 66, 4.463254255
3614000, 77, 809723, 77, 4.463254718
1465000, 28, 328236, 28, 4.46325205
每一行都有来自 DISK_PERFORMANCE 的 ReadTime 和 ReadCount 成员的增量(每秒采样一次),后跟来自 HKEY_PERFORMANCE_DATA 的相应值,然后是第一个 ReadTime 除以第二个。
HKEY_PERFORMANCE_DATA 值以 QueryPerformanceFrequency 为单位,在我的 PC 上为 2240517Hz。 10,000,000 / 2240517 = 4.4633 因此 DISK_PERFORMANCE 指标似乎以 100ns (=10MHz) 为单位。
重申一下,DISK_PERFORMANCE::ReadTime 是以 100ns 为单位花费在读取上的总时间。
【讨论】:
double bytespersec = (nextPerf.BytesRead.QuadPart - diskPerf.BytesRead.QuadPart) * (10000000.0 / (nextPerf.ReadTime.QuadPart - diskPerf.ReadTime.QuadPart))
一般来说,就像所有的 DeviceIOControl 一样,它意味着任何底层驱动程序的含义。从StorageManagerName 成员可以推断,有多个驱动程序使用此结构。
【讨论】: