这次我主要给大家介绍一下Windows磁盘性能分析的原理和主要参考指标的一些计算方法。 希望对大家有一些借鉴意义。
Windows磁盘性能主要依赖于其内核驱动partmgr.sys(partition manager)。该驱动在整个存储设备堆栈中处于中间位置,在Disk Class Driver (disk.sys)和文件系统驱动中间。如下图:
这意味着每个发向磁盘的IO (在Windows系统中又IRP代表),都会经过partmgr.sys。那么该驱动也就有机会记录很多关于磁盘的统计信息。
举个例子,当某个IO发向磁盘之后,经过partmgr.sys的时候驱动就会记录该IO的一些信息,比如经过的时间。而当IO完成的时候,最后会调用partmgr.sys的completion routine,该驱动也就有机会记录IO完成的时间,两者相减就可以得到单个IO的处理时间,对大量IO来说就可以得出统计意义上的平均数据 - Disk sec/Transfer。
再举个例子,对于单个IO,当经过partmgr.sys的时候,驱动就会对其内部计数器加1,当IO完成的时间内部计数器就会减1。那么在平时我们就可以从该计数器得知一共有多少IO尚未完成,平均以后就得到了性能监视器中的平均队列长度 - Avg. Disk Queue Length。
那么我们再来谈一谈所有性能监视器(perfmon)中那些关于磁盘的计数器对象,究竟那些指标代表了磁盘性能:
Disk Bytes/sec
该计数器代表了磁盘的吞吐量,也就是每秒钟有多少字节读写磁盘。他其实取决于两个方面:
从应用或者系统层面产生了多少IO压力。
磁盘性能。
也就是说如果应用或者系统层面没有对磁盘产生压力,它的数值也不会上升。即使它的数值很高,也很有可能是因为应用产生了大量的IO,而不能因此判断磁盘的性能存在问题。
% Idle Time
该技术器代表了磁盘的空闲程度,我们之前提到内部计数器来跟踪磁盘有多少未完成的IO,当该数值为非0时,性能监视器就认为磁盘的繁忙的。为0时,自然就认为磁盘是空闲的。但是即使磁盘一直有未能完成的IO,磁盘依然有可能及时地完成每一个IO,这样也就谈不上磁盘的性能问题。
Avg. Disk Queue Length
这个数值也就是从我们之前提到的内部计数器得来的,试想这样一种情况,磁盘的IO压力很大,如果我们的内部计数器数值很高,也就代表没有完成的IO很多,但是磁盘能够快速地完成每一个IO,这种情况我们能否认为磁盘性能是有问题的?答案是不能,如果磁盘能够快速地完成每一个IO,自然磁盘性能是正常的。
Disk sec/Transfer
根据我们之前的所有分析,这个数值是真正代表磁盘性能的。说如果该数值很高(一般超过50ms),那么应用会很明显地感受每一个交给磁盘的IO回复得很慢,也就会导致应用产生性能问题。