性能指标测试使用的工具是iometer,但如果需要简单快速地衡量某个块设备性能时,由于iometer需要装在win虚拟机内,部署起来相对繁琐,此时该工具就不太试用了。fio最初是用来节省为特定负载写专门测试程序,或是进行性能测试,或是找到和重现bug的时间。而写测试应用是非常浪费时间。因此需要一个工具来模拟给定的io负载,而不用重复的写一个又一个的特定的测试程序。
一、fio参数介绍
fio总共有100+个参数,很多参数我们用不到,下面选择版本性能测试中一些常用的参数进行说明。
首先来看wiki上的一条fio命令:
fio -name=fiotest.qcow2 -filename=test.qcow2 -group_reporting -brick=127.0.0.1
-iodepth=16 -ioengine=gfapi_async -volume=vs_vol_rep2
-nrfiles=1 -rw=randwrite -bs=4k -size=1G -threads -numjobs=1 -direct=1
该命令式在挂载点下随机写一个1G的文件,测试挂载点的性能,具体参数的意义如下:
-name: 用于输出信息用的名字,在上述命令行的使用方法中,表明一个新job的开始,缺省为job name
-filename: 测试文件名称,通常选择需要测试的盘的data目录
-group_reporting:汇总所有的信息,而不是每个job都显示具体的结果
-iodepth:本次测试的队列深度
-ioengine:负载产生的引擎,定义job向文件发起io的方式。Fio的引擎有很多,具体可以网上搜一下,常用的引擎为libaio 和 gfapi_async,测试过程中,如果要模拟api的方式测试vs挂载点的性能则用gfapi_async,测试裸盘或其他块设备性能时,选用libaio即可。
-volume 和 -brick:这两个是vs中测试挂载点用的,其他场景不需要。
-nrfiles:每个进程生成的文件数量
-rw: 读写方式,顺序读,顺序写,随机读,随机写,混合读写
-bs: 块大小,一般测试4k, 8k, 64k, 128k, 1M
-size: 测试文件的大小
-threads:fio默认会使用fork()创建job,如果这个选项设置的话,fio将使用pthread_create来创建线程
-numjobs:创建的线程数量
-direct: 测试过程绕过机器自带的buffer,相当于o_direct
其他一些相对高级点用法的参数,比如:
-runtime:测试时长
-bssplit=4k/40:64k/30:1M/30: 混合块大小,4k:64k:1M = 4:3:3
bsrange=512-2048:块大小的范围,同bs参数
-rw=randrw, -rwmixread=70:混合读写7:3
二、fio数据解析
下面以一个具体的例子说明fio的实际使用方法,以及输出结果中各项指标的含义。后台测试hdd裸盘的性能,输入命令:
fio -name=test -group_reporting -ioengine=libaio -nrfiles=1 -threads -numjobs=1 -direct=1 -iodepth=16 -rw=randread -bs=4K -filename=/dev/sdd -runtime=100
上图是裸盘测试的结果,结果中数据较多,在测试过程中,不需要关注这么多参数,对于小块io(以64k为界)只需要关注iops,平均时延(lat中的avg),大块io关注吞吐和平均时延(lat中的avg)即可,上面的测试结果中,由于测试块大小为4k,属于小块,所以只需要看iops和时延,结果为iops=160,平均时延为:99.76ms。
如果有其他需要可以去关注其他指标,各项指标的含义如下:
首先是整个测试用户设定的参数情况,本次测试名为test,测试4k, 16深度随机读,使用的引擎是libaio。截图后部分是fio各个job进程的一些基本信,这些信息,不用关注。
其次是本次测试结果,本次测试总共读了32M数据,吞吐为0.66MBps,iops为160,运行时长为100ms,由于测试的是小块io,所以此处只需要看iops就可以,看吞吐没有意义。
接下来是本次测试的延时时间,slat表示磁盘需要多久将io提交到kernel做处理;clat表示命令提交到了内核,提交到内核到io完成的时间。Lat是一个新的指标,表示从io结果提创建到clat完成,一般说时延,就是看这个值。
下面是clat各个延时所占的百分比。
下图中,bw的意义很明确,就是指带宽,stdev这个指标,我也没搞懂是什么意思,后续查到再优化。上面说了,lat指的是时延,图中,取图中一组数据说明:50=20.24%,表示有20.24%的io时延小于50ms。
cpu栏中,usr表示用户cpu占用率,sys表示系统cpu占用率,ctx为上下文切换次
数,后面两个是主要和次要页面错误数量。
Io depths用于控制廷议时刻发送给os的io数量。Submit和complete不碍事同一时段fio发送和完成的io数据量。Issued为发送的io数量,latency用于调节吞吐量直到达到预设的延迟目标。
最后是结果的汇总,表示完成的io数据量,平均带宽,最大最小带宽,最大/小时延。
三、fio其他用法
测试时,可能需要同时测试多块盘的性能,上面介绍的是fio命令行用法就满足不了这个需求。其实,fio真正官方的用法是使用配置文件,在文件中写入相应的参数,fio读取配置文件,执行相应的测试(fio config.txt),通过这种方法可以同时测试几块磁盘的性能(文件中各项参数的与上面的命令行使用方法中一致)。文件的格式如下:
文件中其他参数就不再赘述了,若想同时测试几块数据盘,直接添加[job]就可以了,比如上图中表示同时测试/dev/sdb 和 /dev/sdc两块磁盘的随机写性能。
四、注意事项
FIO测试性能时,有几点需要注意:
1. 测试裸盘性能时,拿到新盘,首先用大块io将磁盘顺序写一遍,然后再开始测试。
2. 测试挂载点性能时,先在相应的位置truncate一个特定大小的文件后,用fio先将文件填满,不要拿一个空洞文件来测试。
3. 环境搭好后,测试不要测试磁盘的写性能,否则测试完成后,该磁盘无法继续在环境中使用。
因篇幅问题不能全部显示,请点此查看更多更全内容