0. 前言
对于存储系统,人们最为关注“三高”问题: 高性能,高可扩展性,高可靠性。尝尝会听到某司宣称自己的存储系统能够达到6个9(99.9999%),其指存储系统十分可靠,在一年中最多出现十几秒的宕机时间; 而对于高可扩展性,主要是指系统对存储设备(硬盘,闪存)数量增加的支持。而高性能则是指IOPS高,响应延迟低。
说远了,我们回到主题,为了测试系统IO性能的高低,在实际开发中,需要使用IO性能测试工具进行测试。今天在这里介绍一款测试工具“FIO”,它功能十分强大,能够对测试环境进行精密的配置,当然,可配置参数多,也导致想完全掌握有难度。不过,我们先来初见FIO的真面目。
1. Fio简介
简单来说,Fio是用来测试系统IO性能的工具,它的强大之处在与提供了一套测试框架,能够支持多线程多进程的IO测试,用户只需进行参数的配置,便能够方便地定制不同的IO行为(顺序读写,随机读写等),并对其性能进行监测。其作者Jens Axboe是linux内核IO部分的maintainer。而gfio则是Fio的图形监测工具,它提供了图形界面的参数配置,和性能监测图像。
2. Fio安装
Fio的安装,根据其在github上的项目安装说明,进行操作即可。
特别说明:
2.1 异步IO引擎
为了使用异步IO引擎,需要安装libaio-dev
sudo apt-get install libaio-dev
2.2 安装步骤
gfio是基于gdk实现,因此需要首先安装gdk,官方文档说,gdk版本要求在2.18及其以上,但没有找到如何安装2.0以上的版本,目前使用下面的命令安装通过了,并且能够运行gfio。
sudo apt-get install libgtk2.0-dev
接下来就可以正式安装Fio了。
源代码下载 git clone git://git.kernel.dk/fio.git
运行configure ./configure --enable-gfio
注:如果希望不支持gfio,只需去掉后面的--enable-gfio参数
make
make install
经过这几步,Fio的安装已经全部完成,为了测试是否安装成功,这里使用examples中的例子进行测试:
fio examples/ssd-test.fio
修正出现的错误:目录设置问题
fio: /mount-point-of-ssd is not a directory
fio: failed parsing directory=/mount-point-of-ssd
fio: job global dropped
修改后,如果成功执行,说明FIO安装成功。
3. 运行参数配置
Fio的运行参数配置支持“命令行模式”或者“Job File模式”,简单来讲,前者是将所有配置参数写在一个配置文件当中,然后使用fio config_file方式运行;而另外一种是以命令的形式进行设置。
3.1 配置实例
命令行 fio --name=first_job --ioengine=libaio --iodepth=4 \
--size=10m --bs=4k --rw=write \
--direct=1 --filename=/devdata/1.txt
命令行模式,以 “ - - ”+参数名+“=”的方式,对参数进行配置。具体参数的意义见后面介绍。
Job File [global]
ioengine=libaio
iodepth=4
size=10m
bs=4k
rw=write
direct=1
filename=/devdata/1.txt
[first_job]
说明:
配置文件划分为多个区域,每个区域的参数设置均作用于其下方的区域。
“global”区域进行全局的参数配置。
非特定名字的区域(first_job)则被视为一个运行任务。
运行结果:
3.2 配置参数解释
Fio的配置参数高达上百种,要完全了解每个参数,实属不易,在这里,我只介绍几个重要的参数。
通过fio --cmdhelp命令,我们可以查看所有参数的意义,比如,查看“bs”的意义:
$fio --cmdhelp | grep bs
bs : Block size unit
bsrange : Set block size range (in more detail than bs)
bssplit : Set a specific mix of block sizes
bs_unaligned : Don't sector align IO buffer sizes
numjobs : Duplicate this job this many times
exitall : Terminate all jobs when one exits
可以得知:“bs”表示块大小。
在github的HOWTO文档中,作者对所有的配置参数做了详细的解释,当遇到不熟悉的参数时,可以进行查阅。
bs : 设置IO请求的块大小,可以给出上下限
支持对read,write,trim分别进行设置,以逗号隔开
比如:bs=1k-2k,3k-4k,5k-6k
size : 文件请求的大小,控制job结束
rw : 控制读写类型: read/write/rw/randread/randwrite/randrw
direct : 1表示绕过buffer,直接作用于设备
ioengine: io引擎:libaio(异步IO),syslet等
iodepth : 异步IO情况下,IO队列的长度
runtime : 执行时间限制,控制job结束
filename: 输出文件或者设备名,eg:/dev/sba
参考资料
Fio github主页– fio源代码及文档
GTK安装参考文档–GTK安装参考文档
FIO优秀文章–关于FIO使用的介绍