一 简介
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