环境:centos7.9 fio-2.1.10.tar.gz
fio是一款优秀的磁盘IO测试工具,在Linux中比较常用于测试磁盘IO,其下载地址:https://brick.kernel.dk/snaps/fio-2.1.10.tar.gz或者登录其官网:http://freshmeat.sourceforge.net/projects/fio/ 进行下载。
下载 fio-2.1.10.tar.gz并上传到服务器
[root@master fio-2.1.10]# tar -xzvf fio-2.1.10.tar.gz -C /usr/local/ #解压文件
[root@master fio-2.1.10]# cd /usr/local/fio-2.1.10
[root@master fio-2.1.10]# ./configure #预编译
[root@master fio-2.1.10]# make -j 4 #编译,-j 4表示开启4个内核进行并行编译
[root@master fio-2.1.10]# make install #安装
先来认识一些概念性的名称:
IOPS (Input/Output Per Second):指单位时间内系统能处理的I/O请求数量,即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。
数据吞吐量(Throughput):指单位时间内可以成功传输的数据数量。
fio 常用参数:
-filename=/opt/test.file #指定需要测试的磁盘或者文件名,可以通过冒号指定多个文件,filename=/dev/sda:/data/fio/test_file,如果指定的是磁盘,只用写磁盘名就可以,不用写分区号
-name=test_fio_randrw #指定测试任务job名
-direct=1 #表示测试过程绕过机器自带的buffer,使测试结果更真实
-rw=randread|randwrite|randrw|read|write|rw #表示随机读|随机写|随机读写|顺序读|顺序写|顺序混合读写的I/O
-bs=4k #表示单次io的块文件大小为4k
-bsrange=512-2048 #表示同上,提定数据块的大小范围
-size=5g #表示本次的测试文件大小为5g,以每次4k的io进行测试
-numjobs=10 #表示开启10个线程进行测试
-runtime=1000 #表示测试时间为1000秒
-ioengine=psync #表示io引擎使用pync方式
-rwmixread=30 #表示在混合读写的模式下,读占30%
-rwmixwrite=30 #表示在混合读写的模式下,写占30%
-group_reporting #表示关于显示结果的,汇总每个进程的信息此外
-lockmem=1g #表示只使用1g内存进行测试
-zero_buffers #表示用0初始化系统buffer
-nrfiles=8 #表示每个进程生成文件的数量
-iodepth 1 #测试队列深度
[root@master fio-2.1.10]# fio -filename=/opt/test.file -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=100M -numjobs=10 -runtime=100 -group_reporting -name=test_r_w
test_r_w: (g=0): rw=randrw, bs=4K-4K/4K-4K/4K-4K, ioengine=psync, iodepth=1
...
fio-2.1.10
Starting 10 threads
test_r_w: Laying out IO file(s) (1 file(s) / 100MB)
Jobs: 8 (f=8): [mmm__mmmmm] [96.8% done] [25013KB/11297KB/0KB /s] [6253/2824/0 iops] [eta 00m:01s]s]
test_r_w: (groupid=0, jobs=10): err= 0: pid=7591: Sun Dec 12 16:55:19 2021
read : io=717120KB, bw=23915KB/s, iops=5978, runt= 29986msec #IO表示执行了多少M的IO,bw表示平均IO带宽
clat (usec): min=162, max=17094, avg=1178.92, stdev=701.84
lat (usec): min=162, max=17094, avg=1179.36, stdev=702.21
clat percentiles (usec):
| 1.00th=[ 338], 5.00th=[ 462], 10.00th=[ 556], 20.00th=[ 692],
| 30.00th=[ 804], 40.00th=[ 908], 50.00th=[ 1012], 60.00th=[ 1144],
| 70.00th=[ 1304], 80.00th=[ 1528], 90.00th=[ 1960], 95.00th=[ 2384],
| 99.00th=[ 3824], 99.50th=[ 4576], 99.90th=[ 6560], 99.95th=[ 7584],
| 99.99th=[ 9920]
bw (KB /s): min= 1392, max= 3704, per=10.11%, avg=2418.72, stdev=342.28
write: io=306880KB, bw=10234KB/s, iops=2558, runt= 29986msec
clat (usec): min=105, max=12777, avg=1072.56, stdev=649.07
lat (usec): min=105, max=12777, avg=1073.19, stdev=649.29
clat percentiles (usec):
| 1.00th=[ 262], 5.00th=[ 394], 10.00th=[ 486], 20.00th=[ 620],
| 30.00th=[ 732], 40.00th=[ 836], 50.00th=[ 940], 60.00th=[ 1048],
| 70.00th=[ 1192], 80.00th=[ 1400], 90.00th=[ 1752], 95.00th=[ 2160],
| 99.00th=[ 3536], 99.50th=[ 4256], 99.90th=[ 6432], 99.95th=[ 7520],
| 99.99th=[ 9536]
bw (KB /s): min= 560, max= 1728, per=10.10%, avg=1034.10, stdev=167.59
lat (usec) : 250=0.31%, 500=7.66%, 750=18.97%, 1000=23.71%
lat (msec) : 2=40.85%, 4=7.71%, 10=0.78%, 20=0.01%
cpu : usr=0.17%, sys=27.06%, ctx=263958, majf=0, minf=10
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.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.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued : total=r=179280/w=76720/d=0, short=r=0/w=0/d=0
latency : target=0, window=0, percentile=100.00%, depth=1
Run status group 0 (all jobs):
READ: io=717120KB, aggrb=23915KB/s, minb=23915KB/s, maxb=23915KB/s, mint=29986msec, maxt=29986msec
WRITE: io=306880KB, aggrb=10234KB/s, minb=10234KB/s, maxb=10234KB/s, mint=29986msec, maxt=29986msec
Disk stats (read/write):
dm-0: ios=179171/76705, merge=0/0, ticks=168275/63994, in_queue=233437, util=99.96%, aggrios=59760/25579, aggrmerge=0/2, aggrticks=56858/21618, aggrin_queue=78450, aggrutil=99.82%
sda: ios=179281/76739, merge=0/6, ticks=170574/64856, in_queue=235351, util=99.82%
sdb: ios=0/0, merge=0/0, ticks=0/0, in_queue=0, util=0.00%
sdc: ios=0/0, merge=0/0, ticks=0/0, in_queue=0, util=0.00%
[root@master fio-2.1.10]#
下面对fio的输出结果进行详细讲解:
read : io=717120KB, bw=23915KB/s, iops=5978, runt= 29986msec
#这一行表示读
#io表示执行了多少M的io,bw表示平均io带宽,iops表示每秒的输入输出量,runt表示线程运行时间
clat (usec): min=162, max=17094, avg=1178.92, stdev=701.84
lat (usec): min=162, max=17094, avg=1179.36, stdev=702.21
clat percentiles (usec):
| 1.00th=[ 338], 5.00th=[ 462], 10.00th=[ 556], 20.00th=[ 692],
| 30.00th=[ 804], 40.00th=[ 908], 50.00th=[ 1012], 60.00th=[ 1144],
| 70.00th=[ 1304], 80.00th=[ 1528], 90.00th=[ 1960], 95.00th=[ 2384],
| 99.00th=[ 3824], 99.50th=[ 4576], 99.90th=[ 6560], 99.95th=[ 7584],
| 99.99th=[ 9920]
#io延迟包括三种:slat,clat,lat,关系是lat=slat+clat;
#slat表示fio submit某个I/O的延迟,称slat为提交延迟;
#clat表示fio complete某个I/O的延迟,称clat为提交延迟;
#lat表示从fio将请求提交给内核,再到内核完成这个I/O为止所需的相应时间,称lat为响应时间;
#usec:微妙,msec:毫秒
cpu : usr=0.17%, sys=27.06%, ctx=263958, majf=0, minf=10
#usr表示用户空间进程;
#sys表示内核空间进程;
bw=带宽
cpu=利用率
IO depths=io队列
IO submit=单个IO提交要提交的IO数
IO complete=Like the above submit number, but for completions instead.
IO issued=The number of read/write requests issued, and how many of them were short.
IO latencies=IO完延迟的分布
io=总共执行了多少size的IO
aggrb=group总带宽
minb=最小平均带宽.
maxb=最大平均带宽.
mint=group中线程的最短运行时间.
maxt=group中线程的最长运行时间.
ios=所有group总共执行的IO数.
merge=总共发生的IO合并数.
ticks=Number of ticks we kept the disk busy.
io_queue=花费在队列上的总共时间.
util=磁盘利用率