【存储测试】fio存储性能测试工具
一、前言
GitHub地址:fio
官方文档:HOWTO
1、介绍
fio(flexible I/O Tester) 是一款由 Jens Axboe 开发的用于测评和压力/硬件验证的自由开源的软件,适用于文件及块接口性能测试。
fio常用的I/O引擎主要分为以下两种,可根据实际选择合适的I/O引擎和配置参数
-
同步(如psync)
对于同步I/O而言,一次只能发出一个IO请求,等待内核完成后才返回,通常指定iodepth为1,增大thread以达到最大性能测试要求 -
异步(如libaio)
对于异步I/O而言,一次提交一批请求,然后等待一批的完成,减少与内核交互次数,通常指定thread为1,增大iodepth以达到最大性能测试要求
二、安装部署
1、Linux客户端
1.1、安装libaio(可选)
示例使用libaio
引擎测试,故此处需要先行安装相关软件包,如不使用该引擎进行测试,此步骤可忽略
yum install libaio-devel -y
1.2、软件包安装
创建fio软件包安装目录/opt/fio
,下载fio源码包进行编译安装,配置fio环境变量
mkdir /opt/fio
wget https://github.com/axboe/fio/archive/fio-3.20.tar.gz
tar -zxvf fio-3.20.tar.gz
cd fio-fio-3.20/
./configure --prefix=/opt/fio/
make && make install
echo -e "\n\n export PATH=/opt/fio/bin:$PATH" >> /etc/profile && source /etc/profile
2、Window客户端
下载地址:https://bsdio.com/fio/releases/fio-3.20-x64.msi
下载安装软件包即可,安装时自动配置环境变量
三、配置使用
1、参数解释
fio -filename=/dev/sdb -direct=1 -rw=write -ioengine=libaio -bs=4k -iodepth=32 -numjobs=1 -runtime=600 -group_reporting -name=4ktest
-
-filename
用于测试块设备,一般指定需要测试的磁盘或者分区,如-filename=/dev/sdb
-
-directory
用于测试文件,一般指定需要测试的目录路径,如-directory=/client/
-
-direct
默认值为0,用于决定是否绕过缓存,一般设置为1(开启direct io,绕过系统缓存) -
-rw
用于指定负载读写类型,一般可以设置以下参数:- read:顺序读(Sequential reads)
- write:顺序写(Sequential writes)
- rw:顺序读写(Mixed sequential reads and writes),当负载为混合读写类型时,需要指定读写占比(rwmixread)
- randread:随机读(Random reads)
- randwrite:随机写(Random writes)
- randrw:随机读写(Random mixed reads and writes),当负载为混合读写类型时,需要指定读写占比(rwmixread)
-
rwmixread
用于指定混合读写同一时刻读的占比,默认为50%,即读写比为1:1 -
rwmixwrite
用于指定混合读写同一时刻写的占比,默认为50%,即读写比为1:1 -
-ioengine
用于指定负载工作引擎,常用引擎一般有psync(同步IO引擎)及libaio(异步IO引擎)
可选参数有sync , psync , vsync , posixaio , mmap , splice , syslet-rw , sg , null , net , netsplice , cpuio , guasi , external、libaio -
-bs
用于指定IO块大小 -
-iodepth
用于指定IO深度,不同IO深度下有不同性能值,需合理调整验证以得出最优性能 -
-numjobs
用于指定IO并发线程数 -
-runtime
用于指定负载测试时间,时间单位为s -
-group_reporting
用于指定测试结果显示方式
当指定-numjobs
参数时,如果不指定-group_reporting
参数,测试结果以per-job
形式显示(即把所有线程的测试结果单独显示出来)
当指定-numjobs
参数时,如果指定-group_reporting
参数,测试结果以per-group
形式显示(即汇总所有线程的测试结果合并显示出来) -
-name
用于指定负载工作job名称,名称可自定义
2、结果分析
[root@node241 ~]# fio -filename=/dev/sdb -direct=1 -rw=write -ioengine=libaio -bs=4k -iodepth=16 -numjobs=16 -runtime=600 -group_reporting -name=4ktest
4ktest: (g=0): rw=write, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=16
...
fio-3.20
Starting 16 processes
Jobs: 16 (f=16): [W(16)][100.0%][w=15.2MiB/s][w=3900 IOPS][eta 00m:00s]
4ktest: (groupid=0, jobs=16): err= 0: pid=31603: Tue Jun 30 16:55:43 2020
write: IOPS=4515, BW=17.6MiB/s (18.5MB/s)(10.3GiB/600084msec); 0 zone resets
slat (nsec): min=1369, max=266167k, avg=9274.23, stdev=500148.33
clat (usec): min=1044, max=1463.7k, avg=56668.55, stdev=65749.73
lat (usec): min=1267, max=1463.7k, avg=56678.04, stdev=65750.75
clat percentiles (msec):
| 1.00th=[ 6], 5.00th=[ 12], 10.00th=[ 20], 20.00th=[ 28],
| 30.00th=[ 33], 40.00th=[ 36], 50.00th=[ 40], 60.00th=[ 45],
| 70.00th=[ 54], 80.00th=[ 70], 90.00th=[ 104], 95.00th=[ 146],
| 99.00th=[ 338], 99.50th=[ 489], 99.90th=[ 785], 99.95th=[ 877],
| 99.99th=[ 1028]
bw ( KiB/s): min= 266, max=144647, per=100.00%, avg=18128.38, stdev=746.11, samples=19075
iops : min= 62, max=36161, avg=4530.95, stdev=186.55, samples=19075
lat (msec) : 2=0.01%, 4=0.18%, 10=3.64%, 20=6.93%, 50=56.16%
lat (msec) : 100=22.43%, 250=9.03%, 500=1.16%, 750=0.34%, 1000=0.12%
lat (msec) : 2000=0.01%
cpu : usr=0.20%, sys=0.54%, ctx=779333, majf=0, minf=664
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=100.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.1%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=0,2709976,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=16
Run status group 0 (all jobs):
WRITE: bw=17.6MiB/s (18.5MB/s), 17.6MiB/s-17.6MiB/s (18.5MB/s-18.5MB/s), io=10.3GiB (11.1GB), run=600084-600084msec
Disk stats (read/write):
sdb: ios=43/395233, merge=0/2139499, ticks=123/22527124, in_queue=22622488, util=100.00%
IOPS=
:IOPS性能数值,单位为op/s
BW=
:带宽性能数值,单位为MiB/s
lat
:时延性能数值,通常取avg平均值
3、常用命令
- 重定向测试结果到文件内
fio {config-file} -output={result-file}