FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎, 包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。
fio 官网地址:http://freshmeat.net/projects/fio/
fio
【
FIO安装
wget http://brick.kernel.dk/snaps/fio-3.12.tar.gz
yum install libaio-devel
tar -zxvf fio-2.2.5.tar.gz
cd fio-2.2.5
make
make install
若要启动gfio,需安装gtk2,configure时加上--enable-gfio
$ yum install libaio-devel
$ yum install gtk2
$ yum install gtk2-devel
$ ./configure --enable-gfio
$ make
$ make install
】
apt-get install fio (yum install fio)
输出:...
Installed:
fio.x86_64 0:3.1-2.el7
Dependency Installed:
libpmem.x86_64 0:1.3-3.el7 libpmemblk.x86_64 0:1.3-3.el7
librdmacm.x86_64 0:15-7.el7_5
- 可以把fio的输出数据自动画图的插件gnuplot
apt-get install gnuplot (yum install gnuplot)
输出:
Installed:
gnuplot.x86_64 0:4.6.2-3.el7
Dependency Installed:
dejavu-fonts-common.noarch 0:2.33-6.el7 dejavu-sans-fonts.noarch 0:2.33-6.el7
gd.x86_64 0:2.0.35-26.el7 gnuplot-common.x86_64 0:4.6.2-3.el7
graphite2.x86_64 0:1.3.10-1.el7_3 harfbuzz.x86_64 0:1.3.2-1.el7
libXft.x86_64 0:2.3.2-2.el7 libXpm.x86_64 0:3.5.12-1.el7
libjpeg-turbo.x86_64 0:1.2.90-5.el7 libthai.x86_64 0:0.1.14-9.el7
pango.x86_64 0:1.40.4-1.el7
Complete!
1.输出bw,lat和iops数据并画图
fio安装完后自带有一个高级脚本fio_generate_plots能够根据fio输出的数据进行画图。操作流程如下:
1.1设置fio输出详细日志:注意这里“\”位置是指换行,命令执行完成后在当前路径可以搜索到要输出的日志。
fio --filename=test_file --direct=1 --rw=randwrite --numjobs=1 --iodepth=16 \
--ioengine=libaio --bs=4k --group_reporting --name=zhangyi --log_avg_msec=500 \
--write_bw_log=test-fio --write_lat_log=test-fio --write_iops_log=test-fio --size=1G
这里需要说明下的就是write_bw_log这个参数需要指定,意思就是将fio的输出带宽信息就到文件test-fio中。这里可以指定带宽,IOPS和延时
fio的输出日志主要包含三种:bw,lat和iops,设置这三种的参数如下:
write_bw_log=rw
write_lat_log=rw
write_iops_log=rw
这里需要强调的一点是,后面接的参数rw,是输出日志文件名的prefix,如最终会生成的日志文件如下:
[xxx@xxx fio]$ ll rbd*.log
-rw-r--r-- 1 orcadt orcadt 208 Dec 3 20:58 rbd_bw.log
-rw-r--r-- 1 orcadt orcadt 227 Dec 3 20:58 rbd_clat.log
-rw-r--r-- 1 orcadt orcadt 197 Dec 3 20:58 rbd_iops.log
-rw-r--r-- 1 orcadt orcadt 227 Dec 3 20:58 rbd_lat.log
-rw-r--r-- 1 orcadt orcadt 205 Dec 3 20:58 rbd_slat.log
这个参数在后面画图的时候也要用到。
for i in clat lat slat bw iops;do mv test-fio_$i.1.log rbd_$i.log;done
1.2 画图
前提是还需要安装好gnuplot,然后使用下面的命令即可自动画图:
root@ubuntu:/tmp> fio_generate_plots bw
发现没有,fio_generate_plots接受的唯一参数就是这个日志文件名的prefix。
本例中生成的文件有(这些文件是用来绘图的源文件):
bw-bw.svg
bw-clat.svg
bw-iops.svg
bw-lat.svg
bw-slat.svg
绘图!
[xxx@xxx fio]$ fio2gnuplot -b -g 1 files Selected with pattern '*_bw.log'
1 files Selected with pattern '*_bw.log'
|-> rbd_bw.log
Running gnuplot Rendering
Rendering traces are available in the current directory
查看生成图片:
[orcadt@xxxx fio]$ ll *.png
-rw-r--r-- 1 orcadt orcadt 10719 Dec 3 21:23 rbd_bw-2Draw.png
-rw-r--r-- 1 orcadt orcadt 10636 Dec 3 21:23 rbd_bw-2Dsmooth.png
-rw-r--r-- 1 orcadt orcadt 10134 Dec 3 21:23 rbd_bw-2Dtrend.png
-rw-r--r-- 1 orcadt orcadt 13666 Dec 3 21:23 result.average.png
-rw-r--r-- 1 orcadt orcadt 13669 Dec 3 21:23 result.max.png
-rw-r--r-- 1 orcadt orcadt 13442 Dec 3 21:23 result.min.png
-rw-r--r-- 1 orcadt orcadt 13178 Dec 3 21:23 result.stddev.png
直接 fio 测试命令
随机读:
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
说明:
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引擎使用pync方式
rwmixwrite=30 在混合读写的模式下,写占30%
group_reporting 关于显示结果的,汇总每个进程的信息。
此外
lockmem=1g 只使用1g内存进行测试。
zero_buffers 用0初始化系统buffer。
nrfiles=8 每个进程生成文件的数量。
顺序读:
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
GFIO
fio是个非常强大的IO性能测试工具,可以毫不夸张的说,如果你把所有的fio参数都搞明白了,基本上就把IO协议栈的问题搞的差不多明白了,原因在于作者Jens Axboe是linux内核IO部分的maintainer. 但是这个工具有个很大的缺点就是没有图形界面,单靠输出的数字很难看出来IO的趋势变化,所以急需一个图形前端.
幸运的是Jens也认识到这个问题,2012年2月15号在google plus上说:
Once complete, this will be a great addition to fio. It can be quite tricky to get a good overview of all the various job controlling options that fio has, presenting them graphically has some advantages over a basic 80-line text cli.
可是Jens是写linux内核代码的,对于图形终端的编程不是很熟悉。 大牛毕竟是大牛,发扬革命不怕苦精神,自己学图形编程,于是在最近的2.1版本给我们带来了这个图形终端。有了这个东西使用起来就方便许多。
我给大家演示下如何编译,运行这个gfio. 在这之前需要给大家说下fio的server/client模式。 fio一旦进入server模式就会在8765 tcp端口上监听,等待客户端来连接。 一旦客户端连接上来,会发上来比如运行job等任务,服务端把运行结果推送到客户端。所以这个图形前端实际上是fio的一个client, 名字叫gfio. 具体参见 README里面的描述。
新版本的支持gfio的fio可以在这里下载 git clone git://git.kernel.dk/fio.git,编译gfio源码的时候, 由于它依赖于gtk库,需要先安装libgtk2.0开发包,演示开始:
sudo apt-get -y install libgtk2.0-dev (yum install gtk2 gtk2-devel gtk2-devel-docs)
$ git clone git://git.kernel.dk/fio.git |