@breakerthb
2017-07-17T08:38:06.000000Z
字数 2967
阅读 5436
Linux
FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证。
支持13种不同的I/O引擎:
fio 官网地址:http://freshmeat.net/projects/fio/
fio GitHub官网:https://github.com/axboe/fio/
$ yum install libaio-devel
$ apt install libaio librbd-dev librados-dev
$ 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
$ apt-get install gnuplot
fio下载解压后的文件夹里面有个examples文件夹,里面有测试脚本样例。
$ ll /usr/share/doc/fio/examples/*.fio
这样执行:
$ fio XXX.fio
可以把测试参数写在*.fio
文件中,例如:
[global]
bs=16k
ioengine=../ioengine/unvme_fio
iodepth=16
size=10g
direct=0
runtime=2
numjobs=2
#directory=
filename=01.00.0
[seq-read]
rw=read
stonewall
[rand-read]
rw=randread
stonewall
[seq-write]
rw=write
stonewall
[rand-write]
rw=randwrite
stonewall
其中,[global]
为必须的,通用设置。其他的每个'[]'代表一组同类型的执行任务。上面这个脚本同时启动4组测试任务。每个任务有2个线程。
stonewall
是几个测试任务之间的分隔符。
$ fio *.fio
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 每个进程生成文件的数量。
$ 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
$ 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
$ 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
$ 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
$ 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
$ 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
fio安装完后自带有一个高级脚本fio_generate_plots
能够根据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
这个参数用来调整绘图日志的数据输出频率,单位毫秒。
前提是还需要安装好gnuplot
,然后使用下面的命令即可自动画图:
$ fio_generate_plots bw
fio_generate_plots接受的唯一参数就是这个日志文件名的prefix。
本例中生成的图片文件有:
bw-bw.svg
bw-clat.svg
bw-iops.svg
bw-lat.svg
bw-slat.svg