hl10502的博客

fio安装使用

fio(Flexible I/O Tester)是个非常强大的IO性能测试工具

官网:http://freecode.com/projects/fio
GitHub:https://github.com/axboe/fio

安装fio

环境

CentOS7.2

yum安装fio

1
[root@node001 ~]# yum install fio

源码安装

可以在 http://freecode.com/projects/fio 先下载最新的fio

1
2
3
4
[root@node001 ~]# tar -xzvf fio-2.1.10.tar.gz
[root@node001 ~]# cd fio-2.1.10/
[root@node001 ~]# make
[root@node001 ~]# make install

安装libaio引擎

1
[root@node001 ~]# yum install libaio-devel

查看fio版本

1
2
[root@node001 ~]# fio --version
fio-2.1.10

查看fio支持的engine,最新的版本已支持rbd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@node001 ~]# fio --enghelp
Available IO engines:
cpuio
mmap
sync
psync
vsync
pvsync
null
net
netsplice
libaio
rdma
posixaio
falloc
e4defrag
splice
rbd
gfapi
gfapi_async
sg
binject

fio测试参数

参数名 描述
ioengine 负载引擎,我们一般使用libaio,发起异步IO请求
bs 单次IO的块文件大小,比如4k、8k、4M等
direct 直接写,绕过操作系统Cache。因为我们测试的是硬盘,而不是操作系统的Cache,所以设置为1
rw 读写模式:顺序写write、顺序读read、顺序读写rw、随机写randwrite、随机读randread、随机读写randrw
size 寻址空间,IO会落在 [0, size)这个区间的硬盘空间上。一般不设置,默认为测试对象的大小
filename 测试对象(文件名称或者硬盘盘符)
iodepth 队列深度,只有使用libaio时才有意义。这是一个可以影响IOPS的参数
numjobs 测试线程数,默认为1
runtime 测试时长,单位为妙
time_based 即使完全写入或者读取,也可以运行runtime指定的时间
rwmixread 在混合读写的模式下,读占用的比例,默认为50
rwmixwrite 在混合读写的模式下,写占用比例,默认为50
group_reporting 如果设置了多任务参数numjobs,用每组报告代替每job报告
thread 使用pthread_create(3)创建的线程,而不是使用fork(2)创建的进程
randrepeat 设置产生的随机数是否可重复的,默认为true
stonewall 用在job文件中,启动当前job之前等待job文件中上一个job退出

具体的参数可参考文档 https://linux.die.net/man/1/fio

libaio引擎,需要设置-direct=1
块大小必须是扇区的倍数

4K随机读写

1
fio -filename=/dev/nvme0n1 -iodepth=128 -numjobs=4 -thread -rw=randrw -rwmixread=70 -bs=4k -ioengine=libaio -group_reporting -name=mytest -randrepeat=0 -time_based -runtime=120 -direct=1

4K随机读

1
fio -filename=/dev/nvme0n1 -iodepth=128 -numjobs=4 -thread -rw=randread -bs=4k -ioengine=libaio -group_reporting -name=mytest -randrepeat=0 -time_based -runtime=120 -direct=1

4K随机写

1
fio -filename=/dev/nvme0n1 -iodepth=128 -numjobs=4 -thread -rw=randwrite -bs=4k -ioengine=libaio -group_reporting -name=mytest -randrepeat=0 -time_based -runtime=120 -direct=1

Job文件

fio可以通过一个job文件来描述IO负载。一个job文件可以控制产生任意数目的线程和文件。典型的job文件有一个global段(定义共享参数),一个或多少job段(描述具体要产生的job)。

运行Job文件时,fio从文件读这些参数,做处理,并根据这些参数描述,启动这些线程/进程。

Job运行方式

1
fio [jobfile]

Job文件格式

Job文件格式采用经典的ini文件,[]中的值表示job name,可以采用任意的ASCII字符,‘global’除外,global有特殊的意义。Global section描述了job file中各个job的默认配置值。一个job section可以覆盖global section中的参数,一个job file可以包含几个global section.一个job只会受到它上面的global section的影响。‘;’和‘#’可以用作注释。

例如:Job文件myjob.fio

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[global] #全局参数
ioengine=libaio
iodepth=128
time_based
direct=1
thread=1
group_reporting
randrepeat=0
norandommap
numjobs=32
timeout=60
runtime=120
[randread-4k] #Job名称,4K随机读
rw=randread
bs=4k
filename=/dev/nvme0n1
stonewall
[randwrite-4k] #Job名称,4K随机写
rw=randwrite
bs=4k
filename=/dev/nvme0n1
stonewall

执行Job文件

1
fio myjob.fio

相当于执行了两条fio命令

4K随机读

1
fio -filename=/dev/nvme0n1 -iodepth=128 -numjobs=32 -thread -rw=randread -bs=4k -ioengine=libaio -group_reporting -name=randread-4k -randrepeat=0 -time_based -runtime=120 -timeout=60 -direct=1

4K随机写

1
fio -filename=/dev/nvme0n1 -iodepth=128 -numjobs=32 -thread -rw=randwrite -bs=4k -ioengine=libaio -group_reporting -name=randwrite-4k -randrepeat=0 -time_based -runtime=120 -timeout=60 -direct=1

使用gnuplot画图

安装gnuplot

安装画图插件gnuplot

1
[root@node001 ~]# yum install gnuplot

设置fio输出日志

fio的输出日志主要包含三种:bw,lat和iops,在Job文件中[randread-4k]下设置这三种参数如下:
write_bw_log=randread-4k
write_lat_log=randread-4k
write_iops_log=randread-4k

randread-4k是输出日志文件名的前缀,生成的日志文件如下:
randread-4k_bw.log
randread-4k_clat.log
randread-4k_iops.log
randread-4k_lat.log
randread-4k_slat.log

画图

执行fio_generate_plots命令画图,randread-4k是Job中配置的write_bw_log、write_lat_log、write_iops_log的值,也即日志文件名的前缀

1
fio_generate_plots randread-4k

生成的图片文件如下:
randread-4k-bw.svg
randread-4k-clat.svg
randread-4k-iops.svg
randread-4k-lat.svg
randread-4k-slat.svg

硬盘性能指标

指标 IO读写 描述 适用场景
吞吐量(MB/s) 1M顺序读写 文件在硬盘上存储位置是连续的 大文件拷贝(比如视频音乐)
IOPS 4K随机读写 在硬盘上随机位置读写数据,每次4KB 操作系统运行、软件运行、数据库