You need to enable JavaScript to run this app.
导航
测试存储性能
最近更新时间:2023.12.07 17:11:00首次发布时间:2021.07.09 13:31:09

本文介绍如何使用FIO工具测试Linux实例的存储性能,包括IO延迟、IOPS和带宽。

前提条件

您已将待测试的云盘挂载到实例上。

测试IO延迟性能

推荐使用FIO工具测试块存储IO延迟的性能,FIO是一个对硬件进行压力测试和验证的I/O工具,是一款Linux平台上较为推荐的磁盘性能测试工具。
FIO分为两种运行方式,本文中测试示例均使用fio jobfile方式,即通过一个job文件来描述待访真的IO负载,一个job文件可以控制产生任意数目的线程和文件,典型的job文件包含一个global段(定义共享参数)和一个或多少job段(描述具体要产生的job)。

安装FIO工具

  1. 远程连接云服务器并登录,具体操作请参考登录Linux实例小节。

  2. 从FIO官网下载安装包到实例,官网地址为http://freecode.com/projects/fio/。

    1. 执行以下命令解压缩安装包。
      tar -zxvf fio-*.tar.gz

    2. 依此执行以下命令,安装FIO。
      cd fio-*
      ./configure
      make
      make install

    3. 执行以下命令安装libaio。
      sudo yum -y install libaio
      sudo yum -y install libaio-devel

  3. 执行以下命令查看云硬盘是否4KiB对齐,如果不是4KiB对齐,则对性能影响较大。
    fdisk -lu
    如果各云硬盘的Start值能够被8整除则表示4KiB对齐。

测试全盘随机读IO延迟

创建job_file文件测试随机读的IO延迟,文件内容如下。创建后,执行命令fio job_file查看测试结果。

[global]
ioengine=libaio
userspace_reap
runtime=60
direct=1
group_reporting
randrepeat=0
norandommap
ramp_time=6
iodepth=1
numjobs=1
exitall
[randread4k]
filename=/dev/vdb
rw=randread
bs=4K

测试全盘随机写IO延迟

创建job_file文件测试随机读的IO延迟,文件内容如下。创建后,执行命令fio job_file查看测试结果。

[global]
ioengine=libaio
userspace_reap
time_based
runtime=60
direct=1
group_reporting
randrepeat=0
norandommap
ramp_time=6
iodepth=1
numjobs=1
exitall
[randwrite4k]
filename=/dev/vdb
rw=randwrite
bs=4K

测试IOPS性能

推荐使用FIO工具测试块存储IOPS性能。

测试随机读IOPS

创建job_file文件测试随机读的IOPS,文件内容如下。创建后,执行命令fio job_file查看测试结果。

[global]
ioengine=libaio
userspace_reap
time_based
runtime=60
direct=1
group_reporting
randrepeat=0
norandommap
ramp_time=6
iodepth=128
numjobs=8
exitall
[randread4k]
filename=/dev/vdb
rw=randread
bs=4k

测试随机写IOPS

创建job_file文件测试随机写的IOPS,文件内容如下。创建后,执行命令fio job_file查看测试结果。

[global]
ioengine=libaio
userspace_reap
time_based
runtime=60
direct=1
group_reporting
randrepeat=0
norandommap
ramp_time=6
iodepth=128
numjobs=8
exitall
[randwrite4k]
filename=/dev/vdb
rw=randwrite
bs=4k

测试带宽

推荐使用dd命令测试块存储带宽的性能。dd命令用于从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备。根据传输的时间,可以计算存储带宽。

测试顺序读带宽

执行以下命令:
dd if=/dev/vdb of=/dev/null bs=16M count=1024 iflag=direct

测试顺序写带宽

执行以下命令:
dd if=/dev/zero of=/dev/vdb bs=16M count=1024 oflag=direct

FIO参数取值说明

参数说明
[global]/[randread4k]表示job的名称。global名称不可修改,其中描述了job file中各个job的默认配置值。
ioengine=libaio定义FIO使用哪种IO引擎,支持同步或异步I/O,此处建议使用libaio(异步I/O),表示一次性提交一批I/O请求,等待一批完成后再提交下一批,可以减少交互次数,提高效率。
userspace_reap与libaio配合,提高异步IO的收割速度。
time_based表示如果在runtime指定的时间还没到时文件就被读写完成,将继续重复读写直到runtime时间结束。
runtime=60指定在多少秒后停止进程,建议设置为60s。
direct=1表示测试时绕过机器自带的buffer,使测试结果更真实。
group_reporting表示汇总每个(线程/进程)的信息显示结果。
randrepeat=0随机序列是否可重复,True(1)表示随机序列可重复,False(0)表示随机序列不可重复,推荐设置为0。
norandommap一般情况下,FIO执行随机IO时,将会覆盖文件的每一个块,即FIO会使用一段内存来记录是不是随机到重复的位置,如果随机到重复的位置,那么FIO会再去找一个不重复的位置。设置这个选项后,FIO将不会查询过去的历史,实现真正意义上的随机读写。
ramp_time=6表示等待6s性能稳定后,再记录日志结果,可以减少生成稳定结果需要的运行时间。
iodepth=1设置IO队列的深度,表示使用异步I/O时,同时发出的I/O数上限。
numjobs=1推荐使用CPU核心数,例如云服务器CPU核数为8,则numjobs推荐取值为8。
exitall表示一个job完成,就停止所有的job。
filename=/dev/vdb指定待测试的磁盘名称。
rw=randread表示对磁盘进行随机读测试。
rw=randwrite表示对磁盘进行随机写测试。
bs=4K设置单次IO的块文件大小。

dd命令参数取值说明

参数说明
if=/dev/zero输入文件名,即指定源文件。if=/dev/zero表示测试纯写入性能。
of=/dev/null输出文件名,即指定目的文件。of=/dev/null表示测试纯读取性能。
bs=16M设置单次读入/输出块的大小为bytes个字节。
count=1024表示仅拷贝1024个块,块大小等于bs指定的字节数。
iflag=direct表示读数据采用直接IO方式。
oflag=direct表示写数据采用直接IO方式。