测试工具
FIO 是测试磁盘性能的工具,用来对硬件进行压力测试和验证,本文以 FIO 为例。 使用 FIO 时,建议配合使用 libaio 的 I/O 引擎进行测试。请参见 工具安装 完成 FIO 和 libaio 的安装。
测试对象建议
建议在空闲的、未保存重要数据的硬盘上进行 FIO 测试,并在测试完后重新制作被测硬盘的文件系统。
测试硬盘性能时,建议直接测试裸数据盘(如 /dev/vdb)。
测试文件系统性能时,推荐指定具体文件测试(如 /data/file)。
工具安装
1、购买一个系统为CentOS 7.6的云服务器并登陆
2、执行以下命令,查看云硬盘是否4KiB对齐。
1 | fdisk -lu |
如下图所示,若返回结果中的 Start 值能被8整除即是4KiB对齐。否则请完成4KiB对齐后再进行测试。
依次执行以下命令,安装测试工具 FIO 和 libaio。
1 | yum install libaio -y |
不同场景的测试公式基本一致,只有 rw、iodepth 和 bs(block size)三个参数的区别。例如,每个工作负载适合最佳 iodepth 不同,取决于您的特定应用程序对于 IOPS 和延迟的敏感程度。
参数说明:
- bs:每次请求的块大小。取值包括4k、8k及16k等
- ioengine:I/O 引擎。推荐使用 Linux 的异步 I/O 引擎,如libaio
- iodepth:请求的 I/O 队列深度
- direct:指定 direct 模式,True(1)表示指定 O_DIRECT 标识符,忽略 I/O 缓存,数据直写,False(0)表示不指定 O_DIRECT 标识符,默认为 True(1)
- read:读写模式,取值包括顺序读(read)、顺序写(write)、随机读(randread)、随机写(randwrite)、混合随机读写(randrw)和混合顺序读写(rw,readwrite)
- time_based:指定采用时间模式。无需设置该参数值,只要 FIO 基于时间来运行
- runtime:指定测试时长,即 FIO 运行时长
- refill_buffers:FIO 将在每次提交时重新填充 I/O 缓冲区,默认设置是仅在初始时填充并重用该数据
- norandommap:在进行随机 I/O 时,FIO 将覆盖文件的每个块,若给出此参数,则将选择新的偏移量而不查看 I/O 历史记录
- randrepeat:随机序列是否可重复,True(1)表示随机序列可重复,False(0)表示随机序列不可重复。默认为 True(1)
- group_reporting:多个 job 并发时,打印整个 group 的统计值
- name:job 的名称
- size:I/O 测试的寻址空间
- filename:测试对象,即待测试的磁盘设备名称
- numjobs:并发线程数,默认为1,当被测试硬盘性能较高时推荐加大numjobs数(如2或4等)以增加压力
测试用例
1、测试云硬盘的时延性能
关键参数:bs = 4k iodepth = 1
根据业务场景选择测试模型:这里演示随机读试
filename根据需要测试的块设备修改:这里演示 /dev/vdb
1 | fio -bs=4k -ioengine=libaio -iodepth=1 -numjobs=1 -direct=1 -rw=randread -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-randread-lat -size=10G -filename=/dev/vdb |
测试结果取红框值,单位是微秒(us) , 即4K随机读134us
2、测试云硬盘的吞吐性能
关键参数:bs = 128k iodepth = 32
其他“时延测试”
1 | fio -bs=128k -ioengine=libaio -iodepth=32 -numjobs=8 -direct=1 -rw=randread -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-read-throughput -size=10G -filename=/dev/vdb |
根据红框取值,随机读吞吐=629MiB/s
3、测试云硬盘的 IOPS 性能
关键参数:bs = 4k iodepth = 32
其他参考“时延测试”
1 | fio -bs=4k -ioengine=libaio -iodepth=32 -numjobs=8 -direct=1 -rw=randread -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-randread-iops -size=10G -filename=/dev/vdb |
根据红框取值,随机读IOPS 8.5万