Todos os produtos
Search
Central de documentação

Elastic Compute Service:Test ESSD IOPS performance

Última atualização: Aug 24, 2026

Este tópico explica como configure as condições de teste e usar o FIO para medir o IOPS de um ESSD como disco bruto.

Pré-requisitos

  • Ferramenta de teste: FIO.

    Nota

    O Fio (Flexible I/O Tester) é uma ferramenta de teste de I/O poderosa e de código aberto para avaliar dispositivos de armazenamento com diversas cargas de trabalho, como leituras e gravações aleatórias ou sequenciais.

  • Tipo de instância: recomenda-se uma instância ECS ecs.g7se.32xlarge. Para mais informações, consulte General-purpose instance families (g-series).

  • Imagem: uma versão recente de uma imagem pública Linux. Este tópico utiliza o Alibaba Cloud Linux 3.

    Nota

    Testes indicam que algumas distribuições Linux podem não oferecer o desempenho esperado. Para obter os melhores resultados, utilize a imagem oficial do Alibaba Cloud Linux 3 da Alibaba Cloud.

  • ESSD:

    • Testar um disco bruto fornece métricas de desempenho mais precisas para um disco cloud. Recomenda-se execute o FIO diretamente em um disco bruto para avaliar seu desempenho.

    • Recomenda-se um ESSD PL3. Para mais informações sobre ESSDs, consulte ESSDs.

    Importante
    • O teste em disco bruto oferece os resultados mais precisos de desempenho de block storage. No entanto, execute o Fio diretamente em um dispositivo de block storage com partições, sistema de arquivos ou outros dados causa erros no sistema de arquivos e perda de dados. Antes de começar, crie um snapshot para fazer backup dos seus dados. Para mais informações, consulte Create a snapshot manually.

    • É altamente recomendável não testar o disco do sistema ou um disco de dados com informações, para evitar perda de dados. Para testes, utilize um disco de dados novo, não inicializado e vazio.

    • Os resultados dos testes de desempenho foram obtidos em ambiente de teste e servem apenas como referência. Em ambiente de produção, o desempenho de um disco cloud pode variar devido a fatores como condições de rede e acessos simultâneos. O desempenho real está sujeito a variações.

    • Após a conclusão do teste, proceda da seguinte forma com o novo disco cloud:

Procedimento

  1. Conecte-se a uma instância ECS.

    Para mais informações, consulte Log on to a Linux instance using Workbench.

  2. Execute o comando a seguir para listar os dispositivos de block storage disponíveis.

    sudo fdisk -lu

    A saída abaixo é um exemplo em que /dev/vda é um disco do sistema, enquanto /dev/vdb e /dev/vdc são discos de dados.

    [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

    A saída anterior mostra que a instância possui um disco do sistema /dev/vda e dois discos de dados /dev/vdb e /dev/vdc.

  3. Execute o comando a seguir para verificar se o dispositivo de block storage possui partições ou sistema de arquivos.

    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"

    Conforme mostrado acima, os dispositivos de block storage /dev/vda e /dev/vdb possuem partições e sistemas de arquivos. Nenhuma informação foi retornada para /dev/vdc, o que indica a ausência de partições ou sistemas de arquivos.

  4. Antes de testar o desempenho do block storage, certifique-se de ter feito backup dos dados do objeto de teste para evitar perda de informações. Para mais informações, consulte Create a manual snapshot.

    Nota

    O uso de snapshots gera cobrança. Para mais informações, consulte Snapshot pricing.

  5. Execute o comando a seguir para instale a biblioteca libaio e a ferramenta FIO. Selecione um comando de acordo com o sistema operacional.

    Alibaba Cloud Linux 2/3 and CentOS 6 or later

    Nota

    O CentOS 6 atingiu o fim da vida útil (EOL). De acordo com as regras da comunidade Linux, todo o conteúdo foi removido do seguinte endereço de repositório do CentOS 6: http://mirror.centos.org/centos-6/. Se você continuar usando o repositório padrão do CentOS 6 na Alibaba Cloud, um erro será reportado. Para usar pacotes de instalação específicos do CentOS 6, altere o endereço do repositório do CentOS 6. Para mais informações, consulte How do I change CentOS 6 repository addresses?

    sudo yum install libaio libaio-devel fio -y

    Debian 9 or later and Ubuntu 14 or later

    Importante

    Como o Debian 9 e 10 atingiram o fim da vida útil (EOL), você deve primeiro alterar o endereço do repositório em qualquer instância ECS que execute essas versões. Para mais informações, consulte Change the repository addresses for CentOS/Debian EOL.

    sudo apt-get update
    sudo apt-get install libaio* fio -y
  6. Acesse o diretório /tmp.

    cd /tmp
  7. Crie o script test100w.sh.

    sudo vim test100w.sh
  8. Cole o conteúdo a seguir no arquivo test100w.sh. Para mais informações, 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 o script test100w.sh conforme necessário.

    • Substitua todos os parâmetros your_device pelo nome real do dispositivo, como nvme1n1.

    • Defina os valores para 10 (numjobs), 64 (iodepth), 4k (bs), randwrite (rw) e /dev/your_device no comando RunFio 10 64 4k randwrite /dev/your_device com base na sua situação real.

    • O valor de numjobs não deve exceder o número de núcleos de CPU. Para descobrir a quantidade de núcleos de CPU, execute o seguinte comando:

      cat /proc/cpuinfo |grep "processor" |wc -l
  10. Execute o comando a seguir para testar o desempenho do ESSD.

    sudo sh test100w.sh
    • Na saída do comando, a linha contendo IOPS=*** exibe o IOPS do 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%
    • Caso visualize a saída a seguir, o disco de teste possui uma partição ou sistema de arquivos. O script FIO interrompe a execução para garantir a segurança dos dados. Utilize um disco de dados novo e vazio para o teste.

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

      Se o objeto de teste possuir uma partição, sistema de arquivos ou outros dados, execute o FIO diretamente nele causa exceções no sistema de arquivos e perda de dados. Caso seu disco de dados tenha partição e sistema de arquivos, recomenda-se crie um novo disco de dados vazio para os testes:

      • É possível crie um disco cloud de pagamento conforme o uso com as mesmas configurações e anexá-lo à instância para testes. Para mais informações, consulte Create a data disk.

      • Após a conclusão do teste, desanexe e libere o disco conforme necessário. Para mais informações, consulte Detach a data disk e Release a cloud disk.

Script test100w.sh

  • O comando a seguir define o parâmetro rq_affinity do dispositivo de bloco como 2.

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

    Valores de rq_affinity

    Descrição do valor

    1

    Quando um dispositivo de bloco conclui uma operação de I/O, o evento de conclusão é enviado ao mesmo grupo de vCPU que enviou a solicitação. Em cenários multithread e simultâneos, isso cria um gargalo e limita o desempenho.

    2

    Ao concluir uma operação de I/O, o dispositivo de bloco processa o evento de conclusão na vCPU que originou a solicitação. Em cenários multithread e simultâneos, o desempenho de cada vCPU pode ser totalmente aproveitado.

  • O comando a seguir vincula diferentes jobs a diferentes 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

    No modo normal, um dispositivo possui apenas uma fila de solicitações. Em cenários de I/O simultâneo e multithread, essa única fila pode se tornar um gargalo de desempenho. O modo multi-fila permite que o dispositivo utilize várias filas para processar I/O, aproveitando totalmente o desempenho do armazenamento back-end. Para usar esse recurso de forma eficaz, vincule as threads de I/O a diferentes núcleos de CPU correspondentes a diferentes filas de solicitação.

    Parâmetros

    Observação

    Exemplo

    numjobs

    Quantidade de threads de I/O.

    10

    /dev/your_device

    Nome do dispositivo do ESSD.

    /dev/nvme1n1

    cpus_allowed_policy

    O FIO fornece os parâmetros cpus_allowed_policy e cpus_allowed para vincular vCPUs.

    split

    O comando anterior executa múltiplos jobs e os vincula a diferentes núcleos de CPU correspondentes a diferentes valores de Queue_Id. Para consultar o valor cpu_core_id ao qual um valor Queue_Id está vinculado, execute os seguintes comandos:

    • Execute o comando ls /sys/block/your_device/mq/. Substitua your_device pelo nome real do dispositivo, como nvme1n1. Este comando consulta os valores de Queue_Id para o dispositivo especificado.

    • Execute o comando cat /sys/block/your_device/mq/*/cpu_list. Substitua your_device pelo nome real do dispositivo, como nvme1n1. Este comando mostra qual núcleo de CPU está vinculado a cada fila de solicitação do dispositivo especificado.