压测ESSD云盘性能时,云盘本身以及压测条件都起着重要的作用。您可以按照本示例配置ESSD云盘性能的压测条件,充分发挥出多核多并发的系统性能,压测出100万IOPS的性能指标。
压测条件
- 示例操作:随机写(randwrite)。
- 镜像:使用公共镜像中高版本的Linux镜像。例如,CentOS 7.4/7.3/7.2 64位或者Alibaba Cloud Linux 2.1903 64位操作系统。
- 工具:使用FIO。
- 实例规格:推荐使用ecs.g7se.32xlarge。更多信息,请参见存储增强通用型实例规格族g7se。
- ESSD云盘:推荐使用ESSD PL3云盘。本示例中,使用的设备名为/dev/your_device,请您根据实际情况替换。更多信息,请参见ESSD云盘。
操作须知
警告
- 测试裸盘可以获得真实的块存储盘性能,但会破坏文件系统结构,请在测试前提前创建快照做好数据备份。具体操作,请参见创建一个云盘快照。
- 强烈建议您不要将操作系统所在的云盘或者含有重要数据的云盘作为测试对象。建议您只在新购买的无数据的ECS实例上使用工具测试块存储性能,避免造成数据丢失。
操作步骤
test100w.sh脚本解读
- 以下命令将块设备的系统参数
rq_affinity
取值修改为2。echo 2 > /sys/block/your_device/queue/rq_affinity
rq_affinity取值 取值说明 1 表示块设备收到I/O完成(I/O Completion)的事件时,这个I/O被发送回处理这个I/O下发流程的vCPU所在Group上处理。在多线程并发的情况下,I/O Completion就可能集中在某一个vCPU上执行,造成瓶颈,导致性能无法提升。 2 表示块设备收到I/O Completion的事件时,这个I/O会在当初下发的vCPU上执行。在多线程并发的情况下,就可以完全充分发挥各个vCPU的性能。 - 以下命令分别将几个
jobs
绑定不同的CPU Core上。fio -ioengine=libaio -runtime=30s -numjobs=${numjobs} -iodepth=${iodepth} -bs=${bs} -rw=${rw} -filename=${filename} -time_based=1 -direct=1 -name=test -group_reporting -cpus_allowed=$spincpu -cpus_allowed_policy=split
说明 普通模式下,一个设备(Device)只有一个请求队列(Request-Queue),在多线程并发处理I/O的情况下,这个唯一的Request-Queue就是一个性能瓶颈点。多队列(Multi-Queue)模式下,一个设备(Device)可以拥有多个处理I/O的Request-Queue,充分发挥后端存储的性能。假设您有4个I/O线程,您需要将4个I/O线程分别绑定在不同的Request-Queue对应的CPU Core上,这样就可以充分利用Multi-Queue提升性能。参数 说明 取值示例 numjobs
I/O线程。 10 /dev/your_device
ESSD云盘设备名。 /dev/nvme1n1 cpus_allowed_policy
FIO提供了参数 cpus_allowed_policy
以及cpus_allowed
来绑定vCPU。split 以上命令一共运行了几个jobs
,分别绑定在几个CPU Core上,分别对应着不同的Queue_Id。关于如何查看Queue_Id绑定的cpu_core_id,您可以运行如下命令:- 运行
ls /sys/block/your_device/mq/
。其中,your_device
是您的设备名,例如nvme1n1。运行该命令查看设备名为vd*云盘的Queue_Id。 - 运行
cat /sys/block/your_device/mq//cpu_list
。其中,your_device
是您的设备名,例如nvme1n1。运行该命令查看对应设备名为vd*云盘的Queue*绑定到的cpu_core_id。
- 运行