【问题标题】:DISK_PERFORMANCE struct's ReadTime and WriteTime membersDISK PERFORMANCE 结构读取时间和写入时间成员
【发布时间】:2012-02-13 10:12:31
【问题描述】:

我正在尝试剖析 DISK_PERFORMANCE 结构,但似乎找不到任何像样的文档。有谁知道 ReadTime 和 WriteTime 成员是什么意思?

MSDN 声称“完成读/写所需的时间”,但读/写是什么?还有它是用什么来衡量的?

【问题讨论】:

    标签: c++ performance winapi performancecounter


    【解决方案1】:

    更新:我不知道,但我现在知道了。

    我不熟悉 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 为单位花费在读取上的总时间。

    【讨论】:

    • @ahmd0:如果您看到我的原始答案,我不会,但我已经更新了。
    • 非常感谢。不好意思推迟了。一直很忙。所以从你所说的我可以确定驱动器的读/写速度,对吗?
    • 例如,要查找驱动器的当前读取速度,我可以在某个时间间隔(例如 500 毫秒)内获得 DISK_PERFORMANCE 结构 2 次,然后我可以这样做:ReadSpeedInBytesPerSecond = (BytesRead - LastBytesRead) * (10000000.0 / (ReadTime - LastReadTime));你能确认一下吗?
    • @ahmd0:我实现了您的公式,并且我从 perfmon 和资源监视器获得了可比较的结果(所有内容大约为 50MB/秒)。代码为:double bytespersec = (nextPerf.BytesRead.QuadPart - diskPerf.BytesRead.QuadPart) * (10000000.0 / (nextPerf.ReadTime.QuadPart - diskPerf.ReadTime.QuadPart))
    • @ahmd0:所以我以适度的使用(而不是复制一个大文件)运行了一个小时,读取速度为 2MB/s,写入速度为 17MB/s。我猜写缓存解释了这一点,正如我上面建议的那样。
    【解决方案2】:

    一般来说,就像所有的 DeviceIOControl 一样,它意味着任何底层驱动程序的含义。从StorageManagerName 成员可以推断,有多个驱动程序使用此结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 2019-05-25
      • 2021-12-09
      相关资源
      最近更新 更多