使用fio测试磁盘I/O性能
前言
fio是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。
- 简单好用的磁盘性能测试工具
测试准备
工具:fio- Flexible IO Tester
官网:
[http://freecode.com/projects/fio] (http://freecode.com/projects/fio)
[http://brick.kernel.dk/snaps/] (http://brick.kernel.dk/snaps/)
扩展阅读:
fio man:[http://linux.die.net/man/1/fio] (http://linux.die.net/man/1/fio)
注意:性能测试建议直接通过写裸盘的方式进行测试,会得到较为真实的数据。但直接测试裸盘会破坏文件系统结构,导致数据丢失,请在测试前确认磁盘中数据已备份。
安装:
1 2 3 4 5 6 7 8 | #yum安装 yum install libaio-devel fio #手动安装 yum install libaio-devel wget http://brick.kernel.dk/snaps/fio-2.2.10.tar.gz tar -zxvf fio-2.2.10.tar.gz cd fio-2.2.10 make $ make install |
fio用法
- fio分顺序读,随机读,顺序写,随机写,混合随机读写模式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | filename=/dev/sdb1 #测试文件名称,通常选择需要测试的盘的data目录 direct=1 #测试过程绕过机器自带的buffer。使测试结果更真实 rw=randwrite #测试随机写的I/O rw=randrw #测试随机写和读的I/O bs=16k #单次io的块文件大小为16k bsrange=512-2048 #同上,提定数据块的大小范围 size=5G #本次的测试文件大小为5g,以每次4k的io进行测试 numjobs=30 #本次的测试线程为30个 runtime=1000 #测试时间1000秒,如果不写则一直将5g文件分4k每次写完为止 ioengine=psync #io引擎使用psync方式 rwmixwrite=30 #在混合读写的模式下,写占30% group_reporting #关于显示结果的,汇总每个进程的信息 lockmem=1G #只使用1g内存进行测试 zero_buffers #用0初始化系统buffer nrfiles=8 #每个进程生成文件的数量 |
实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #顺序读 fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest #顺序写 fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest #随机读 fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest #随机写 fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest #混合随机读写 fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=100 -group_reporting -name=mytest -ioscheduler=noop |
也可以添加到配置文件里测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #复制下面的配置内容,将directory=/path/to/test修改为你测试硬盘挂载目录的地址,并另存为fio.conf [global] ioengine=libaio direct=1 thread=1 norandommap=1 randrepeat=0 runtime=60 ramp_time=6 size=1g directory=/path/to/test [read4k-rand] stonewall group_reporting bs=4k rw=randread numjobs=8 iodepth=32 [read64k-seq] stonewall group_reporting bs=64k rw=read numjobs=4 iodepth=8 [write4k-rand] stonewall group_reporting bs=4k rw=randwrite numjobs=2 iodepth=4 [write64k-seq] stonewall group_reporting bs=64k rw=write numjobs=2 iodepth=4 #测试 fio fio.conf |
- 测试结果主要关注bw和iops结果
bw:磁盘的吞吐量,这个是顺序读写考察的重点
iops:磁盘的每秒读写次数,这个是随机读写考察的重点
硬盘性能指标
顺序读写 (吞吐量,常用单位为MB/s):文件在硬盘上存储位置是连续的。
适用场景:大文件拷贝(比如视频音乐)。速度即使很高,对数据库性能也没有参考价值。
4K随机读写 (IOPS,常用单位为次):在硬盘上随机位置读写数据,每次4KB。
适用场景:操作系统运行、软件运行、数据库。