前言

环境: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的安装

下载 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									#安装

使用fio进行磁盘I/O测试

先来认识一些概念性的名称:
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=磁盘利用率

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐