Loading...
墨滴

北在南方

2021/11/23  阅读:15  主题:默认主题

工具| IO测试fio详解

一 简介

FIO是一款开源的 I/O 压力测试工具,主要是用来测试磁盘的IO性能。它可以支持多种不同的I/O引擎。

fio 官网地址: http://freshmeat.net/projects/fio/

fio文档: https://fio.readthedocs.io/en/latest/index.html

二 安装

安装 依赖包

yum install libaio-devel

解压tar包 然后make && make install

三 使用

fio支持的读写模式包括顺序读,随机读,顺序写,随机写,混合随机读写,混合顺序读写。常用参数包括引擎,队列深度,线程,block,是否裸设备,读写方式,大小/耗时,跳过缓存等。以下是对这些参数的简单介绍:

filename=/dev/sdc     支持文件系统或者裸设备,压测多个磁盘 --filename=/dev/sda:/dev/sdb
direct=1                 测试过程绕过机器自带的buffer,使测试结果更真实
rw=randwread             测试随机读的I/O
rw=randwrite             测试随机写的I/O
rw=randrw                测试随机混合写和读的I/O
rw=read                  测试顺序读的I/O
rw=write                 测试顺序写的I/O
rw=rw                    测试顺序混合写和读的I/O
bs=4k                    单次io的块文件大小为4k
bsrange=512-2048         同上,指定定数据块的大小范围
size=50g                  本次的测试文件大小为50g,以每次4k的io进行测试
numjobs=30               本次的测试线程为30
runtime=1000             测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止
ioengine=psync           io引擎使用pync方式,如果要使用libaio引擎,需要yum install libaio-devel包
rwmixwrite=30            在混合读写的模式下,写占30%
group_reporting          关于显示结果的,汇总每个进程的信息
此外其他参数
lockmem=1g               只使用1g内存进行测试
zero_buffers               用0初始化系统buffer
nrfiles=8                    每个进程生成文件的数量

执行多次测试的时候 ,由于命令行参数过多影响,不太直观,可以将参数写到配置文件中,把全局变量和测试变化的参数写在不同的块里,最后运行即可,比如我们要测试多个rw场景 write,readwrite ,可以写配置文件 fio_yace.cfg

[global]
filename=/dev/vdb
direct=1
iodepth=128
thread
ioengine=libaio
numjobs=30
size=10g
numjobs=30
runtime=600
group_reporting
bs=4k
[4k-write]
rw=write
stonewall
[4k-randwrite]
rw=randwrite
stonewall

注意,如果 [4k-write] 和 [4k-randwrite] 两个测试需要串行执行,需要在各自的块下面加上 stonewall 。 最后命令行运行

fio fio_yace.cfg

即执行测试。测试结果的数据较多,主要观察吞吐量和IOPS两个。当然延迟也需要进行观察。

四 压测结果解读

[root@dbm-01 data]# fio  fio.cfg
4k-write: (g=0): rw=write, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
...
4k-randwrite: (g=1): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
...
fio-3.7
Starting 60 threads
Jobs: 30 (f=30): [_(30),w(30)][11.9%][r=0KiB/s,w=192MiB/s][r=0,w=49.3k IOPS][eta 24m:37s]
4k-write: (groupid=0, jobs=30): err= 0: pid=14529: Tue Nov 23 20:12:08 2021
  write: IOPS=106k, BW=415MiB/s (435MB/s)(40.5GiB/100002msec)
    slat (usec): min=3, max=14296, avg=23.86, stdev=34.22
    clat (nsec): min=993, max=20735k, avg=257999.15, stdev=63006.92
     lat (usec): min=30, max=20773, avg=281.97, stdev=70.00
    clat percentiles (usec):
     |  1.00th=[  227],  5.00th=[  237], 10.00th=[  239], 20.00th=[  243],
     | 30.00th=[  247], 40.00th=[  251], 50.00th=[  255], 60.00th=[  260],
     | 70.00th=[  265], 80.00th=[  269], 90.00th=[  273], 95.00th=[  277],
     | 99.00th=[  293], 99.50th=[  363], 99.90th=[ 1270], 99.95th=[ 1467],
     | 99.99th=[ 1762]
   bw (  KiB/s): min= 9835, max=13978, per=2.62%, avg=11137.60, stdev=415.24, samples=5970
   iops        : min= 2458, max= 3494, avg=2784.02, stdev=103.82, samples=5970
  lat (nsec)   : 1000=0.01%
  lat (usec)   : 2=0.01%, 4=0.01%, 10=0.01%, 20=0.01%, 50=0.03%
  lat (usec)   : 100=0.17%, 250=36.97%, 500=62.44%, 750=0.20%, 1000=0.03%
  lat (msec)   : 2=0.15%, 4=0.01%, 10=0.01%, 20=0.01%, 50=0.01%
  cpu          : usr=0.93%, sys=11.32%, ctx=10740093, majf=0, minf=2817
  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 rwts: total=0,10614582,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1
4k-randwrite: (groupid=1, jobs=30): err= 0: pid=17275: Tue Nov 23 20:12:08 2021
  write: IOPS=50.2k, BW=196MiB/s (205MB/s)(19.1GiB/100002msec)
    slat (usec): min=3, max=10742, avg=23.21, stdev=21.85
    clat (nsec): min=825, max=21466k, avg=573943.92, stdev=468815.81
     lat (usec): min=50, max=22154, avg=597.26, stdev=469.11
    clat percentiles (usec):
     |  1.00th=[  289],  5.00th=[  302], 10.00th=[  306], 20.00th=[  318],
     | 30.00th=[  322], 40.00th=[  334], 50.00th=[  347], 60.00th=[  553],
     | 70.00th=[  603], 80.00th=[  627], 90.00th=[  693], 95.00th=[ 1926],
     | 99.00th=[ 2073], 99.50th=[ 2114], 99.90th=[ 2180], 99.95th=[ 2245],
     | 99.99th=[ 3228]
   bw (  KiB/s): min= 5408, max=10163, per=3.33%, avg=6685.70, stdev=288.97, samples=5977
   iops        : min= 1352, max= 2540, avg=1671.39, stdev=72.24, samples=5977
  lat (nsec)   : 1000=0.01%
  lat (usec)   : 2=0.01%, 4=0.01%, 10=0.01%, 20=0.01%, 50=0.01%
  lat (usec)   : 100=0.03%, 250=0.18%, 500=57.83%, 750=32.05%, 1000=0.23%
  lat (msec)   : 2=6.91%, 4=2.76%, 10=0.01%, 20=0.01%, 50=0.01%
  cpu          : usr=0.46%, sys=4.98%, ctx=5064328, majf=0, minf=55804
  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 rwts: total=0,5015251,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: bw=415MiB/s (435MB/s), 415MiB/s-415MiB/s (435MB/s-435MB/s), io=40.5GiB (43.5GB), run=100002-100002msec

Run status group 1 (all jobs):
  WRITE: bw=196MiB/s (205MB/s), 196MiB/s-196MiB/s (205MB/s-205MB/s), io=19.1GiB (20.5GB), run=100002-100002msec

Disk stats (read/write):
  sdb: ios=66/15648881, merge=0/23534, ticks=17/5617878, in_queue=5613375, util=99.94%
[root@dbm-01 data]#

报告参数解释 ,通常我们关注 io,iops,clat

bw 表示测试中达到的平均带宽

clat 表示完成延迟(completion latency) - 完成延迟是提交请求和请求完成之间的时间。统计值分别是最小、最大、平均和标准方差。

CPU 行数据显示IO负载对CPU的影响

IO depths 段落对于测试多请求的IO负载非常有意义 - 由于上述测试所有测试是单IO请求,所以IO depths始终100%是1

三行 lat 显示了每个IO请求完成的概况,例如,上述延迟在2ms的占68.84%,1ms(1000us)占21.36%

READ 行显示了读取速率

详细的解释如下:

io=执行了多少M的IO
bw=平均IO带宽
iops=IOPS
runt=线程运行时间
slat=提交延迟
clat=完成延迟
lat=响应时间
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=磁盘利用率

五 参考

https://www.cnblogs.com/raykuan/p/6914748.html

https://huataihuang.gitbooks.io/cloud-atlas/content/performance/utilities/fio.html

北在南方

2021/11/23  阅读:15  主题:默认主题

作者介绍

北在南方