FIO相关知识汇总

fio - Flexible IO Tester

1.安装

a.下载地址:http://freshmeat.sourceforge.net/projects/fio/
b.安装两个插件
#yum install libaio*
#yum install zilb*
c.编译安装
#tar -xvf fio-2.1.10.tar.gz
#cd fio-2.1.10
#./configure
#make
#make install

2.fio执行脚本顺序

1)Secure erase the drive
2)Prefill the drive with Sequential Write (128K Sequential Write QD=32 / size=100% with loops=1 / numjobs=1)
3)128K 100% Sequential Write (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)
4)128K 100% Sequential Read (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)
5)Prefill the drive with randwrite (4K randwrite QD=32 / runtime=3hr / numjobs=1)
6)4K 100% Random Read (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)
7) 4K 100% Random Write (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)
注意事项:
a.硬盘应直接主板,但如通过Raid Card连接应将硬盘设置为JBOD。
b.硬盘测试前一定要进行安全擦除。
c.顺序读、顺序写前可以不添加稳态处理。
d.随机读、随机写前一定要有randwrite 2h左右的稳态处理,如果没有添加会影响Random write。下图就是在随机读写前未加稳态处理时,rand_write iops的图
在这里插入图片描述
e.测试时间runime的值应不低于1h,如果时间很短没有测试实际意义。

3.执行脚本,以SATA接口硬盘为例:

#!/bin/bash
#Script of precondition:128K IOPS
fio --ioengine=libaio --direct=1 --thread --norandommap --filename=/dev/sda --name=init_seq --output=init_seq1.log --rw=write --bs=128k --numjobs=1 --iodepth=32 --loops=1

#128k Seq Write
fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=7200 --time_based --numjobs=1 --iodepth=32 --filename=/dev/sda --rw=write --bs=128k --output=128K_seqW.log --log_avg_msec=1000 --write_iops_log=128K_seqW_iops.log --write_lat_log=128K_seqW_lat.log --write_bw_log=128K_seqW_bw.log
#128k Seq Read
fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=7200 --time_based --numjobs=1 --iodepth=32 --filename=/dev/sda --rw=read --bs=128k --output=128K_seqR.log --log_avg_msec=1000 --write_iops_log=128K_seqR_iops.log --write_lat_log=128K_seqR_lat.log --write_bw_log=128K_seqR_bw.log

#randwrite prepare
fio --ioengine=libaio --direct=1 --thread --norandommap --filename=/dev/sda --name=init_seq --output=init_seq2.log --rw=randwrite --bs=4k --numjobs=1 --iodepth=32 --loops=2  #about 2h

#4k Random Read
fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=7200 --time_based --numjobs=1 --iodepth=32 --filename=/dev/sda --rw=randread --bs=4k --output=4K_randR.log --log_avg_msec=1000 --write_iops_log=4K_randR_iops.log --write_lat_log=4K_randR_lat.log
#4k Random Write
fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=7200 --time_based --numjobs=1 --iodepth=32 --filename=/dev/sda --rw=randwrite --bs=4k --output=4K_randW.log --log_avg_msec=1000 --write_iops_log=4K_randW_iops.log --write_lat_log=4K_randW_lat.log

4.数据分析

顺序读、顺序写主要看BW,随机读、随机写主要看IOPS.

5.fio常用参数详解

a.loops=int
重复运行某个job多次,默认是1。
loops与runtime是两个不能同时存在的两个参数,loops主要是定义硬盘执行的圈数,而runtime只是定义fio执行的时间。
b.time_based
如果设置的话,即使file已被完全读写或写完,也要执行完runtime规定的时间。它是通过循环执行相同的负载来实现的,与runtime相对应。
c.ramp_time=time
设定在记录任何性能信息之前要运行特定负载的时间。这个用来等性能稳定后,再记录日志结果,因此可以减少生成稳定的结果需要的运行时间。
d.randrepeat=bool
对于随机IO负载,配置生成器的种子,使得路径是可以预估的,使得每次重复执行生成的序列是一样的。

如果无–randrepeat=0这个参数不会影响seqread,但会影响seqwrite,randwrite,randread.

在这里插入图片描述
e.norandommap
一般情况下,fio在做随机IO时,将会覆盖文件的每一个block.如果这个选项设置的话,fio将只是获取一个新的随机offset,而不会查询过去的历史。这意味着一些块可能没有读或写,一些块可能要读/写很多次。在个选项与verify=互斥,并只有多个块大小(bsrange=)正在使用,因为fio只会记录完整的块的重写。
f.thread
fio默认会使用fork()创建job,如果这个选项设置的话,fio将使用pthread_create来创建线程
g.direct=bool
true,则标明采用non-buffered io.同O_DIRECT效果一样。ZFS和Solaris不支持direct io,在windows同步IO引擎不支持direct io

direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。

h.group_reporting
如果‘numjobs’设置的话,我们感兴趣的可能是打印group的统计值,而不是一个单独的job。这在‘numjobs’的值很大时,一般是设置为true的,可以减少输出的信息量。如果‘group_reporting’设置的话,fio将会显示最终的per-groupreport而不是每一个job都会显示。
i.numjobs=int
创建特定数目的job副本。可能是创建大量的线程/进程来执行同一件事。我们将这样一系列的job,看作一个特定的group。

参考:https://www.itzhoulin.com/2015/12/24/fio-man-guide/

猜你喜欢

转载自blog.csdn.net/weixin_40343504/article/details/82979152
fio