本文介绍如何使用FIO工具测试Linux实例的存储性能,包括IO延迟、IOPS和带宽。
您已将待测试的云盘挂载到实例上。
推荐使用FIO工具测试块存储IO延迟的性能,FIO是一个对硬件进行压力测试和验证的I/O工具,是一款Linux平台上较为推荐的磁盘性能测试工具。
FIO分为两种运行方式,本文中测试示例均使用fio jobfile方式,即通过一个job文件来描述待访真的IO负载,一个job文件可以控制产生任意数目的线程和文件,典型的job文件包含一个global段(定义共享参数)和一个或多少job段(描述具体要产生的job)。
安装FIO工具
远程连接云服务器并登录,具体操作请参考登录Linux实例小节。
从FIO官网下载安装包到实例,官网地址为http://freecode.com/projects/fio/。
执行以下命令解压缩安装包。tar -zxvf fio-*.tar.gz
依此执行以下命令,安装FIO。cd fio-*
./configure
make
make install
执行以下命令安装libaio。sudo yum -y install libaio
sudo yum -y install libaio-devel
执行以下命令查看云硬盘是否4KiB对齐,如果不是4KiB对齐,则对性能影响较大。fdisk -lu
如果各云硬盘的Start值能够被8整除则表示4KiB对齐。
创建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
创建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
推荐使用FIO工具测试块存储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
创建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
参数 | 说明 |
---|---|
[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的块文件大小。 |
参数 | 说明 |
---|---|
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方式。 |