Todos los productos
Search
Centro de documentos

Elastic Compute Service:Test ESSD IOPS performance

Última actualización: Sep 02, 2026

Este tema explica cómo configurar las condiciones de prueba y utilizar FIO para evaluar el rendimiento IOPS de un disco ESSD como disco sin formato.

Requisitos previos

  • Herramienta de prueba: FIO.

    Nota

    Fio (Flexible I/O Tester) es una potente herramienta de prueba de E/S de código abierto que se utiliza para evaluar dispositivos de almacenamiento con diversas cargas de trabajo, como lecturas y escrituras aleatorias o secuenciales.

  • Tipo de instancia: se recomienda una instancia ECS ecs.g7se.32xlarge. Para obtener más información, consulte General-purpose instance families (g-series).

  • Imagen: una versión reciente de una imagen pública de Linux. Este tema utiliza Alibaba Cloud Linux 3.

    Nota

    Las pruebas indican que algunas distribuciones de Linux podrían no ofrecer el rendimiento esperado. Se recomienda utilizar la imagen oficial de Alibaba Cloud Linux 3 de Alibaba Cloud para obtener los mejores resultados.

  • Disco ESSD:

    • Probar un disco sin formato proporciona métricas de rendimiento más precisas para un disco en la nube. Se recomienda ejecutar FIO directamente sobre un disco sin formato para evaluar su rendimiento.

    • Se recomienda un disco ESSD PL3. Para obtener más información sobre los discos ESSD, consulte ESSDs.

    Importante
    • Probar un disco sin formato ofrece los resultados más precisos de rendimiento de block storage. Sin embargo, ejecutar Fio directamente en un dispositivo de block storage que contenga particiones, un sistema de archivos u otros datos provocará errores en el sistema de archivos y pérdida de datos. Antes de empezar, cree una instantánea para realizar una copia de seguridad de sus datos. Para obtener más información, consulte Create a snapshot manually.

    • Se recomienda encarecidamente no probar el disco del sistema ni un disco de datos que contenga información para evitar la pérdida de datos. Para las pruebas, se sugiere utilizar un disco de datos nuevo, sin inicializar y vacío.

    • Los resultados de las pruebas de rendimiento se obtienen en un entorno de prueba y son solo orientativos. En un entorno de producción, el rendimiento de un disco en la nube puede variar debido a factores como las condiciones de la red y el acceso concurrente. El rendimiento real será variable.

    • Una vez finalizada la prueba, gestione el nuevo disco en la nube de la siguiente manera:

Procedimiento

  1. Conéctese a una instancia ECS.

    Para obtener más información, consulte Log on to a Linux instance using Workbench.

  2. Ejecute el siguiente comando para listar los dispositivos de block storage disponibles.

    sudo fdisk -lu

    El siguiente resultado es un ejemplo donde /dev/vda es un disco del sistema, y /dev/vdb y /dev/vdc son discos de datos.

    [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

    El resultado anterior muestra que la instancia tiene un disco del sistema /dev/vda y dos discos de datos /dev/vdb y /dev/vdc.

  3. Ejecute el siguiente comando para comprobar si el dispositivo de block storage tiene particiones o un sistema de archivos.

    sudo blkid
    [ecs-a]$ sudo blkid
    /dev/vdb1: UUID="9c32c24f-d2b8-4aa8-8xxx" 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-8xxx" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="e0d4fa20-912d-4e86-943e-6b0866xxx"
    /dev/vda1: PARTUUID="d083a7cd-a7ea-4898-89d5-8e1510bed584"

    Como se muestra arriba, los dispositivos de block storage /dev/vda y /dev/vdb tienen particiones y sistemas de archivos. No se devuelve información para /dev/vdc, lo cual indica que no tiene particiones ni sistemas de archivos.

  4. Antes de probar el rendimiento del block storage, asegúrese de haber realizado una copia de seguridad de los datos del objeto de prueba para prevenir su pérdida. Para obtener más información, consulte Create a manual snapshot.

    Nota

    El uso de instantáneas genera cargos. Para obtener más información, consulte Snapshot pricing.

  5. Ejecute el siguiente comando para instalar la biblioteca libaio y la herramienta FIO. Seleccione un comando según el sistema operativo.

    Alibaba Cloud Linux 2/3 y CentOS 6 o posterior

    Nota

    CentOS 6 alcanzó el fin de vida útil (EOL). De acuerdo con las reglas de la comunidad de Linux, todo el contenido se eliminó de la siguiente dirección del repositorio de CentOS 6: http://mirror.centos.org/centos-6/. Si continúa utilizando el repositorio predeterminado de CentOS 6 en Alibaba Cloud, se reportará un error. Para usar paquetes de instalación específicos de CentOS 6, cambie la dirección del repositorio de CentOS 6. Para obtener más información, consulte How do I change CentOS 6 repository addresses?

    sudo yum install libaio libaio-devel fio -y

    Debian 9 o posterior y Ubuntu 14 o posterior

    Importante

    Dado que Debian 9 y 10 han alcanzado su fin de vida útil (EOL), primero debe cambiar la dirección del repositorio en cualquier instancia ECS que ejecute estas versiones. Para obtener más información, consulte Change the repository addresses for CentOS/Debian EOL.

    sudo apt-get update
    sudo apt-get install libaio* fio -y
  6. Vaya al directorio /tmp.

    cd /tmp
  7. Cree el script test100w.sh.

    sudo vim test100w.sh
  8. Pegue el siguiente contenido en el archivo test100w.sh. Para obtener más información, consulte Test100w.sh script.

    #!/bin/bash
    DEV_NODE=your_device
    DEV_NAME=/dev/$DEV_NODE
    function CheckHasFS
    {
        local device=$1  # The path of the device.
        # Check whether the device exists.
        if [ ! -b "$device" ]; then
            echo "Error: Device $device does not exist"
            exit 1
        fi
        # Use the `blkid` command to check the partition table and file system type.
        local pt_type=$(sudo blkid -o value -s PTTYPE "$device")
        local fs_type=$(sudo blkid -o value -s TYPE "$device")
        if [ -n "$pt_type" ] || [ -n "$fs_type" ]; then
            return 1
        else
            return 0
        fi
    }
    CheckHasFS "$DEV_NAME"
    if [ $? -eq 1 ]; then
        echo "$DEV_NAME contains a partition table or a file system. Stop the fio script!"
        exit 1
    fi
    function RunFio
    {
     numjobs=$1   # The number of test threads in the instance. Example: 10.
     iodepth=$2   # The maximum number of I/O requests that can be submitted at the same time. Example: 64.
     bs=$3        # The size of a single I/O block. Example: 4k.
     rw=$4        # The read/write policy for the test. Example: randwrite.
     size=$5
     filename=$6  # The name of the test file. Example: /dev/your_device.
     nr_cpus=`cat /proc/cpuinfo |grep "processor" |wc -l`
     if [ $nr_cpus -lt $numjobs ];then
         echo "Numjobs is more than cpu cores, exit!"
         exit -1
     fi
     let nu=$numjobs+1
     cpulist=""
     for ((i=1;i<10;i++))
     do
         list=`cat /sys/block/$DEV_NODE/mq/*/cpu_list | awk '{if(i<=NF) print $i;}' i="$i" | tr -d ',' | tr '\n' ','`
         if [ -z $list ];then
             break
         fi
         cpulist=${cpulist}${list}
     done
     spincpu=`echo $cpulist | cut -d ',' -f 2-${nu}`
     echo $spincpu
     fio --ioengine=libaio --runtime=30s --numjobs=${numjobs} --iodepth=${iodepth} --bs=${bs} --size=${size} --rw=${rw} --filename=${filename} --time_based=1 --direct=1 --name=test --group_reporting --cpus_allowed=$spincpu --cpus_allowed_policy=split
    }
    echo 2 > /sys/block/$DEV_NODE/queue/rq_affinity
    sleep 5
    RunFio 10 128 4k randwrite 1024g $DEV_NAME
  9. Modifique el script test100w.sh según sea necesario.

    • Reemplace todos los parámetros your_device con el nombre real del dispositivo, por ejemplo, nvme1n1.

    • Establezca los valores de 10 (numjobs), 64 (iodepth), 4k (bs), randwrite (rw) y /dev/your_device en el comando RunFio 10 64 4k randwrite /dev/your_device según su situación real.

    • El valor de numjobs no debe exceder el número de núcleos de CPU. Para averiguar el número de núcleos de CPU, ejecute el siguiente comando:

      cat /proc/cpuinfo |grep "processor" |wc -l
  10. Ejecute el siguiente comando para probar el rendimiento del disco ESSD.

    sudo sh test100w.sh
    • En la salida del comando, la línea que contiene IOPS=*** muestra el valor IOPS del disco ESSD.

      job1: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=128
      ...
        fio-3.7
        Starting 6 processes
        Jobs: 6 (f=6): [w(6)][100.0%][r=0KiB/s,w=3932MiB/s][r=0,w=1007k IOPS][eta 00m:00s]
      job1: (groupid=0, jobs=6): err= 0: pid=42693: Thu Jun 23 15:32:28 2022
        write: IOPS=1005k, BW=3925MiB/s (4116MB/s)(38.4GiB/10015msec)
          slat (nsec): min=728, max=9562.2k, avg=5157.38, stdev=47881.11
          clat (usec): min=82, max=25001, avg=758.61, stdev=843.67
           lat (usec): min=86, max=25042, avg=763.86, stdev=844.85
          clat percentiles (usec):
           |  1.00th=[  190],  5.00th=[  347], 10.00th=[  445], 20.00th=[  537],
           | 30.00th=[  586], 40.00th=[  635], 50.00th=[  652], 60.00th=[  676],
           | 70.00th=[  693], 80.00th=[  717], 90.00th=[  824], 95.00th=[ 1254],
           | 99.00th=[ 4424], 99.50th=[ 6849], 99.90th=[10814], 99.95th=[15008],
           | 99.99th=[19530]
         bw (  KiB/s): min=573448, max=732136, per=16.69%, avg=670799.74, stdev=26159.23, samples=120
         iops        : min=143362, max=183034, avg=167699.93, stdev=6539.81, samples=120
        lat (usec)   : 100=0.01%, 250=2.26%, 500=11.66%, 750=71.40%, 1000=8.11%
        lat (msec)   : 2=3.38%, 4=2.02%, 10=1.04%, 20=0.11%, 50=0.01%
        cpu          : usr=14.45%, sys=24.23%, ctx=401609, majf=0, minf=236
        IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=110.0%
           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=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1%
           issued rwts: total=0,10062326,0,0 short=0,0,0,0 dropped=0,0,0,0
           latency   : target=0, window=0, percentile=100.00%, depth=128
      Run status group 0 (all jobs):
        WRITE: bw=3925MiB/s (4116MB/s), 3925MiB/s-3925MiB/s (4116MB/s-4116MB/s), io=38.4GiB (41.2GB), run=10015-10015msec
      Disk stats (read/write):
        nvme1n1: ios=4Z/11063917, merge=0/0, ticks=5/8026436, in_queue=9632482, util=100.00%
    • Si observa el siguiente resultado, el disco de prueba tiene una partición o un sistema de archivos. El script de FIO se detiene para garantizar la seguridad de los datos. Utilice un disco de datos nuevo y vacío para la prueba.

      [[ecs-user@ecs tmp]$ sudo sh test100w.sh
      /dev/vdb contains a partition table or a file system. Stop the fio script!
      Aviso

      Si el objeto de prueba tiene una partición, un sistema de archivos u otros datos, ejecutar FIO directamente sobre él causará excepciones en el sistema de archivos y pérdida de datos. Si su disco de datos tiene una partición y un sistema de archivos, se recomienda crear un disco de datos nuevo y vacío para realizar las pruebas:

      • Puede crear un disco en la nube pay-as-you-go con las mismas configuraciones y conectarlo a la instancia para realizar pruebas. Para obtener más información, consulte Create a data disk.

      • Una vez finalizada la prueba, puede desconectar y liberar el disco según sea necesario. Para obtener más información, consulte Detach a data disk y Release a cloud disk.

Script test100w.sh

  • El siguiente comando establece el parámetro rq_affinity del dispositivo de bloque en 2.

    echo 2 > /sys/block/your_device/queue/rq_affinity

    Valores de rq_affinity

    Descripción del valor

    1

    Cuando un dispositivo de bloque completa una operación de E/S, el evento de finalización se envía al mismo grupo de vCPU que envió la solicitud. En un escenario concurrente y multihilo, esto crea un cuello de botella y limita el rendimiento.

    2

    Cuando un dispositivo de bloque completa una operación de E/S, el evento de finalización se procesa en la vCPU que envió la solicitud. En un escenario concurrente y multihilo, se aprovecha al máximo el rendimiento de cada vCPU.

  • El siguiente comando vincula diferentes jobs a distintos núcleos de CPU.

    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
    Nota

    En modo normal, un dispositivo tiene solo una cola de solicitudes. En un escenario de E/S concurrente y multihilo, esta única cola puede convertirse en un cuello de botella de rendimiento. El modo de múltiples colas permite que un dispositivo use varias colas de solicitudes para procesar E/S, aprovechando completamente el rendimiento del almacenamiento subyacente. Para utilizar esta función de manera eficaz, debe vincular los hilos de E/S a diferentes núcleos de CPU que correspondan a distintas colas de solicitudes.

    Parámetros

    Nota

    Ejemplo

    numjobs

    El número de hilos de E/S.

    10

    /dev/your_device

    El nombre del dispositivo del disco ESSD.

    /dev/nvme1n1

    cpus_allowed_policy

    FIO proporciona los parámetros cpus_allowed_policy y cpus_allowed para vincular vCPUs.

    split

    El comando anterior ejecuta múltiples jobs y los vincula a diferentes núcleos de CPU que corresponden a distintos valores de Queue_Id. Para consultar el valor cpu_core_id al que está vinculado un valor de Queue_Id, ejecute los siguientes comandos:

    • Ejecute el comando ls /sys/block/your_device/mq/. En el comando, reemplace your_device con el nombre real del dispositivo, por ejemplo, nvme1n1. Este comando consulta los valores de Queue_Id para el dispositivo especificado.

    • Ejecute el comando cat /sys/block/your_device/mq/*/cpu_list. En el comando, reemplace your_device con el nombre real del dispositivo, por ejemplo, nvme1n1. Este comando muestra qué núcleo de CPU está vinculado a cada cola de solicitudes para el dispositivo especificado.