测试存储性能指南

本文最后更新于 58 天前, 如有失效请评论区留言.

本文主要是记录一下最近的工作: 测试存储性能, 介绍如何在Linux环境下使用FIO(Flexible I/O Tester)工具对存储设备进行性能测试。

提醒

不同工具测试的硬盘基准性能会有差异,如ddsysbenchiometer等工具可能会受到测试参数配置和文件系统影响,难以反映真实性能。本示例的性能参数,均为Linux系统下采用FIO工具的测试结果。请在测试前提前创建快照做好数据备份,建议只在全新环境下进行测试,避免造成数据丢失

准备工作

  1. 创建了待测试的存储,并将相关测试存储挂载到服务器上
  2. 查询块存储设备是否已经4 KiB对齐, 返回的结果中,Start值能被8整除即是4 KiB对齐。否则,请完成4 KiB对齐后再继续性能测试.(仅限块存储)
fdisk -lu
# 结果
Device     Boot Start       End   Sectors Size Id Type
/dev/sda1  *     2048 125730782 125728735  60G 83 Linux
  1. 安装libaio和FIO
# centos
yum install libaio -y
yum install libaio-devel -y
yum install fio -y
# debian
apt install libaio-dev fio -y

性能测试命令

示例命令中的参数取值仅供参考,请您根据实际情况替换。例如,如果需要测试的存储为/dev/sdb,则将以下示例命令中的/dev/your_device替换为/dev/sdb,但是这种比较有风险,测试裸盘可以获得真实的块存储盘性能,但会破坏文件系统结构,请在测试前提前创建快照做好数据备份。也可以选择将/dev/sdb挂载到某个目录下,如/opt/quickon/storage/longhorn, 将示例命令中的/dev/your_device替换为/opt/quickon/storage/longhorn/随机文件名

测试硬盘的4k随机写IOPS

fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=Rand_Write_Testing

测试硬盘的4k随机读IOPS

fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=Rand_Read_Testing

测试硬盘的4k顺序读IOPS

fio -direct=1 -iodepth=128 -rw=read -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=Read_Testing

测试硬盘的4k顺序写IOPS

fio -direct=1 -iodepth=128 -rw=write -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=Write_Testing

测试硬盘的4k混合随机读写IOPS

fio -direct=1 -iodepth=128 -rw=randrw -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=Rand_Read_Write_Testing

下面的仅列举一个,其他修改相关参数就可以

测试硬盘的顺序写吞吐量

fio -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=Write_PPS_Testing

测试硬盘的随机写时延

fio -direct=1 -iodepth=1 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -group_reporting -filename=/dev/your_device -name=Rand_Write_Latency_Testing

FIO参数说明

测试命令中有关FIO各参数含义的说明如下表所示。

参数 说明
direct 表示是否使用direct I/O。默认值:1。* 值为1:表示使用direct I/O,忽略I/O缓存,数据直写。* 值为0:表示不使用direct I/O。
iodepth 表示测试时的IO队列深度。例如-iodepth=128表示FIO控制请求中的I/O最大个数为128。
rw 表示测试时的读写策略。您可以设置为:randwrite:随机写。 randread:随机读。* read:顺序读。* write:顺序写。* randrw:混合随机读写。
ioengine 表示测试时FIO选择哪种I/O引擎,通常选择libaio,更符合日常应用模式,更多的选择请查阅FIO官方文档。
bs 表示I/O单元的块大小(block size)。默认值:4 KiB。读取和写入的值可以以read、write格式单独指定,其中任何一个都可以为空以将该值保留为其默认值。
size 表示测试文件大小。FIO会将指定的文件大小全部读/写完成,然后才停止测试,除非受到其他选项(例如运行时)的限制。如果未指定该参数,FIO将使用给定文件或设备的完整大小。也可以将大小作为1到100之间的百分比给出。例如指定size=20%,FIO将使用给定文件或设备完整大小的20%空间。
numjobs 表示测试的并发线程数。默认值:1。
runtime 表示测试时间,即FIO运行时长。如果未指定该参数,则FIO会持续将上述size指定大小的文件,以每次bs值为块大小读/写完。
group_reporting 表示测试结果显示模式。如果指定该参数,测试结果会汇总每个进程的统计信息,而不是以不同任务来统计信息。
filename 表示待测试的对象路径,路径可以是云盘设备名称或者一个文件地址。本文中的FIO测试全部是以整盘为测试对象,不含文件系统,即裸盘测试。同时为了避免误测试到其他盘导致数据被破坏,本示例地址为**/dev/your_device**,请您正确替换。
name 表示测试任务名称,可以随意设定。例如本示例的Rand_Write_Testing

有关各参数的更多说明,请参见FIO MAN手册

Sponsor

Like this article? $1 reward

Comments

优惠券领取 ·v1 安徽马鞍山 Reply

写的很详细具体,学习到了,多谢博主的分享!⌇●﹏●⌇

According to the relevant laws and regulations of the People's Republic of China, the comment function of the current website has been disabled. If you need to comment, please visit ysicing.me, but the comments still need to be reviewed by AI.