FIO存储性能工具

FIO 介绍

fio 是一个常见的用于测试磁盘 I/O 性能的工具,支持 19 种不同的 I/O 引擎,包括:sync, mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。fio 一直在更新,最新的版本是 v3.19,它的官网是 fio。

常用参数

常用参数参数说明参数取值(eg:)
nameFIO 运行任务的名称 (可选)name=fio-test
descriptionFIO 运行时的描述 (可选)description=“this is a test”
loopsFIO 是否要循环执行该任务 (可选)loops=5
numjobs每个FIO 任务要开启多少数量的线程numjobs=8
runtimeFIO 任务要执行的时间,单位为sruntime=300
time_based设置后,即便FIO写完了整个磁盘,也不会退出任务。当任务的时间满足runtime设置的时间后,才会退出任务time_based
startdelay延迟作业的启动时间。如果指定区间类型的数值,将从区间中选择一个随机值用来启动任务。单位为sstartdelay=10
ramp_timeFIO 在执行任务时预热的时间。可以使性能测试的结果更加精确可靠。单位为sramp_time=60
filename测试文件的名称,通常为硬盘的盘符名称filename=/dev/sdd
pre_read在FIO下发 I/O 前,文件会被加载到内存中。当 pre_read=true 时会清除掉磁盘中的元数据,默认为falsepre_read=false
max_open_zonesFIO 执行随机写入任务时,允许写入/读取的磁盘的区域的最大数量。max_open_zones=1000000
direct是否使用非缓冲I/O。默认为falsedirect=true
readwriteI/O 模式。read、write、randwrite、randread、randrw。混合读写时默认读写比例为50%:50%readwrite=read
percentage_random随机写入时包含多少的随机数据percentage_random=30%
blocksize读取/写入时块的大小bs=1M
zero_buffers初始化所有零的缓冲区。默认用随机数填充缓冲区zero_buffers
rwmixread混合模式中读取所占的百分比rwmixread=30
rwmixwrite混合模式中写入所占的百分比rwmixwrite=70
refill_buffersFIO 在每次提交时重新填充 I/O 缓冲区。使用 zero_buffers 参数后,该参数会失效refill_buffers
buffer_compress_percentage压缩 I/O 缓冲区的百分比,配合 refill_buffers 可以降低硬盘中相邻块中数据的一致性buffer_compress_percentage=70
sizeFIO 执行任务时要读取或写入的数据总和。size为百分比时将按照硬盘容量 * percentagesize=300G or size=50%
ioengineFIO 任务工具时的引擎,sync, libaio, rdma…ioengine=libaio
iodepth任务执行时的 I/O 队列深度的单元数。任务的线程数 = numjobs * iodepthiodepth=16

命令行使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 顺序读
$ fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

# 顺序写
$ fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

# 随机读
$ fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

# 随机写
$ fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

# 混合随机读写
$ fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=100 -group_reporting -name=mytest -ioscheduler=noop

配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# fio.conf
[global]
ioengine=libaio
iodepth=128
direct=0
thread=1
numjobs=16
norandommap=1
randrepeat=0
runtime=60
ramp_time=6
size=1g
directory=/your/path

[read4k-rand]
stonewall
group_reporting
bs=4k
rw=randread

[read64k-seq]
stonewall
group_reporting
bs=64k
rw=read


[write4k-rand]
stonewall
group_reporting
bs=4k
rw=randwrite

[write64k-seq]
stonewall
group_reporting
bs=64k
rw=write

测试场景

大文件读写测试

大文件顺序读
1
2
3
4
fio --name=big-file-sequential-read \
    --directory=/data \
    --rw=read --refill_buffers \
    --bs=256k --size=4G
大文件顺序写
1
2
3
4
fio --name=big-file-sequential-write \
    --directory=/data \
    --rw=write --refill_buffers \
    --bs=256k --size=4G
大文件并发读
1
2
3
4
5
fio --name=big-file-multi-read \
--directory=/data \
--rw=read --refill_buffers \
--bs=256k --size=4G \
--numjobs={1, 2, 4, 8, 16}
大文件并发写
1
2
3
4
5
fio --name=big-file-multi-write \
    --directory=/data \
    --rw=write --refill_buffers \
    --bs=256k --size=4G  \
    --numjobs={1, 2, 4, 8, 16}
大文件随机读
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
fio --name=big-file-rand-read \
    --directory=/data \
    --rw=randread --refill_buffers \
    --size=4G --filename=randread.bin \
    --bs={4k, 16k, 64k, 256k} --pre_read=1

sync && echo 3 > /proc/sys/vm/drop_caches

fio --name=big-file-rand-read \
    --directory=/data \
    --rw=randread --refill_buffers \
    --size=4G --filename=randread.bin \
    --bs={4k, 16k, 64k, 256k}
大文件随机写
1
2
3
4
fio --name=big-file-random-write \
    --directory=/data \
    --rw=randwrite --refill_buffers \
    --size=4G --bs={4k, 16k, 64k, 256k}

小文件读写测试

小文件读
1
2
3
4
fio --name=small-file-seq-read \
    --directory=/data \
    --rw=read --file_service_type=sequential \
    --bs={file_size} --filesize={file_size} --nrfiles=1000
小文件写
1
2
3
4
fio --name=small-file-seq-write \
    --directory=/data \
    --rw=write --file_service_type=sequential \
    --bs={file_size} --filesize={file_size} --nrfiles=1000
小文件并发读
1
2
3
4
5
fio --name=small-file-multi-read \
    --directory=/data \
    --rw=read --file_service_type=sequential \
    --bs=4k --filesize=4k --nrfiles=1000 \
    --numjobs={1, 2, 4, 8, 16}
小文件并发写
1
2
3
4
5
fio --name=small-file-multi-write \
    --directory=/data \
    --rw=write --file_service_type=sequential \
    --bs=4k --filesize=4k --nrfiles=1000 \
    --numjobs={1, 2, 4, 8, 16}

总结

硬盘性能指标

  • 顺序读写(吞吐量,常用单位为 MB/s):文件在硬盘上存储位置是连续的。

适用场景:大文件拷贝(比如视频音乐)。速度即使很高,对数据库性能也没有参考价值。

  • 4K 随机读写(IOPS,常用单位为次):在硬盘上随机位置读写数据,每次 4KB。

适用场景:操作系统运行、软件运行、数据库。

参考资料

官方文档

fio单机性能测试

阿里云测试块存储性能

0%