前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >工具| IO测试fio详解

工具| IO测试fio详解

作者头像
用户1278550
发布2021-11-26 10:34:32
5.3K0
发布2021-11-26 10:34:32
举报
文章被收录于专栏:idbaidba

一 简介

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,是否裸设备,读写方式,大小/耗时,跳过缓存等。以下是对这些参数的简单介绍:

代码语言:javascript
复制
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

代码语言:javascript
复制
[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两个。当然延迟也需要进行观察。

四 压测结果解读

代码语言:javascript
复制
[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 行显示了读取速率

详细的解释如下:

代码语言:javascript
复制
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,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yangyidba 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二 安装
  • 三 使用
  • 四 压测结果解读
  • 五 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档