【fio】benchmark-fio教程

fio使用

fio执行命令:

fio \
  --name=1m_test \
  --directory=/mnt/test01/ganesha \
  --rw=write \
  --bs=1M \
  --iodepth=32 \
  --numjobs=12 \
  --runtime=160 \
  --time_based \
  --direct=1 \
  --ioengine=libaio \
  --size=100G \
  --group_reporting

 

# 前面几行是命令运行时,实时显示的信息
# 名为 Max throughput 的 Job 基本信息
Max throughput: (g=0): rw=write, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=4
fio-3.7 # fio 版本号
Starting 1 thread # 本次此时启动了 1 个线程
# 1 表示运行的IO线程数;[W(1)] 表示使用的模式;[100.0%] 表示当前命令的执行进度;[r=0KiB/s,w=137MiB/s] 表示瞬时吞吐率;
# [r=0,w=35.0k IOPS] 表示 IOPS 瞬时值;[eta 00m:00s] 表示持续时间
# 该行内容在命令执行期间,可以看到值在实时变化
Jobs: 1 (f=1): [W(1)][100.0%][r=0KiB/s,w=137MiB/s][r=0,w=35.0k IOPS][eta 00m:00s]

# 从本行开始为命令执行完成后每个 Job 的统计信息。
# Job名称:(当前的GID,Job个数):错误个数:本次Job的PID,本次Job的结束时间
Max throughput: (groupid=0, jobs=1): err= 0: pid=7767: Thu Nov 12 16:09:04 2020
# 本次Job的测试模式(这里是写入),IOPS平均值,带宽平均值,(带宽最大值)(数据总量/运行总时间)
# BW 是 BandWidth 的缩写。2048MiB 就是指的 -size 参数指定的 大小,是本次测试读/写的数据总量
  write: IOPS=34.3k, BW=134MiB/s (140MB/s)(2048MiB/15289msec)

# latency(延迟)相关信息。(单位是:微妙)。注意后面信息括号中的单位会改变,fio 会根据本次测试结果得出的时间,合理给出一个单位。msec毫秒,usec微秒,nsec纳秒
# slat 是 Submission latency(提交延迟),就是提交到实际执行 I/O 的时间
    slat (usec): min=3, max=6347, avg= 6.09, stdev=12.68
# clat 是 Completion latency(完成延迟),就是从提交到完成的时间
    clat (usec): min=57, max=74949, avg=108.13, stdev=230.83
# lat 是 Total latency(总延迟),就是 fio 从创建这个 I/O 单元到完成的总时间
     lat (usec): min=63, max=74954, avg=114.80, stdev=231.22
# 完成延迟的百分位数(单位是:微妙),比如99.00th=[  149] 表示这组样本的 99 百分位的延迟的值为 149
    clat percentiles (usec):
     |  1.00th=[   86],  5.00th=[   92], 10.00th=[   94], 20.00th=[   97],
     | 30.00th=[   99], 40.00th=[  101], 50.00th=[  103], 60.00th=[  106],
     | 70.00th=[  109], 80.00th=[  113], 90.00th=[  119], 95.00th=[  125],
     | 99.00th=[  149], 99.50th=[  192], 99.90th=[  330], 99.95th=[  988],
     | 99.99th=[ 5276]
# 基于一组样本的带宽信息(单位是 KiB/s):最小值,最大值,该线程在其组中接收的总聚合带宽的大约百分比,平均值,标准偏差,本次采样的样本总数
   bw (  KiB/s): min=113928, max=149024, per=99.98%, avg=137137.07, stdev=7370.84, samples=30
# 基于一组样本的IOPS信息,与 bw 一样
   iops        : min=28482, max=37256, avg=34284.27, stdev=1842.71, samples=30
# I/O 完成延迟的分布,这里的信息适用于一组报告的所有 I/O
# 500=0.27% 表示 0.27% 的 I/O 在 500 微妙以内完成
  lat (usec)   : 100=34.55%, 250=65.12%, 500=0.27%, 750=0.01%, 1000=0.01%
  lat (msec)   : 2=0.01%, 4=0.02%, 10=0.02%, 20=0.01%, 100=0.01%
# cpu 使用率
  cpu          : usr=10.24%, sys=23.20%, ctx=189677, majf=0, minf=1
# IO 深度在整个工作周期中分布
  IO depths    : 1=0.1%, 2=0.1%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
# 一个提交调用中要提交多少IO
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
# 一个完成调用中要完成多少IO
     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,524288,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=4

# 在上面将所有 Job 的统计信息都列出来之后,这下面显示所有 Job 最终的统计信息。这些数据是所有 Job 的平均值。
Run status group 0 (all jobs):
# 本次测试的模式(写测试):带宽平均值,带宽最小值-带宽最大值,io(i.e.读写数据的总量),运行时间
# 括号外的值是2的幂的格式,括号中的值是10的幂的等效值
  WRITE: bw=134MiB/s (140MB/s), 134MiB/s-134MiB/s (140MB/s-140MB/s), io=2048MiB (2147MB), run=15289-15289msec


# 当前测试数据所在磁盘的统计信息
# ios 表示所有组执行的 I/O 数,ios就是 I/Os。
# merge 表示 I/O 调度程序执行的合并数。
# ticks 表示我们保持磁盘活跃的 ticks 数。
# in_queue 表示在磁盘队列中花费的总时间
# util 表示磁盘利用率。在命令执行期间 100%表示我们使磁盘一直处于繁忙状态,而50%的磁盘将有一半的时间处于空闲状态
# aggr 前缀的信息官方没有说明,应该是聚合的意思
Disk stats (read/write):
    dm-0: ios=0/519394, merge=0/0, ticks=0/47273, in_queue=47273, util=97.70%, aggrios=0/524290, aggrmerge=0/0, aggrticks=0/48534, aggrin_queue=1310, aggrutil=97.56%
  vda: ios=0/524290, merge=0/0, ticks=0/48534, in_queue=1310, util=97.56%

image

这是一个示意图:展示了 fio 输出里的 slat / clat / lat 的关系

  • 蓝色部分 (slat):I/O 提交延迟(fio 发请求到内核/驱动)
  • 橙色部分 (clat):I/O 完成延迟(请求在设备端处理并返回)
  • 红色虚线 (lat):总延迟,等于 slat + clat。

用时间轴表示:

image

参考资料

1. 硬盘性能测试笔记学习全套

2. 测试块存储性能

3. fio 磁盘性能测试工具

posted @ 2020-10-17 10:35  苏格拉底的落泪  阅读(1244)  评论(0)    收藏  举报