暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

I/O测试工具:fio

原创 贾勇智 2022-05-31
4453

介绍

fio 全称是flexible I/O tester(灵活的I/O测试工具)。可以根据用户指定I/O类型进行多线程/进程的I/O负载模拟。

安装部署

fio 是系统ISO自带的基础安装安装包,直接使用yum安装。

yum list fio

命令使用方法

语法:

fio [options] [jobfile]...
注意:参数特别多,请把参数按man分类进行解读,就非常容易理解了。

jobfile参数主要分为以下几类,每类包含若干参数,参数详情 man fio 查看,这里略过。

  • 任务描述
  • 时间参数
  • 目标文件/设备
  • I/O类型
  • 块大小
  • 缓冲区与内存
  • I/O 大小
  • I/O 引擎
  • I/O 深度
  • I/O 速率
  • I/O 延迟
  • I/O 重播
  • 线程、进程和作业同步
  • 验证
  • 稳态
  • 测量和报告
  • 错误处理
  • 运行预定义的工作负载

举例

--随机读 
--任务名:randread ,直接路径读,直接读取sdb,不经buffer,深度为64,随机读,io引擎为libaio,块大小4k,每线程IO大小为1G,任务数为1,任务运行时间为1000s,设备为sdb
fio -name=randread -direct=1 -iodepth=64 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdc

# 随机写  sdc盘作单纯测试用
fio -name=randwrite -direct=1 -iodepth=64 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdc

# 顺序读
fio -name=read -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdc

# 顺序写   sdc盘作单纯测试用
fio -name=write -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdc

测试报告解析

[root@kickstart ~]# fio -name=randread -direct=1 -iodepth=64 -rw=randread -ioengine=libaio -bs=4k -size=5G -numjobs=1 -runtime=10 -group_reporting -filename=/dev/sdb  
randread: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.1
Starting 1 process
Jobs: 1 (f=1): [r(1)][100.0%][r=115MiB/s,w=0KiB/s][r=29.5k,w=0 IOPS][eta 00m:00s] <<<<
randread: (groupid=0, jobs=1): err= 0: pid=22902: Tue May 31 17:15:38 2022
   read: IOPS=29.5k, BW=115MiB/s (121MB/s)(1152MiB/10001msec)
    slat (usec): min=18, max=716, avg=31.02, stdev= 8.09
    clat (usec): min=204, max=4219, avg=2137.73, stdev=91.47
     lat (usec): min=716, max=4322, avg=2169.35, stdev=92.46
    clat percentiles (usec):
     |  1.00th=[ 2008],  5.00th=[ 2040], 10.00th=[ 2057], 20.00th=[ 2073],
     | 30.00th=[ 2089], 40.00th=[ 2114], 50.00th=[ 2114], 60.00th=[ 2147],
     | 70.00th=[ 2147], 80.00th=[ 2180], 90.00th=[ 2212], 95.00th=[ 2245],
     | 99.00th=[ 2474], 99.50th=[ 2638], 99.90th=[ 3032], 99.95th=[ 3195],
     | 99.99th=[ 3458]
   bw (  KiB/s): min=116000, max=119080, per=100.00%, avg=117930.00, stdev=827.54, samples=20
   iops        : min=29000, max=29770, avg=29482.45, stdev=206.91, samples=20
  lat (usec)   : 250=0.01%, 750=0.01%, 1000=0.01%
  lat (msec)   : 2=0.67%, 4=99.32%, 10=0.01%
  cpu          : usr=0.47%, sys=99.52%, ctx=35, majf=0, minf=94
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.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.1%, >=64=0.0%
     issued rwt: total=294801,0,0, short=0,0,0, dropped=0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: bw=115MiB/s (121MB/s), 115MiB/s-115MiB/s (121MB/s-121MB/s), io=1152MiB (1208MB), run=10001-10001msec

Disk stats (read/write):
  sdb: ios=291783/0, merge=0/0, ticks=45307/0, in_queue=45335, util=99.10%

Jobs: 1 (f=1): [r(1)][100.0%][r=115MiB/s,w=0KiB/s][r=29.5k,w=0 IOPS][eta 00m:00s]

第一组方括号内的字符表示每个线程的当前状态。第一个字符是作业文件中定义的第一个作业,依此类推。可能的值(按典型生命周期顺序)为:

              P      Thread setup, but not started.
              C      Thread created.
              I      Thread initialized, waiting or generating necessary data.
              P      Thread running pre-reading file(s).
              /      Thread is in ramp period.
              R      Running, doing sequential reads.
              r      Running, doing random reads.
              W      Running, doing sequential writes.
              w      Running, doing random writes.
              M      Running, doing mixed sequential reads/writes.
              m      Running, doing mixed random reads/writes.
              D      Running, doing sequential trims.
              d      Running, doing random trims.
              F      Running, currently waiting for fsync(2).
              V      Running, doing verification of written data.
              f      Thread finishing.
              E      Thread exited, not reaped by main thread yet.
              -      Thread reaped.
              X      Thread reaped, exited with an error.
              K      Thread reaped, exited due to signal.

read: IOPS=29.5k, BW=115MiB/s (121MB/s)(1152MiB/10001msec)
read/write/trim 冒号前的字符串显示统计信息所针对的 I/O 方向。IOPS 是每秒执行的平均 I/O。BW 是平均带宽速率
slat (usec): min=18, max=716, avg=31.02, stdev= 8.09
slat 提交延迟 这是提交 I/O 所需的时间。对于同步 I/O,不显示此行,因为板条实际上是完成延迟(因为队列/完成是其中的一个操作)
clat (usec): min=204, max=4219, avg=2137.73, stdev=91.47
clat 完成延迟。 这表示从提交到完成 I/O 段的时间。对于同步 I/O,clat 通常等于(或非常接近)0,因为从提交到完成的时间基本上只是 CPU 时间(I/O 已经完成,请参阅板条说明)。
lat (usec): min=716, max=4322, avg=2169.35, stdev=92.46
lat 总延迟。与 slat 和 clat 的名称相同,这表示从 fio 创建 I/O 单元到完成 I/O 操作的时间。
bw ( KiB/s): min=116000, max=119080, per=100.00%, avg=117930.00, stdev=827.54, samples=20
bw 基于样本的带宽统计。与 xlat 统计信息的名称相同,但也包括采集的样本数(样本数)以及此线程在其组中接收的总聚合带宽的近似百分比(per)。仅当此组中的线程位于同一磁盘上时,最后一个值才真正有用,因为它们随后会争用磁盘访问。
iops : min=29000, max=29770, avg=29482.45, stdev=206.91, samples=20
iops 基于样本的 IOPS 统计信息。
lat (usec) : 250=0.01%, 750=0.01%, 1000=0.01%
lat (msec) : 2=0.67%, 4=99.32%, 10=0.01%

lat (nsec/usec/msec) I/O 完成延迟的分布。这是从 I/O 离开 fio 到完成的时间。与上面单独的读/写/修剪部分不同,此处和其余部分中的数据适用于报告组的所有 I/O。250=0.04% 表示 0.04% 的 I/O 在 250us 以下完成。500=64.11% 表示 64.11% 的 I/O 需要 250 到 499us 才能完成。
cpu : usr=0.47%, sys=99.52%, ctx=35, majf=0, minf=94
CPU 使用率。 用户和系统时间,以及此线程经历的上下文切换次数,系统和用户时间的使用情况,最后是主要和次要页面错误的数量。CPU 使用率数字是该报告组中作业的平均值,而上下文和故障计数器是相加的。
depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
IO depthsI/O 深度在作业生存期内的分布。
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
在单个提交调用中提交了多少个 I/O 片段。每个条目都表示该金额及以下,直到上一个条目 - 例如,16 = 100%表示我们每次提交呼叫提交9到16个I / O之间的任何地方。请注意,提交分发条目覆盖的范围可能与等效深度分布条目覆盖的范围不同。
issued rwt: total=294801,0,0, short=0,0,0, dropped=0,0,0
发出的读/写/修整请求的数量,以及其中有多少是短的或丢弃的。
latency : target=0, window=0, percentile=100.00%, depth=64
这些值用于延迟目标和相关选项。启用这些选项时,本节将介绍满足指定延迟目标所需的 I/O 深度。

列出每个客户端后,将打印组统计信息。它们将如下所示:
Run status group 0 (all jobs):
READ: bw=20.9MiB/s (21.9MB/s), 10.4MiB/s-10.8MiB/s (10.9MB/s-11.3MB/s), io=64.0MiB (67.1MB), run=2973-3069msec
WRITE: bw=1231KiB/s (1261kB/s), 616KiB/s-621KiB/s (630kB/s-636kB/s), io=64.0MiB (67.1MB), run=52747-53223msec

打印每个数据方向:
bw :此组中线程的聚合带宽,后跟此组中所有线程的最小和最大带宽。 括号外的值是 2 的幂格式,括号内的值是 10 次方格式的等效值。
io :对此组中的所有线程执行的聚合 I/O。格式与 bw 相同。
run :此组中线程的最小和最长运行时。

实战

通常情况下,I/O都是读写混合的,怎么模拟应用I/O呢?
使用blktrace命令记录设备上的I/O,再使用fio重放blktrace记录的I/O。

#跟踪设备上的I/O 期间复制了一份centos7.6.iso 和读取ISO镜像中的包
blktrace /dev/sdb
#将I/O记录转化为二进制文件
blkparse sdb -d sdb.bin
#重放
fio --name=replay --filename=/dev/sdb --direct=1 --read_iolog=sdb.bin 
replay: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
fio-3.1
Starting 1 process
Jobs: 1 (f=1): [M(1)][100.0%][r=0KiB/s,w=0KiB/s][r=0,w=0 IOPS][eta 00m:00s]          
replay: (groupid=0, jobs=1): err= 0: pid=23493: Tue May 31 21:42:45 2022
   read: IOPS=870, BW=171MiB/s (180MB/s)(4825MiB/28183msec)
    clat (usec): min=59, max=13441, avg=426.95, stdev=267.83
     lat (usec): min=59, max=13442, avg=427.13, stdev=267.83
    clat percentiles (usec):
     |  1.00th=[  161],  5.00th=[  192], 10.00th=[  239], 20.00th=[  306],
     | 30.00th=[  379], 40.00th=[  400], 50.00th=[  416], 60.00th=[  433],
     | 70.00th=[  457], 80.00th=[  490], 90.00th=[  562], 95.00th=[  660],
     | 99.00th=[  971], 99.50th=[ 1221], 99.90th=[ 3949], 99.95th=[ 4359],
     | 99.99th=[11076]
   bw (  KiB/s): min=27608, max=357844, per=100.00%, avg=266981.08, stdev=63130.40, samples=37
   iops        : min=  136, max= 1766, avg=1325.11, stdev=316.99, samples=37
  write: IOPS=573, BW=170MiB/s (178MB/s)(4779MiB/28183msec)
    clat (usec): min=47, max=18035, avg=232.20, stdev=344.15
     lat (usec): min=48, max=18065, avg=236.51, stdev=345.39
    clat percentiles (usec):
     |  1.00th=[   57],  5.00th=[   68], 10.00th=[   72], 20.00th=[   83],
     | 30.00th=[  124], 40.00th=[  182], 50.00th=[  262], 60.00th=[  277],
     | 70.00th=[  293], 80.00th=[  314], 90.00th=[  351], 95.00th=[  396],
     | 99.00th=[  570], 99.50th=[  709], 99.90th=[ 1467], 99.95th=[ 8717],
     | 99.99th=[16188]
   bw (  KiB/s): min= 3648, max=532424, per=100.00%, avg=271786.28, stdev=93116.18, samples=36
   iops        : min=  201, max= 1698, avg=896.00, stdev=336.83, samples=36
  lat (usec)   : 50=0.01%, 100=10.01%, 250=15.25%, 500=63.58%, 750=9.10%
  lat (usec)   : 1000=1.47%
  lat (msec)   : 2=0.40%, 4=0.10%, 10=0.06%, 20=0.03%
  cpu          : usr=8.48%, sys=23.75%, ctx=41002, majf=0, minf=26
  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 rwt: total=24523,16175,0, short=0,0,0, dropped=0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=24

Run status group 0 (all jobs):
   READ: bw=171MiB/s (180MB/s), 171MiB/s-171MiB/s (180MB/s-180MB/s), io=4825MiB (5059MB), run=28183-28183msec
  WRITE: bw=170MiB/s (178MB/s), 170MiB/s-170MiB/s (178MB/s-178MB/s), io=4779MiB (5011MB), run=28183-28183msec

Disk stats (read/write):
  sdb: ios=24523/16134, merge=0/1, ticks=10603/3856, in_queue=14460, util=51.27%

最后通过blktrace与fio结合,取得了模拟应用I/O的测试报告。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论