PCEVA,PC绝对领域,探寻真正的电脑知识
打印 上一主题 下一主题
开启左侧

Windows环境下使用fio测试磁盘性能

[复制链接]
跳转到指定楼层
1#
点击数:17551|回复数:2
本帖最后由 larryexchange 于 2014-10-7 15:31 编辑

之前写过一个帖子是有关如何在Windows环境下使用fio测试磁盘性能的,可惜网站出问题后这个帖子也丢了。最近买了也入手不少盘,这些盘基本我都会用fio来测试他们的稳定性和性能(这中间的确出现过大压力下掉盘,或者AS SSD得分很高但全盘持续测试下表现糟糕的情况)。所以想到把以前的那个帖子再复刻出来,相信通过这一段时间的使用,理解上面也更多了一点。
--------------------------------------------------------------------
讲到fio,首先这是个开源项目(http://git.kernel.dk/?p=fio.git),有关它的历史可以看FIO的HOWTO文档。下面的翻译文字部分摘自CSDN:
fio最初是用来节省为特定负载写专门测试程序,或是进行性能测试,或是找到和重现bug的时间。类似的测试程序,有专门测试SQL磁盘IO的SQLIO,和专门测试Exchange磁盘性能的JetStress。写这么一个测试应用是非常浪费时间的。因此需要一个工具来模拟给定的io负载,而不用重复的写一个又一个的特定的测试程序。但是test负载很难定义。因为可能会产生很多进程或线程,他们每一个都用他们自己的方式产生io。fio需要足够灵活得来模拟这些case。它之所以牛,很重要的原因就是因为其灵活性,光支持的IO引擎就有19种,不过多数这些引擎都是Linux上的。

所以在使用fio的时候可以写一个job文件来描述要访真的io负载。一个job文件可以控制产生任意数目的线程和文件。典型的job文件有一个global段(定义共享参数),一个或多少job段(描述具体要产生的job)。运行时,fio从文件读这些参数,做处理,并根据这些参数描述,启动这些访真线程/进程。

这里介绍的是另一中简易的方法,直接通过附加参数的方式直接运行fio。这个方式适合一写简单任务的测试,比如这里常见的特定IO大小的随机连续读写测试,比如4K 100%随机写。

在所有的测试前,第一步当然是要安装fio,你可以从下面的网址下载编译好的不同版本的Windows下的fio。
http://www.bluestop.org/fio/
安装后在C:\Program Files\fio目录中可以找到fio的执行程序和相应的文档。

第二步是找到要测试的是那块盘的序号,不是盘符(C盘或D盘)而是系统当前识别的磁盘序号。可以通过diskpart,如下图所示的方法。这里的Disk后面的编号就是我们后面在\\.\PhysicalDrive 后面要加的编号。


也可以直接打开磁盘管理器,查看磁盘边上的编号

注意如果要做全盘写测试,需要删除这个磁盘上的分区。我们同样可以通过diskpart或者磁盘管理器来做。

这里我们通过几个我常用的命令来介绍它的使用方法。
第一个命令用于对磁盘0进行全盘写
fio.exe --name=4kwritetest --rw=randrw --direct=1 --iodepth=8 --blocksize=4k --ioengine=windowsaio --filename=\\.\PhysicalDrive0 --numjobs=8 --refill_buffers --norandommap --randrepeat=0 --rwmixread=0 --group_reporting --runtime=1800 --thread
下面逐一对使用的参数做介绍:
--name=4kwritetest 这里不过是给我们的测试起了一个有意义的名字,你可以在=后输入任何字符。
--rw=randrw randrw是随机读写,后面的几个例子我们还会用到别的值,如read就是连续读,write就是连续写。至于这里读写的比率由后面的--rwmixread来决定。
--direct=1 这里1表示使用non-buffered IO。
--iodepth=8 这里表示的每个测试线程的队列深度为8。
--blocksize=4k IO大小为4KB。
--ioengine=windowsaio IO引擎是Windows的异步IO引擎。
--filename=\\.\PhysicalDrive0 这里就是我们要测试的磁盘了。
--numjobs=8 同时测试的线程数量(这个值乘以上面的iodepth就是对磁盘产生的实际队列深度,这里8X8,所以实际队列深度为64)
--refill_buffers 这个选项告诉fio将在每次submit之后都会将重新填满IO buffer。否则fio会在初始时填满,以后重复利用。
--norandommap 一般情况下,fio在做随机IO时,将会覆盖文件/磁盘的每一个block。如果这个选项设置的话,fio将只是获取一个新的随机offset,而不会查询过去的历史。这意味着一些块可能没有读或写,一些块可能要读/写很多次。
--randrepeat=0 对于随机IO负载,配置生成器的种子,使得路径是可以预估的,使得每次重复执行生成的序列是一样的。
--rwmixread=0 这里读写比率是0,表示100%写,下面100%随机读测试中,这个值设置为100
--group_reporting 由于我们有8个线程,为了让报告可读性更强,让fio把8个线程的结果汇总后展现。
--runtime=1800 运行30分钟。
--thread 由于使用了多线程,这个参数必须加上。

这是测试开始时的截图

从上面可以看出开始执行的时候,这块盘的IOPS基本在80,000多。

下面是半小时后结束时的报告,可以看到这是IOPS出现了一定范围的波动,从70,000到81,000。30分钟后报告中显示平均IOPS为81,257。

从上面的报告中出了IOPS以外,还可以看到磁盘延迟(LAT),包括最大值、平均值和标准差和测试结果的统计分布。这里M500DC的延迟的最大值是94.278ms。如果看延迟数据的分布,可以看到这快盘约13.63%的延迟在0.75ms一下,85.91%的延迟在0.75ms到1ms之间。而超过20ms的数据只有0.02%。

下面是另外我常用的几个例子,就不一一解释了,大家可以参考上面的参数说明自己看看。
全盘4KB随机读
fio.exe --name=4kreadtest --rw=randrw --direct=1 --iodepth=8 --blocksize=4k --ioengine=windowsaio --filename=\\.\PhysicalDrive0 --numjobs=8 --refill_buffers --norandommap --randrepeat=0 --rwmixread=100 --group_reporting --runtime=1800 --thread
全盘128KB连续读
fio.exe --name=128kreadtest --rw=read --direct=1 --iodepth=8 --blocksize=128k --ioengine=windowsaio --filename=\\.\PhysicalDrive0 --numjobs=8 --group_reporting --runtime=1800 --thread
全盘128KB连续写
fio.exe --name=128kwritetest --rw=write --direct=1 --iodepth=8 --blocksize=128k --ioengine=windowsaio --filename=\\.\PhysicalDrive0 --numjobs=8 --group_reporting --runtime=1800 --thread

最后完整的参数及使用说明还是参考安装目录下的HOWTO文档。

(为了节省论坛资源,这里的截图除了第一张以外都来自我发的以前的一些帖子。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
2#
xmiangui 发表于 2014-11-14 13:34 | 只看该作者
以前收藏的,最近发现找不到了,结果又给我搜索出来了,补档好评
3#
neeyuese 发表于 2014-11-14 13:43 | 只看该作者
我现在Windows下用Iometer,Linux下用FIO。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部