【详细齐全】FIO使⽤⽅法及参数解析(⽂章末尾)
linux 使⽤FIO测试磁盘iops ⽅法详解
FIO是测试IOPS的⾮常好的⼯具,⽤来对硬件进⾏压⼒测试和验证,⽀持13种不同的I/O引擎, 包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。
fio
【
FIO安装
yum install libaio-devel
tar -zxvf fio-2.2.
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
】
安装fio
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:
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
git使用详解$ cd fio
$ ./configure --enable-gfio
...
gtk 2.18 or higher yes
...
$ make fio
$ make gfio
$ ./fio -S
fio: server listening on 0.0.0.0,8765
这样fio就编译好了,同时进⼊server模式。 在另外⼀个终端运⾏ gfio 就可以看到图形界⾯,打开examp
les/aio-read.fio 这个脚本把玩下(注意这个脚本⾥⾯⽂件的路径是/data1, 最好改成/tmp之类的),如下图:
**磁盘阵列吞吐量与IOPS两⼤瓶颈分析**
1、吞吐量
吞吐量主要取决于阵列的构架,光纤通道的⼤⼩(现在阵列⼀般都是光纤阵列,⾄于SCSI这样的SSA阵列,我们不讨论)以及硬盘的个数。阵列的构架与每个阵列不同⽽不同,他们也都存在内部带宽(类似于pc的系统总线),不过⼀般情况下,内部带宽都设计的很充⾜,不是瓶颈的所在。
光纤通道的影响还是⽐较⼤的,如数据仓库环境中,对数据的流量要求很⼤,⽽⼀块2Gb的光纤卡,所77能⽀撑的最⼤流量应当是
2Gb/8(⼩B)=250MB/s(⼤B)的实际流量,当4块光纤卡才能达到1GB/s的实际流量,所以数据仓库环境可以考虑换4Gb的光纤卡。
最后说⼀下硬盘的限制,这⾥是最重要的,当前⾯的瓶颈不再存在的时候,就要看硬盘的个数了,我下⾯列⼀下不同的硬盘所能⽀撑的流量⼤⼩:
10 K rpm 15 K rpm ATA
——— ——— ———
10M/s 13M/s 8M/s
那么,假定⼀个阵列有120块15K rpm的光纤硬盘,那么硬盘上最⼤的可以⽀撑的流量为120*13=1560MB/s,如果是2Gb的光纤卡,可能需要6块才能够,⽽4Gb的光纤卡,3-4块就够了。
2、IOPS
决定IOPS的主要取决与阵列的算法,cache命中率,以及磁盘个数。阵列的算法因为不同的阵列不同⽽不同,如我们最近遇到在hds usp上⾯,可能因为ldev(lun)存在队列或者资源限制,⽽单个ldev的iops就上不去,所以,在使⽤这个存储之前,有必要了解这个存储的⼀些算法规则与限制。
cache的命中率取决于数据的分布,cache size的⼤⼩,数据访问的规则,以及cache的算法,如果完整的讨论下来,这⾥将变得很复杂,可以有⼀天好讨论了。我这⾥只强调⼀个cache的命中率,如果⼀个阵列,读cache的命中率越⾼越好,⼀般表⽰它可以⽀持更多的IOPS,为什么这么说呢?这个就与我们下⾯要讨论的硬盘IOPS有关系了。
硬盘的限制,每个物理硬盘能处理的IOPS是有限制的,如
10 K rpm 15 K rpm ATA
——— ——— ———
100 150 50
同样,如果⼀个阵列有120块15K rpm的光纤硬盘,那么,它能撑的最⼤IOPS为120*150=18000,这个为硬件限制的理论值,如果超过这个值,硬盘的响应可能会变的⾮常缓慢⽽不能正常提供业务。www.jbxue
在raid5与raid10上,读iops没有差别,但是,相同的业务写iops,最终落在磁盘上的iops是有差别的,⽽我们评估的却正是磁盘的IOPS,如果达到了磁盘的限制,性能肯定是上不去了。
那我们假定⼀个case,业务的iops是10000,读cache命中率是30%,读iops为60%,写iops为40%,磁盘个数为120,那么分别计算在raid5与raid10的情况下,每个磁盘的iops为多少。
raid5:
单块盘的iops = (10000*(1-0.3)*0.6 + 4 * (10000*0.4))/120
= (4200 + 16000)/120
= 168
这⾥的10000*(1-0.3)*0.6表⽰是读的iops,⽐例是0.6,除掉cache命中,实际只有4200个iops
⽽4 * (10000*0.4) 表⽰写的iops,因为每⼀个写,在raid5中,实际发⽣了4个io,所以写的iops为16000个
为了考虑raid5在写操作的时候,那2个读操作也可能发⽣命中,所以更精确的计算为:
单块盘的iops = (10000*(1-0.3)*0.6 + 2 * (10000*0.4)*(1-0.3) + 2 * (10000*0.4))/120
= (4200 + 5600 + 8000)/120
= 148
计算出来单个盘的iops为148个,基本达到磁盘极限
raid10
单块盘的iops = (10000*(1-0.3)*0.6 + 2 * (10000*0.4))/120
= (4200 + 8000)/120
= 102
可以看到,因为raid10对于⼀个写操作,只发⽣2次io,所以,同样的压⼒,同样的磁盘,每个盘的iops只有102个,还远远低于磁盘的极限iops。
在⼀个实际的case中,⼀个恢复压⼒很⼤的standby(这⾥主要是写,⽽且是⼩io的写),采⽤了raid5的⽅案,发现性能很差,通过分析,每个磁盘的iops在⾼峰时期,快达到200了,导致响应速度巨慢⽆⽐。后来改造成raid10,就避免了这个性能问题,每个磁盘的iops 降到100左右。
这个⽂档是对fio-2.0.9 HOWTO⽂档的翻译,fio的参数太多了,翻译这个⽂档时并没有测试每⼀个参数的功能和使⽤⽅法,只有少量参数做了试验,⼤部分的参数采⽤的是根据字⾯翻译或是个⼈理解的翻译,必然有些出⼊,先发出来,以后有使⽤的时候再被充和修改。在另⼀个⽂档中会对fio⾃带的实例进⾏分析,可能会更为清晰⼀些。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论