郭铁鱼,丁艳荣
(中国人民解放军71282部队 河南 洛阳 471000)
硬盘[1-2]作为计算机的一个主要部件,肩负着记录一切数据信息的重要职责,它的性能对整个系统的性能有直接影响。但硬盘在整机系统中却充当着一个“瓶颈”的角色[3]。目前,磁盘评测软件种类繁多,不同操作系统环境下亦有不同版本。Ziff-Davis Winbench99[4]是硬盘测试中最常用且较权威的测试软件。但Winbench99的测试范围包括整机、CPU、图形等多个方面,磁盘性能测试只是其中的一个主要功能。HDTach[4]提供了硬盘的读写数据传输曲线,最高、最低和平均数据传输率和CPU占用率。Sisoft Sandra[4]是一款综合测试软件,尽管这个测试软件功能不那么强大,但它有着简单的测试结果和清晰的测试界面,且带有一定数量的测试结果可供用户作为参照。Intel IOMeter[3-4]是Intel公司开发的一个专门测试系统I/O(包括磁盘、网络等)速度的软件,用户可以根据需要定制自己的运行环境,功能十分强大。但该软件只能在Win2000或WinNT系统下运行,且测试结果 (输出为txt文件)较复杂。
虽然以上测试软件已相当专业和成熟,功能也非常强大。但测试原理不尽相同,得到的评测结果也有所差别。此外这些测试软件的源代码尚未公开[5-7],测试项目的种类已经固定,无法修改。针对以上缺点,本文设计了一种新的硬盘测试软件,完成以下硬盘参数的测试:磁盘的瞬时、平均、最大数据传输率,单位时间内读操作次数,最大和平均读响应时间,读错误次数,以及CPU利用率等。
硬盘检测程序的主要任务是获取衡量硬盘性能的各参数指标值,因此本方案的核心是对指定测试路径的硬盘或分区进行读操作,统计、计算出所需要的各个参数指标值。
从硬件驱动层上起,在驱动程序一级截获硬盘传输的数据量,再根据各个参数指标的计算方法得到其值。这种方案的优点是,硬盘的数据流量统计准确。但此方案要求对硬盘驱动程序的结构、编程比较清晰,代码量较大。且在驱动程序一级统计出来的数据流量是整个系统的,不是针对某一个具体应用的,所以在实现典型应用环境下的磁盘性能检测时比较困难。
本方案直接调用操作系统提供的API函数,由这些API函数再调用硬盘驱动程序,然后根据API函数的返回值统计硬盘的数据流量。该方案的优点是,在进行典型应用环境中硬盘性能参数测试时,能较方便地实现。缺点是,由于使用了操作系统的API函数,测试结果必然受到操作系统I/O管理及调度策略的影响,给硬盘评测结果带来误差。且此种方法统计得到的I/O流量,只是测试软件的I/O量,并不是硬盘总的I/O。因此,只有当系统中其它程序的I/O很小时,此种方法最终得到的测试结果误差才较小。本文采用此种方案。
硬盘基本性能参数测试模块是一个多线程模块,包括主线程和在测试过程中创建的读操作线程。其中,读操作线程是一个Worker Thread类型的线程[6],进行读操作和变量累加工作;主线程则负责整个测试程序的运行,并对读线程中累加的变量进行计算以得到各个性能参数指标。主线程流程如图1所示,主要包括:测试路径的选择,读操作数据块大小的选择,读操作方式选择,创建读操作线程,在每个定时器消息中进行基本性能参数的计算和显示,以及其他消息的处理。测试开始后,在主线程中会创建一个读操作线程,并设定好定时器。在读操作线程中,用CreateFile函数打开在主线程中选定的路径硬盘驱动器或分区,以获取设备句柄提供给后面的读操作ReadFile使用。如果是随机读操作方式时,每次读操作之前用SetFilePointer函数随机定位要读数据块的扇区号。此外还要在每次读操作ReadFile函数之前,用new[7-9]根据测试数据块大小开辟一个内存空间,以接收数据。读操作结束以后,立即用delete[7-9]释放掉这块内存空间。其流程如图2所示。
图1 主线程框图Fig.1 Block diagram of main thread
本硬盘测试软件中,典型应用环境下的测试分为4种:Web Server、File Server、DataBase Server、Streaming File Server。其中在前3种环境下,主要看硬盘对用户的响应情况,即支持多少个用户,而最后的流式文件服务器测试,由于传输的数据是持续的,主要看其对每个用户所能提供的带宽,即数据传输率。
图2 读操作线程框图Fig.2 Block diagram of read thread
由于硬件环境对测试结果的影响非常的大,所以有必要对一些重要的有参考价值的硬件信息进行检测,以便对测试结果进行合理的分析。检测的信息项目有四项,依次是硬盘信息、CPU信息、内存大小、操作系统信息。
作为一个测试工具,往往需要将测试结果保存起来,以便进行分析,所以记录日志功能也是不可缺少的。在实现时,单独写了一个日志类来进行操作,在类中主要使用了一些和文件操作有关的打开、写文件、关闭等函数。此外,为了方便用户保存日志文件,在将测试结果保存为日志文件之前,需提示用户选择保存的日志文件名和路径。
硬盘基本性能参数测试由用户选定测试路径及读取数据块的大小,然后进行顺序的或者随机的读操作测试。经过多次测试,测试结果呈现出以下两个特点。
1)对于一个选定的测试路径,顺序读操作的测试结果随着读取数据块大小的增加,数据传输率先增大后减小。
选定测试路径为C分区,数据块大小分别选择1 kB、2 kB、4 kB、8 kB、16 kB、32 kB、64 kB、128 kB、256 kB 和 512 kB。图3显示,数据传输率首先随着数据块的增大而增加,当数据块大小为128 kB时,达到最大值;然后当数据块的大小继续增大时,数据传输率开始下降。在其他机器上测试时,数据传输率也呈现出这种趋势,只是达到最大数据传输率的数据块大小有所不同。这表明不同的测试环境都有一个数据传输率的最大值。
图3 C盘不同数据块大小的数据传输率Fig.3 Transfer rate of different data blocks in Cdisk
2)读取相同大小的数据块时,随机读操作测试结果的数据传输率比顺序读操作的测试结果小得多。
在随机读操作时,由于每次所读的扇区是随机的,磁头要进行较长时间的寻道定位工作,所以,单位时间内只能完成较少次数的数据块传输工作,这就导致了随机读操作的数据传输率比顺序读操作的要小得多。但是随机读操作的数据传输率随着测试数据块的增大而增加,这点与顺序读操作时数据传输率随着测试数据块的增大先增加后减少不同。
3.2.1 模拟Web Server测试结果分析
测试时,选择整块硬盘作为测试路径,测试时数据块大小及其典型分布为:512 B 22%、1 kB 15%、2 kB 8%、4 kB 23%、8 kB 15%、16 kB 2%、32 kB%6、64 kB%7、128 kB 1%、512 kB 1%。Web Server的吞吐率如图4所示。图4显示,模拟Web Server环境进行读操作测试时,硬盘所提供的响应次数集中在140~160次之间。
图4 Web Server吞吐率折线图Fig.4 Broken line graph of Web Server's throughput rate
3.2.2 模拟File Server测试结果分析
模拟File Server测试时,数据块的大小及分布情况为:512 B 10%、1 kB 5%、2 kB 5%、4 kB 60%、8 kB 2%、16 kB 4%、32 kB 4%、64 kB 10%。测试时仍然选择整块硬盘作为测试路径,File Server的I/O吞吐率如图5所示。图5显示,模拟File Server环境进行读操作测试时,硬盘所提供的响应次数集中在150-160次之间。
图5 File Server I/O吞吐率折线图Fig.5 Broken line graph of File Server I/O's throughput rate
3.2.3 模拟DataBase Server测试结果分析
模拟Database Server进行测试时,数据块大小分布为512 B、1 kB、2 kB、4 kB。 Database Server的 I/O 吞吐率如图 6所示。图6显示,模拟Database Server环境进行读操作测试时,硬盘所提供的响应次数主要集中在160~180次之间。
图6 Database Server I/O吞吐率折线Fig.6 Broken line graph of Database Server I/O's throughput rate
3.2.4 模拟Streaming File Server测试结果分析
模拟Streaming File Server环境进行测试时,读操作为128 kB的顺序读操作。根据测试结果将用户数户数目从1到6的各种情况的总数据传输率作图7。从图7中可以看出,当只有一个用户的时候,数据传输率较大,基本维持在24.5 MB左右,而这个值与前面普通测试对比,128 kB数据块大小的顺序读操作的数据传输率基本一样。
图7 Streaming File Server多用户环境总的数据传输率折线图Fig.7 Broken line graph of total transfer rate in Streaming File Server multi user environment
本文开发了一种硬盘性能测试软件,使用Visual C++6.0工具和MFC+AppWizard模式。整个测试算法的核心是在读操作线程中调用ReadFile函数发出读操作命令,然后统计操作过程中各种需要的数据量,计算得出各个性能指标。主要完成了以下几个功能:硬盘基本性能参数测试,典型应用环境下的测试,测试环境软硬件信息检测,记录日志功能。在后续工作中还将完成硬盘的写操作测试、硬盘的Burst I/OTest、硬盘CPU占用率的测试、完善测试原理等工作。
[1]谢其中.微型计算机常用外部设备[M].3版.武汉:华中科技大学出版社,2001.
[2]Jeppesen J,Allen W,Anderson S.Memory Products,Network and Computer Storage Hard Disk Controller[C].The Disk Drive's Brain and Body International Conference on Computer Design:VLSI in Computers&,Processors(ICCD'01),2001.
[3]Tools Development Staff.Iometer User’s Guid Intel FCD[S].Copyright(c) 1996-1999 Intel Corporation.
[4]许宏松.如何测试你的硬盘[J].微型计算机,2002(5):42-48.XUHong-song.Howtotestyour hard disk[J].Micro Computer,2002(5):42-48.
[5]David J,潘爱民,王国印.Visual C++ 技术内幕[M].4版.北京:清华大学出版社,1999.
[6]侯俊杰 著.深入浅出 MFC[M].2版.武汉:华中科技大学出版社,2001.
[7]钱能,董灵平,张敏霞.编著 C++程序设计教程[M].北京:清华大学出版社,2000.
[8]Eckel B,刘宗田,袁兆由.C++编程思想:第一卷:标准C++导引[M].2版.北京:机械工业出版社,2002.
[9]Petzold C.Windows程序设计[M].5版.北京:北京大学出版社,2000.