Linux IO性能测试工具: FIO之初见

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]
    

说明:

  1. 配置文件划分为多个区域,每个区域的参数设置均作用于其下方的区域。
  2. “global”区域进行全局的参数配置。
  3. 非特定名字的区域(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使用的介绍


版权声明:本文为SunliyMonkey原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。