FIO 介绍
fio 是一个常见的用于测试磁盘 I/O 性能的工具,支持 19 种不同的 I/O 引擎,包括:sync, mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。fio 一直在更新,最新的版本是 v3.19,它的官网是 fio。
常用参数
常用参数 | 参数说明 | 参数取值(eg:) |
---|
name | FIO 运行任务的名称 (可选) | name=fio-test |
description | FIO 运行时的描述 (可选) | description=“this is a test” |
loops | FIO 是否要循环执行该任务 (可选) | loops=5 |
numjobs | 每个FIO 任务要开启多少数量的线程 | numjobs=8 |
runtime | FIO 任务要执行的时间,单位为s | runtime=300 |
time_based | 设置后,即便FIO写完了整个磁盘,也不会退出任务。当任务的时间满足runtime设置的时间后,才会退出任务 | time_based |
startdelay | 延迟作业的启动时间。如果指定区间类型的数值,将从区间中选择一个随机值用来启动任务。单位为s | startdelay=10 |
ramp_time | FIO 在执行任务时预热的时间。可以使性能测试的结果更加精确可靠。单位为s | ramp_time=60 |
filename | 测试文件的名称,通常为硬盘的盘符名称 | filename=/dev/sdd |
pre_read | 在FIO下发 I/O 前,文件会被加载到内存中。当 pre_read=true 时会清除掉磁盘中的元数据,默认为false | pre_read=false |
max_open_zones | FIO 执行随机写入任务时,允许写入/读取的磁盘的区域的最大数量。 | max_open_zones=1000000 |
direct | 是否使用非缓冲I/O。默认为false | direct=true |
readwrite | I/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_buffers | FIO 在每次提交时重新填充 I/O 缓冲区。使用 zero_buffers 参数后,该参数会失效 | refill_buffers |
buffer_compress_percentage | 压缩 I/O 缓冲区的百分比,配合 refill_buffers 可以降低硬盘中相邻块中数据的一致性 | buffer_compress_percentage=70 |
size | FIO 执行任务时要读取或写入的数据总和。size为百分比时将按照硬盘容量 * percentage | size=300G or size=50% |
ioengine | FIO 任务工具时的引擎,sync, libaio, rdma… | ioengine=libaio |
iodepth | 任务执行时的 I/O 队列深度的单元数。任务的线程数 = numjobs * iodepth | iodepth=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单机性能测试
阿里云测试块存储性能