[关闭]
@breakerthb 2017-07-17T08:38:06.000000Z 字数 2967 阅读 5290

FIO

Linux


FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证。

支持13种不同的I/O引擎:

fio 官网地址:http://freshmeat.net/projects/fio/
fio GitHub官网:https://github.com/axboe/fio/

1. 安装

1.1 安装依赖包

$ yum install libaio-devel
    $ apt install libaio librbd-dev librados-dev

1.2 源码安装

$ wget http://brick.kernel.dk/snaps/fio-2.2.13.tar.gz

$ https://github.com/axboe/fio.git


$ tar -zxvf fio-2.2.13.tar.gz
	$ cd fio-2.2.13
$ make
	$ make install

1.3 安装绘图插件:

$ apt-get install gnuplot

2. 测试样例

fio下载解压后的文件夹里面有个examples文件夹,里面有测试脚本样例。

$ ll /usr/share/doc/fio/examples/*.fio

这样执行:

$ fio XXX.fio

3. 参数

3.1 测试脚本文件

可以把测试参数写在*.fio文件中,例如:

  1. [global]
  2. bs=16k
  3. ioengine=../ioengine/unvme_fio
  4. iodepth=16
  5. size=10g
  6. direct=0
  7. runtime=2
  8. numjobs=2
  9. #directory=
  10. filename=01.00.0
  11. [seq-read]
  12. rw=read
  13. stonewall
  14. [rand-read]
  15. rw=randread
  16. stonewall
  17. [seq-write]
  18. rw=write
  19. stonewall
  20. [rand-write]
  21. rw=randwrite
  22. stonewall

其中,[global]为必须的,通用设置。其他的每个'[]'代表一组同类型的执行任务。上面这个脚本同时启动4组测试任务。每个任务有2个线程。

stonewall是几个测试任务之间的分隔符。

$ fio *.fio

3.2 参数说明

filename=/dev/sdb1       测试文件名称,通常选择需要测试的盘的data目录。
direct=1                 测试过程绕过机器自带的buffer。使测试结果更真实。
bs=16k                   单次io的块文件大小为16k
bsrange=512-2048         同上,提定数据块的大小范围
size=5g                  本次的测试文件大小为5g,以每次4k的io进行测试。
numjobs=30               测试线程为30
iodepth=16               这个参数的值要大于 numjobs * 任务数
runtime=1000             测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。
ioengine=psync           io引擎使用pync方式
rwmixwrite=30            在混合读写的模式下,写占30%
group_reporting          关于显示结果的,汇总每个进程的信息。

读写模式

rw参数
rw=randrw 随机读写
rw=read 顺序读
rw=write 顺序写
rw=randread 随机读
rw=randwrite 随机写

多任务同时执行

*.fio文件中,

此外

lockmem=1g               只使用1g内存进行测试。
zero_buffers             用0初始化系统buffer。
nrfiles=8                每个进程生成文件的数量。

4. 常用命令

4.1 随机读

$ fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=200G -numjobs=10 -runtime=1000 -group_reporting -name=mytest

4.2 顺序读

$ fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

4.3 随机写

$ fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

4.4 顺序写

$ fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

4.5 混合随机读写

$ fio -filename=/dev/sdb1 -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

5.实际测试范例:

$ fio -filename=/dev/md5 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=10G -numjobs=20 -runtime=1000 -group_reporting -name=mytest 

6. 输出bw,lat和iops数据并画图

fio安装完后自带有一个高级脚本fio_generate_plots能够根据fio输出的数据进行画图。

6.1 设置fio输出详细日志

fio的输出日志主要包含三种:bw,lat和iops,设置这三种的参数如下:

write_bw_log=rw
write_lat_log=rw
write_iops_log=rw

这里需要强调的一点是,后面接的参数rw,是输出日志文件名的prefix,如最终会生成的日志文件如下:

rw_iops.log
rw_clat.log
rw_slat.log
rw_lat.log
rw_bw.log

这个参数在后面画图的时候也要用到。

如果生成的文件名为rw_bw.1.log,可以执行下面语句:

$ for i in clat lat slat bw iops;do mv rw_$i.1.log rw_$i.log;done

注意里面的rw需要修改成正确的生成文件prefix

log_avg_msec=1000

这个参数用来调整绘图日志的数据输出频率,单位毫秒。

6.2 画图

前提是还需要安装好gnuplot,然后使用下面的命令即可自动画图:

$ fio_generate_plots bw

fio_generate_plots接受的唯一参数就是这个日志文件名的prefix。

本例中生成的图片文件有:

bw-bw.svg
bw-clat.svg
bw-iops.svg
bw-lat.svg
bw-slat.svg
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注