通过测试块存储性能,可以帮助您更好地理解存储设备的能力,并对其进行相应的优化和调整,以确保最佳性能。测试裸盘可以获得较为真实的块存储性能,本文将介绍如何在Linux系统中使用开源测试工具FIO测试裸盘的关键性能指标,包括IOPS(每秒输入/输出操作次数)、吞吐量(数据传输速率)和时延(响应时间)。
FIO(Flexible I/O Tester)是一个开源的、强大的I/O性能测试工具,可以用来对存储设备进行随机读写、顺序读写等负载测试。
操作步骤
测试裸盘可以获得较为真实的块存储性能。但如果块存储设备中含有分区、文件系统以及其他数据,直接使用FIO压测会导致文件系统异常以及数据丢失,请在测试前提前创建快照做好数据备份。具体操作,请参见手动创建单个快照。
本操作以公共镜像Alibaba Cloud Linux 3.2104 LTS 64位操作系统为例,请您根据实际环境进行操作。
远程连接ECS实例。
具体操作,请参见使用Workbench登录Linux实例。
运行以下命令,查询块存储的设备名称。
sudo fdisk -lu命令输出中,/dev/vda 为系统盘,/dev/vdb 和 /dev/vdc 为数据盘,其中 /dev/vdc 尚未分区。
[ecs-a ]$ sudo fdisk -lu Disk /dev/vda: 40 GiB, 42949672960 bytes, 83886080 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: F51132A7-67B1-4650-806D-FD0DE6E1210C Device Start End Sectors Size Type /dev/vda1 2048 6143 4096 2M BIOS boot /dev/vda2 6144 415743 409600 200M EFI System /dev/vda3 415744 83886046 83470303 39.8G Linux filesystem Disk /dev/vdb: 30 GiB, 32212254720 bytes, 62914560 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: C36DF120-8650-4188-8043-AEF9C85F31EF Device Start End Sectors Size Type /dev/vdb1 2048 62912511 62910464 30G Linux filesystem Disk /dev/vdc: 40 GiB, 42949672960 bytes, 83886080 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes如上述命令输出所示,该实例有3块块存储设备,系统盘/dev/vda、数据盘/dev/vdb、/dev/vdc。
运行以下命令,查询块存储设备是否存在分区和文件系统。
sudo blkid[ecs-a ]$ sudo blkid /dev/vdb1: UUID="9c32c24f-d2b8-4aa8-8" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="primary" PARTUUID="4bd66635-f5f4-4dc0-9bdd-664fd5b8d2fb" /dev/vda2: SEC_TYPE="msdos" UUID="7E" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="82a50cd6-9899-41eb-91fe-7027bf257086" /dev/vda3: LABEL="root" UUID="beef9d8d-ba84-46d9-8" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="e0d4fa20-912d-4e86-943e-6b0368xxxxxx" /dev/vda1: PARTUUID="d083a7cd-a7ea-4898-89d5-8e1510bed584"如上所示,块存储设备/dev/vda与/dev/vdb上存在分区及文件系统,而结果中未存在/dev/vdc相关的回执信息,表明/dev/vdc没有分区及文件系统。
在测试块存储性能前,请确保已经对测试对象进行数据备份,避免数据丢失。具体操作,请参见手动创建单个快照。
说明使用快照会产生计费,更多信息,请参见快照计费。
运行以下命令,安装libaio库和测试工具FIO。 示例如下,请根据不同的系统选择指令。
Alibaba Cloud Linux 2/3版本、CentOS 6及以上版本
说明CentOS 6操作系统版本结束了生命周期(EOL),按照社区规则,CentOS 6的源地址http://mirror.centos.org/centos-6/内容已移除,您在阿里云上继续使用默认配置的CentOS 6的源会发生报错。如果您需要使用CentOS 6系统中的一些安装包,则需要手动切换源地址。具体操作,请参见CentOS 6 EOL如何切换源?。
sudo yum install libaio libaio-devel fio -yDebian 9及以上版本、Ubuntu14及以上版本
重要由于Debian9和Debian10结束生命周期(EOL),所以如果您使用的是Debian9和Debian10系统的ECS实例,请先切换源地址。具体操作,请参见为CentOS/Debian EOL后切换源地址(合入到对应操作系统)。
sudo apt-get update sudo apt-get install libaio* fio -y-
切换路径。
cd /tmp 运行性能测试命令,具体的命令请参见下文。
查看测试结果,不同云盘数值不同,以下代码块中给出的数值仅作为示例
IOPS相关测试结果请参考
IOPS=***内容。以下为fio 随机写(Rand_Write)测试结果示例,其中 write 行的 IOPS=2301 为随机写性能关键指标:Starting 1 process Jobs: 1 (f=0): [f(1)][100.0%][w=9061KiB/s][w=2265 IOPS][eta 00m:00s] Rand_Write Testing: (groupid=0, jobs=1): err= 0: pid=15900: Tue Nov 19 11:28:24 2024 write: IOPS=2301, BW=9206KiB/s (9427kB/s)(1024MiB/113896msec); 0 zone resets slat (usec): min=2, max=1718, avg= 5.43, stdev= 7.98 clat (usec): min=382, max=119809, avg=55606.05, stdev=7040.12 lat (usec): min=394, max=119812, avg=55611.49, stdev=7039.41 clat percentiles (msec): | 1.00th=[ 9], 5.00th=[ 51], 10.00th=[ 51], 20.00th=[ 51], | 30.00th=[ 51], 40.00th=[ 57], 50.00th=[ 60], 60.00th=[ 61], | 70.00th=[ 61], 80.00th=[ 61], 90.00th=[ 61], 95.00th=[ 61], | 99.00th=[ 63], 99.50th=[ 65], 99.90th=[ 67], 99.95th=[ 77], | 99.99th=[ 101] bw ( KiB/s): min= 9000, max=28976, per=100.00%, avg=9213.14, stdev=1317.97, samples=227 iops : min= 2250, max= 7244, avg=2303.28, stdev=329.49, samples=227 lat (usec) : 500=0.01%, 750=0.01%, 1000=0.01% lat (msec) : 2=0.03%, 4=0.45%, 10=0.52%, 20=0.04%, 50=0.82% lat (msec) : 100=98.11%, 250=0.01%吞吐量相关测试结果请参考
BW=***内容,如下所示:Jobs: 1 (f=1): [W(1)][100.0%][w=85.0MiB/s][w=85 IOPS][eta 00m:00s] Write_PPS_Testing: (groupid=0, jobs=1): err= 0: pid=17934: Tue Nov 19 11:32:19 2024 write: IOPS=124, BW=124MiB/s (130MB/s)(1024MiB/8229msec); 0 zone resets slat (usec): min=27, max=4026, avg=94.51, stdev=125.97 clat (msec): min=4, max=1154, avg=513.48, stdev=208.14 lat (msec): min=4, max=1154, avg=513.57, stdev=208.15 clat percentiles (msec): | 1.00th=[ 17], 5.00th=[ 75], 10.00th=[ 93], 20.00th=[ 567], | 30.00th=[ 584], 40.00th=[ 584], 50.00th=[ 584], 60.00th=[ 584], | 70.00th=[ 584], 80.00th=[ 584], 90.00th=[ 592], 95.00th=[ 693], | 99.00th=[ 1062], 99.50th=[ 1099], 99.90th=[ 1133], 99.95th=[ 1150], | 99.99th=[ 1150] bw ( KiB/s): min=30720, max=356352, per=96.43%, avg=122881.25, stdev=65548.59, samples=16 iops : min= 30, max= 348, avg=120.00, stdev=64.01, samples=16 lat (msec) : 10=0.49%, 20=0.68%, 50=2.15%, 100=10.74%, 250=1.86% lat (msec) : 500=3.22%, 750=76.46%, 1000=2.73%, 2000=1.66% cpu : usr=0.89%, sys=0.45%, ctx=1025, majf=0, minf=10 IO depths : 1=0.1%, 2=0.2%, 4=0.4%, 8=0.8%, 16=1.6%, 32=3.1%, >=64=93.8% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=99.9%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0% issued rwts: total=0 1024 0 0 short=0 0 0 0 dropped=0 0 0 0时延相关测试结果请参考lat(usec)内容。延迟相关测试结果请参考总延迟统计行
lat (usec): min=254, max=169188, avg=432.25, stdev=487.95,平均延迟约 432 微秒。Jobs: 1 (f=1): [w(1)][100.0%][w=9169KiB/s][w=2292 IOPS][eta 00m:00s] Rand_Write_Latency_Testing: (groupid=0, jobs=1): err= 0: pid=19530: Tue Nov 19 11:38:31 2024 write: IOPS=2301, BW=9206KiB/s (9427kB/s)(1024MiB/113903msec); 0 zone resets slat (usec): min=2, max=19160, avg= 8.68, stdev=40.53 clat (usec): min=3, max=169175, avg=423.57, stdev=486.23 lat (usec): min=254, max=169188, avg=432.25, stdev=487.95 clat percentiles (usec): | 1.00th=[ 334], 5.00th=[ 343], 10.00th=[ 347], 20.00th=[ 351], | 30.00th=[ 355], 40.00th=[ 359], 50.00th=[ 367], 60.00th=[ 371], | 70.00th=[ 379], 80.00th=[ 396], 90.00th=[ 465], 95.00th=[ 562], | 99.00th=[ 1614], 99.50th=[ 2671], 99.90th=[ 5735], 99.95th=[ 6194], | 99.99th=[ 7439] bw ( KiB/s): min= 5840, max=10416, per=100.00%, avg=9211.26, stdev=495.72, samples=227 iops : min= 1460, max= 2604, avg=2302.80, stdev=123.94, samples=227 lat (usec) : 4=0.01%, 10=0.01%, 50=0.01%, 100=0.01%, 250=0.01% lat (usec) : 500=93.01%, 750=4.06%, 1000=0.97% lat (msec) : 2=1.23%, 4=0.42%, 10=0.30%, 20=0.01%, 50=0.01% lat (msec) : 250=0.01% cpu : usr=0.84%, sys=3.00%, ctx=262469, majf=0, minf=10
云盘性能测试命令
示例命令中的参数取值仅供参考,/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性能。
本地盘性能测试命令
以下测试命令适用于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
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手册。