我正在尝试使用 Windows 性能监视器比较某些进程的 io 操作与总磁盘操作。
我使用了以下计数器:
\PhysicalDisk(_Total)\Disk Reads/sec
, 和\Process(<process_name>)\IO Read Operations/sec
在对每个计数器的结果进行汇总后,我注意到该进程执行的 IO 读取操作比磁盘读取操作多 3 倍。我还尝试比较仅读取文件(没有任何其他操作)的虚拟进程的 IO 读取和总磁盘读取操作,再次发现进程读取操作的数量高于总磁盘读取操作。
有时, 的结果总和也\Process(<process_name>)\IO Read Bytes/sec
高于 的结果总和\PhysicalDisk(_Total)\Disk Read Bytes/sec
。
这怎么可能?
答案1
我认为系统文件缓存可能是造成这些结果的原因。
当进程读取文件时,它不一定从磁盘读取。如果此文件之前已被任何进程读取,则它可能会长时间保留在系统文件缓存中(尤其是当主机有大量可用内存时)。因此,当另一个进程再次读取此文件时,它将从内存中读取,这就是\PhysicalDisk(_Total)\Disk Reads/sec
计数器不会增加的原因。
您可以阅读有关 Windows 中的系统文件缓存的更多信息这里。
答案2
首先:并非所有 IO 都进入磁盘。尝试一个简单的网络守护程序,它根本不产生磁盘 IO。
接下来:进程的 IO 不等于系统的 IO。考虑一个简单的虚拟应用程序,它打开一个文件(位于 512B/扇区的磁盘上),然后每秒读取一个字节。进程每秒会看到一个磁盘 IO,而系统每 512 秒只会看到一个磁盘 IO。这是因为系统只能以块大小的块读取,而应用程序可以以任意量读取。
此外:即使 Windows 也做了一些基本的电梯工作:磁盘请求不会像排队一样严格满足,但它们会被分类、优先处理并可能合并。后者将导致 IO 减少。再次考虑一个虚拟程序,它除了一遍又一遍地用不同的值覆盖文件中的相同字节之外什么也不做。该进程将以非常高的速率看到 IO 操作,但并非每个写入都会真正到达磁盘(如果进程没有明确请求)。大量的 IO 将在写回时合并为一个。