测试ESSD PL-X云盘性能

阿里云ESSD PL-X云盘是一款具备超高IOPS、超高吞吐量和超低时延等多维度高性能的云盘。您可以按照本示例配置ESSD PL-X云盘性能的压测条件,测试ESSD PL-X云盘的访问时延和IOPS。

压测条件

  • 测试工具:使用FIO。

    说明

    FIO(Flexible I/O Tester)是一个开源的、强大的I/O性能测试工具,可以用来对存储设备进行随机读写、顺序读写等负载测试。

  • 实例规格:推荐使用ecs.g8ise.12xlarge。更多信息,请参见存储增强通用型实例规格族g8ise

  • 镜像:使用公共镜像中高版本的Linux镜像,本文使用Alibaba Cloud Linux 3。

    说明

    经测试发现部分Linux发行版镜像可能无法达到预期的性能,强烈推荐您使用阿里云官方维护的Alibaba Cloud Linux 3镜像。

  • ESSD PL-X云盘:

    • 测试裸盘可以获得较为真实的云盘性能,建议您直接通过FIO压测裸盘进行云盘性能测试。

    • 为确保云盘性能测试的准确性,请预先准备好足够的IOPS。有关ESSD PL-X云盘规格信息,请参见ESSD PL-X云盘

      • 压测时延时,建议至少准备40,000 IOPS。

      • 压测IOPS时,建议准备3,000 GiB以上的云盘和3,000,000 IOPS。

    重要
    • 虽然测试裸盘可以获得较为真实的块存储盘性能,但会破坏文件系统结构,请在测试前提前创建快照做好数据备份。具体操作,请参见创建快照

    • 强烈建议不要将操作系统所在的系统盘或含有重要数据的云盘作为测试对象,以避免数据丢失。建议在新创建的、无重要数据的数据盘或临时盘上使用工具测试块存储性能。

    • 如果需要对系统盘进行裸盘压测,压测完成后建议重置系统后再部署业务使用,避免压测活动引入的潜在问题,从而确保系统的长期稳定运行。

    • 性能测试结果均在测试环境下获得,仅供参考。在真实生产环境中,受网络环境、并发访问量等因素影响,云盘的性能表现可能存在差异,请您以实际情况为准。

测试ESSD PL-X云盘时延

  1. 远程连接ECS实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 运行以下命令,安装libaio库和测试工具FIO。

    sudo yum install libaio libaio-devel fio -y
  3. 调整内核启动参数。

    重要

    调整内核启动参数是在grub配置文件中添加idle=poll参数,目的是改变Linux系统的CPU空闲循环处理方式,从而提升I/O响应速度,对I/O延时敏感的应用至关重要。调整内核启动参数过程中的误操作可能会让操作系统无法正常使用,具有一定风险,请您在测试前提前创建快照做好数据备份。

    1. 运行以下命令,打开/etc/default/grub

      sudo vim /etc/default/grub
    2. 运行以下命令,找到GRUB_CMDLINE_LINUX="XXX"所在行,在最末尾添加idle=poll内容。

      如果内核配置中已有其他的idle=xxx参数项,请删除。image

    3. 运行以下命令,更新grub配置。

      sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    4. 运行以下命令,重启实例使配置生效。

      sudo reboot
  4. 运行以下命令,切换路径。

    cd /tmp
  5. 运行以下命令,新建test_plx_lat.sh脚本。

    sudo vim test_plx_lat.sh
  6. test_plx_lat.sh脚本中添加以下内容。

    DEV_NODE=$1
    
    echo 2 > /sys/block/$DEV_NODE/queue/rq_affinity
    
    DEVICE=`ls -al /sys/block/$DEV_NODE/device | awk '{print $11}' | sed 's%../%%g'`
    INTERRUPT=`cat /proc/interrupts | grep $DEVICE | shuf -n 1 | awk '{print $1}' | sed 's/://g'`
    EFFECTIVE_SMP=`cat /proc/irq/$INTERRUPT/effective_affinity_list`
    fio --ioengine=libaio --runtime=30s --numjobs=1 --iodepth=1 --bs=4k --rw=randwrite --filename=/dev/$DEV_NODE --time_based=1 --direct=1 --name=test --group_reporting=1 --cpus_allowed_policy=split --cpus_allowed=$EFFECTIVE_SMP

    关于脚本内容的详细说明,请参见如下test_plx_lat.sh脚本说明

    单击展开test_plx_lat.sh脚本说明

    以下为ESSD PL-X云盘的时延性能测试脚本test_plx_lat.sh的详细说明,请您根据实际情况进行配置。

    • 以下命令将块设备的系统参数rq_affinity取值修改为2

      echo 2 > /sys/block/$DEV_NODE/queue/rq_affinity

      命令中的rq_affinity参数取值说明如下表所示。

      rq_affinity取值

      取值说明

      0

      表示块设备收到I/O 完成(I/O Completion)的事件时,不限制I/O 被发送回的vCPU。在测试时延的情况下,可能有较大的内核切换与调度开销,对单路时延产生影响。

      1

      表示块设备收到I/O完成的事件时,这个I/O被发送回处理这个I/O下发流程的vCPU所在Group上处理。在测试时延的情况下,可能有一定的内核切换与调度开销,对单路时延有影响。

      2

      表示块设备收到I/O完成的事件时,这个I/O会在当初下发的vCPU上执行。在测试时延的情况下,能最小化内核切换与调度开销,就可最大限度提升单路时延。

    • 以下命令获取块设备的device name

      DEVICE=`ls -al /sys/block/$DEV_NODE/device | awk '{print $11}' | sed 's%../%%g'`
    • 以下命令获取块设备I/O队列的一个中断号。

      INTERRUPT=`cat /proc/interrupts | grep $DEVICE | shuf -n 1 | awk '{print $1}' | sed 's/://g'`
    • 以下命令获取响应中断的vCPU的线程号。

      EFFECTIVE_SMP=`cat /proc/irq/$INTERRUPT/effective_affinity_list`
    • 以下命令启动FIO测试随机写单路时延,并将限制在已获取的vCPU线程上下发I/O请求。

      fio --ioengine=libaio --runtime=30s --numjobs=1 --iodepth=1 --bs=4k --rw=randwrite --filename=/dev/$DEV_NODE --time_based=1 --direct=1 --name=test --group_reporting=1 --cpus_allowed_policy=split --cpus_allowed=$EFFECTIVE_SMP

      命令中的各参数说明如下表所示。

      参数

      说明

      取值示例

      numjobs

      I/O线程数。由于这里的测试目的为单路时延,故采用1个I/O线程。

      1

      iodepth

      I/O队列深度。由于这里的测试目的为单路时延,故队列深度为1。

      1

      filename

      被压测的文件。对ESSD PL-X云盘进行裸盘测试时,应配置为云盘的实际设备名。

      /dev/vdc

      cpus_allowed

      指定压测使用的vCPU线程号,与cpus_allowed_policy=split一起使用。测试单路时延时,建议配置为处理中断的vCPU线程号。

      4

  7. 测试ESSD PL-X云盘的时延性能。

    sudo sh test_plx_lat.sh your_device

    请您根据实际情况,将your_device修改为ESSD PL-X云盘实际的设备名,例如vdc。

    您可以在返回结果中查看lat (usec): min=xx, max=xxxx, avg=xx.xx, stdev=x.xx内容,表示ESSD PL-X云盘的时延。测试时延

压测ESSD PL-X云盘IOPS

  1. 远程连接ECS实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 运行以下命令,安装libaio库和测试工具FIO。

    sudo yum install libaio libaio-devel fio -y
  3. 运行以下命令,切换路径。

    cd /tmp
  4. 运行以下命令,新建test_plx_iops.sh脚本。

    sudo vim test_plx_iops.sh
  5. test_plx_iops.sh脚本中添加以下内容。

    DEV_NODE=$1
    
    echo 0 > /sys/block/$DEV_NODE/queue/rq_affinity
    
    fio --ioengine=libaio --runtime=30s --numjobs=64 --iodepth=64 --bs=4k --rw=randwrite --filename=/dev/$DEV_NODE --time_based=1 --direct=1 --name=test --group_reporting=1

    关于脚本内容的详细说明,请参见如下test_plx_iops.sh脚本说明

    单击展开test_plx_iops.sh脚本说明

    以下为ESSD PL-X云盘的IOPS性能测试脚本test_plx_iops.sh的详细说明,请您根据实际情况进行配置。

    • 可选:以下命令将块设备的系统参数rq_affinity取值修改为0

      echo 0 > /sys/block/$DEV_NODE/queue/rq_affinity

      命令中的rq_affinity参数说明如下表所示。

      rq_affinity取值

      取值说明

      0

      表示块设备收到I/O完成的事件时,不限制I/O被发送回的vCPU。该行为能最大程度提升Guest CPU收发I/O的并行度。由于云盘控制器能力的提升,Guest内的并行度需要同时提升,以避免造成性能瓶颈。

      1

      表示块设备收到I/O完成的事件时,这个I/O被发送回处理这个I/O下发流程的vCPU所在Group上处理。该行为对Guest处理I/O的并行度有一定影响。

      2

      表示块设备收到I/O Completion的事件时,这个I/O会在当初下发的vCPU上执行。该行为对 Guest处理I/O的并行度影响最大。

    • 以下命令启动FIO测试随机写IOPS。

      fio --ioengine=libaio --runtime=30s --numjobs=64 --iodepth=64 --bs=4k --rw=randwrite --filename=/dev/$DEV_NODE --time_based=1 --direct=1 --name=test --group_reporting=1

      命令中的各参数说明如下表所示。

      参数

      说明

      取值示例

      numjobs

      I/O线程数。由于这里的目的为测试 IOPS,需要尽量提升Guest内的并发度,故选择 64。

      64

      iodepth

      I/O队列深度。由于这里的测试目的为测试IOPS,需要提升单队列压力,故队列深度为 64。

      64

      filename

      被压测的文件。对ESSD PL-X云盘进行裸盘测试时,应配置为云盘的实际设备名。

      /dev/vdc

  6. 运行以下命令,测试ESSD PL-X云盘的IOPS性能。

    sudo sh test_plx_iops.sh your_device

    请您根据实际情况,将your_device修改为ESSD PL-X云盘实际的设备名,例如vdc。

    您可以在返回结果中查看IOPS=***内容,表示ESSD PL-X云盘的IOPS。测试IOPS

    说明

    您可以根据测试出来的IOPS大小计算该云盘的吞吐量。计算公式请参见ESSD PL-X云盘