通过测试块存储性能,可以帮助您更好地理解存储设备的能力,并对其进行相应的优化和调整,以确保最佳性能。本文介绍如何在Linux系统中使用开源测试工具FIO测试块存储的关键性能指标,包括IOPS(每秒输入/输出操作次数)、吞吐量(数据传输速率)和时延(响应时间)。
FIO(Flexible I/O Tester)是一个开源的、强大的I/O性能测试工具,可以用来对存储设备进行随机读写、顺序读写等负载测试。
操作步骤
虽然测试裸盘可以获得较为真实的块存储盘性能,但会破坏文件系统结构,请在测试前提前创建快照做好数据备份。具体操作,请参见创建快照。
强烈建议不要将操作系统所在的系统盘或含有重要数据的云盘作为测试对象,以避免数据丢失。建议在新创建的、无重要数据的数据盘或临时盘上使用工具测试块存储性能。
如果需要对系统盘进行裸盘压测,压测完成后建议重置系统后再部署业务使用,避免压测活动引入的潜在问题,从而确保系统的长期稳定运行。
性能测试结果均在测试环境下获得,仅供参考。在真实生产环境中,受网络环境、并发访问量等因素影响,云盘的性能表现可能存在差异,请您以实际情况为准。
本操作以公共镜像Alibaba Cloud Linux 3.2104 LTS 64位操作系统为例,请您根据实际环境进行操作。
远程连接ECS实例。
登录ECS管理控制台。具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。
运行以下命令,查询需要测试的块存储的设备名称。
sudo lsblk
如上图所示,表示该实例有2块块存储设备,系统盘
/dev/vda
、数据盘/dev/vdb
。查询块存储设备是否已经4 KiB对齐。
sudo fdisk -lu
返回的结果中,Start值能被8整除即是4 KiB对齐。否则,请依照初始化云盘FAQ完成4 KiB对齐后再继续性能测试。
重要当分区非对齐时,会严重影响块存储的性能,强烈建议用户保证分区对齐。
Device Boot Start End Sectors Size Id Type /dev/vda1 * 2048 83886046 83883999 40G 83 Linux
运行以下命令,安装libaio库和测试工具FIO。 示例如下,请根据不同的系统选择指令。
Alibaba Cloud Linux 2/3版本、CentOS 6及以上版本
重要由于CentOS 6和CentOS 8结束生命周期(EOL),所以如果您使用的是CentOS 6或者CentOS 8系统的ECS实例,请先切换源地址。具体操作,请参见CentOS 6 EOL如何切换源?和CentOS 8 EOL如何切换源?。
sudo yum install libaio libaio-devel fio -y
Debian 9及以上版本、Ubuntu14及以上版本
重要由于Debain9和Debain10结束生命周期(EOL),所以如果您使用的是Debain9和Debain10系统的ECS实例,请先切换源地址。具体操作,请参见Debian 9/10 EOL如何切换源?。
sudo apt-get update sudo apt-get install libaio* fio -y
运行以下命令,切换路径。
cd /tmp
运行性能测试命令,具体的命令请参见下文。
查看测试结果,不同云盘数值不同,以下图片中给出的数值仅作为示例
IOPS相关测试结果请参考
IOPS=***
内容,如下图:吞吐量相关测试结果请参考
BW=***
内容,如下图:时延相关测试结果请参考lat(usec)内容,如下图:
云盘性能测试命令
示例命令中的参数取值仅供参考,/dev/your_device
请您根据实际情况,替换为操作步骤2中获取的待测试块存储名称。例如,如果需要测试的云盘设备名为/dev/vdb,则需将以下示例命令中的/dev/your_device
替换为/dev/vdb
。FIO参数的更多信息,请参见FIO参数说明。
测试云盘的随机写IOPS:
sudo 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
测试云盘的随机读IOPS:
sudo 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
测试云盘的顺序写吞吐量:
sudo 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
测试云盘的顺序读吞吐量:
sudo fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=Read_PPS_Testing
测试云盘的随机写时延:
sudo 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
测试云盘的随机读时延:
sudo fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -group_reporting -filename=/dev/your_device -name=Rand_Read_Latency_Testing
关于各云盘详细的测试步骤,请参见测试ESSD云盘IOPS性能和测试ESSD PL-X云盘性能。
本地盘性能测试命令
以下测试命令适用于NVMe SSD本地盘和SATA HDD本地盘。
本地盘只能用作数据盘,示例命令中的参数取值仅供参考,/dev/your_device
请您根据实际情况,替换为操作步骤2中获取的待测试块存储名称。例如,如果需要测试的本地盘设备名为/dev/vdb,则需将以下示例命令中的/dev/your_device
替换为/dev/vdb
。FIO参数的更多信息,请参见FIO参数说明。
测试本地盘的随机写IOPS:
sudo fio -direct=1 -iodepth=32 -rw=randwrite -ioengine=libaio -bs=4k -numjobs=4 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
测试本地盘的随机读IOPS:
sudo fio -direct=1 -iodepth=32 -rw=randread -ioengine=libaio -bs=4k -numjobs=4 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
测试本地盘的顺序写吞吐量:
sudo fio -direct=1 -iodepth=128 -rw=write -ioengine=libaio -bs=128k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
测试本地盘的顺序读吞吐量:
sudo fio -direct=1 -iodepth=128 -rw=read -ioengine=libaio -bs=128k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
测试本地盘的随机写时延:
sudo fio -direct=1 -iodepth=1 -rw=randwrite -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
测试本地盘的随机读时延:
sudo fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
测试本地盘的顺序写时延:
sudo fio -direct=1 -iodepth=1 -rw=write -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
测试本地盘的顺序读时延:
sudo fio -direct=1 -iodepth=1 -rw=read -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
关于i4p实例本地盘性能的测试步骤,请参见测试i4p实例本地盘性能。
FIO参数说明
测试命令中有关FIO各参数含义的说明如下表所示。
参数 | 说明 |
direct | 表示是否使用direct I/O。默认值:1。
|
iodepth | 表示测试时的IO队列深度。例如 |
rw | 表示测试时的读写策略。您可以设置为:
|
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手册。