【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%

这是一个示意图:展示了 fio 输出里的 slat / clat / lat 的关系
- 蓝色部分 (slat):I/O 提交延迟(fio 发请求到内核/驱动)
- 橙色部分 (clat):I/O 完成延迟(请求在设备端处理并返回)
- 红色虚线 (lat):总延迟,等于 slat + clat。
用时间轴表示:


浙公网安备 33010602011771号