Tous les produits
Search
Centre de documentation

Elastic Compute Service:Test ESSD IOPS performance

Dernière mise à jour :Aug 24, 2026

Cette rubrique explique comment configurer les conditions de test et utiliser l'outil FIO pour évaluer les performances en IOPS d'un disque ESSD utilisé comme disque brut.

Prérequis

  • Outil de test : FIO.

    Remarque

    Fio (Flexible I/O Tester) est un outil open source puissant dédié aux tests d'E/S. Il évalue les performances des périphériques de stockage en appliquant diverses charges de travail, telles que des lectures et écritures séquentielles ou aléatoires.

  • Type d'instance : nous vous recommandons d'utiliser une instance ECS ecs.g7se.32xlarge. Pour plus d'informations, consultez la page Familles d'instances à usage général (série g).

  • Image : une version récente d'une image publique Linux. Cette rubrique utilise Alibaba Cloud Linux 3.

    Remarque

    Les tests montrent que certaines distributions Linux peuvent ne pas offrir les performances attendues. Nous vous recommandons d'utiliser l'image officielle Alibaba Cloud Linux 3 fournie par Alibaba Cloud pour obtenir les meilleurs résultats.

  • Disque ESSD :

    • Le test d'un disque brut fournit des métriques de performance plus précises pour un disque cloud. Nous vous recommandons d'exécuter FIO directement sur un disque brut afin d'en tester les performances.

    • Un disque ESSD PL3 est recommandé. Pour plus d'informations sur les disques ESSD, consultez la page Disques ESSD.

    Important
    • Le test d'un disque brut offre les résultats de performance de stockage par bloc les plus précis. Toutefois, l'exécution directe de Fio sur un périphérique de stockage par bloc contenant des partitions, un système de fichiers ou d'autres données entraînera des erreurs du système de fichiers et une perte de données. Avant de commencer, créez un snapshot pour sauvegarder vos données. Pour plus d'informations, consultez la page Créer manuellement un snapshot.

    • Nous vous déconseillons vivement de tester le disque système ou un disque de données contenant des informations, afin d'éviter toute perte de données. Pour les tests, utilisez de préférence un disque de données nouvellement créé, non initialisé et vide.

    • Les résultats des tests de performance sont obtenus dans un environnement de test et sont fournis à titre indicatif uniquement. Dans un environnement de production, les performances d'un disque cloud peuvent varier en fonction de facteurs tels que les conditions réseau et l'accès simultané. Les performances réelles seront donc différentes.

    • Une fois le test terminé, gérez le nouveau disque cloud comme suit :

Procédure

  1. Connectez-vous à une instance ECS.

    Pour plus d'informations, consultez la page Se connecter à une instance Linux via Workbench.

  2. Exécutez la commande suivante pour lister les périphériques de stockage par bloc disponibles.

    sudo fdisk -lu

    La sortie suivante illustre un exemple où /dev/vda est un disque système, tandis que /dev/vdb et /dev/vdc sont des disques de données.

    [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

    La sortie ci-dessus indique que l'instance dispose d'un disque système /dev/vda et de deux disques de données /dev/vdb et /dev/vdc.

  3. Exécutez la commande suivante pour vérifier si le périphérique de stockage par bloc possède des partitions ou un système de fichiers.

    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"

    Comme indiqué ci-dessus, les périphériques de stockage par bloc /dev/vda et /dev/vdb comportent des partitions et des systèmes de fichiers. Aucune information n'est renvoyée pour /dev/vdc, ce qui signifie qu'il ne contient ni partition ni système de fichiers.

  4. Avant de tester les performances du stockage par bloc, assurez-vous d'avoir sauvegardé les données de l'objet testé afin de prévenir toute perte de données. Pour plus d'informations, consultez la page Créer un snapshot manuel.

    Remarque

    L'utilisation des snapshots est facturée. Pour plus d'informations, consultez la page Tarification des snapshots.

  5. Exécutez la commande suivante pour installer la bibliothèque libaio et l'outil FIO. Sélectionnez la commande appropriée en fonction de votre système d'exploitation.

    Alibaba Cloud Linux 2/3 et CentOS 6 ou version ultérieure

    Remarque

    CentOS 6 a atteint sa fin de vie (EOL). Conformément aux règles de la communauté Linux, tout le contenu a été supprimé de l'adresse du dépôt CentOS 6 suivante : http://mirror.centos.org/centos-6/. Si vous continuez à utiliser le dépôt CentOS 6 par défaut sur Alibaba Cloud, une erreur sera signalée. Pour utiliser des packages d'installation spécifiques à CentOS 6, modifiez l'adresse du dépôt CentOS 6. Pour plus d'informations, consultez la page Comment modifier les adresses des dépôts CentOS 6 ?

    sudo yum install libaio libaio-devel fio -y

    Debian 9 ou version ultérieure et Ubuntu 14 ou version ultérieure

    Important

    Étant donné que Debian 9 et 10 ont atteint leur fin de vie (EOL), vous devez d'abord modifier l'adresse du dépôt sur toute instance ECS exécutant ces versions. Pour plus d'informations, consultez la page Modifier les adresses des dépôts pour les versions EOL de CentOS/Debian.

    sudo apt-get update
    sudo apt-get install libaio* fio -y
  6. Accédez au répertoire /tmp.

    cd /tmp
  7. Créez le script test100w.sh.

    sudo vim test100w.sh
  8. Collez le contenu suivant dans le fichier test100w.sh. Pour plus d'informations, consultez la section Script Test100w.sh.

    #!/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. Modifiez le script test100w.sh selon vos besoins.

    • Remplacez tous les paramètres your_device par le nom réel du périphérique, par exemple nvme1n1.

    • Définissez les valeurs pour 10 (numjobs), 64 (iodepth), 4k (bs), randwrite (rw) et /dev/your_device dans la commande RunFio 10 64 4k randwrite /dev/your_device en fonction de votre situation réelle.

    • La valeur numjobs ne doit pas dépasser le nombre de cœurs CPU. Pour connaître le nombre de cœurs CPU, exécutez la commande suivante :

      cat /proc/cpuinfo |grep "processor" |wc -l
  10. Exécutez la commande suivante pour tester les performances du disque ESSD.

    sudo sh test100w.sh
    • Dans la sortie de la commande, la ligne contenant IOPS=*** affiche les IOPS du disque 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 vous obtenez la sortie suivante, cela signifie que le disque testé possède une partition ou un système de fichiers. Le script FIO s'arrête pour garantir la sécurité des données. Utilisez un disque de données neuf et vide pour le test.

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

      Si l'objet testé contient une partition, un système de fichiers ou d'autres données, l'exécution directe de FIO sur cet objet provoquera des anomalies du système de fichiers et une perte de données. Si votre disque de données comporte une partition et un système de fichiers, nous vous recommandons de créer un nouveau disque de données vide pour effectuer les tests :

Script Test100w.sh

  • La commande suivante définit le paramètre rq_affinity du périphérique bloc sur 2.

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

    Valeurs de rq_affinity

    Description de la valeur

    1

    Lorsqu'un périphérique bloc termine une opération d'E/S, l'événement de fin est envoyé au même groupe de vCPU que celui qui a soumis la requête. Dans un scénario multithread et concurrent, cela crée un goulot d'étranglement et limite les performances.

    2

    Lorsqu'un périphérique bloc termine une opération d'E/S, l'événement de fin est traité sur le vCPU qui a soumis la requête. Dans un scénario multithread et concurrent, les performances de chaque vCPU peuvent être pleinement exploitées.

  • La commande suivante associe différents jobs à différents cœurs 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
    Remarque

    En mode normal, un périphérique ne dispose que d'une seule file d'attente de requêtes. Dans un scénario d'E/S multithread et concurrent, cette unique file d'attente peut devenir un goulot d'étranglement pour les performances. Le mode multi-file d'attente permet à un périphérique d'utiliser plusieurs files d'attente de requêtes pour traiter les E/S, exploitant ainsi pleinement les performances du stockage backend. Pour utiliser efficacement cette fonctionnalité, vous devez associer les threads d'E/S à différents cœurs CPU correspondant à différentes files d'attente de requêtes.

    Paramètres

    Remarque

    Exemple

    numjobs

    Nombre de threads d'E/S.

    10

    /dev/your_device

    Nom du périphérique du disque ESSD.

    /dev/nvme1n1

    cpus_allowed_policy

    FIO propose les paramètres cpus_allowed_policy et cpus_allowed pour associer les vCPU.

    split

    La commande précédente exécute plusieurs jobs et les associe à différents cœurs CPU correspondant à différentes valeurs Queue_Id. Pour interroger la valeur cpu_core_id à laquelle une valeur Queue_Id est associée, exécutez les commandes suivantes :

    • Exécutez la commande ls /sys/block/your_device/mq/. Dans cette commande, remplacez your_device par le nom réel du périphérique, par exemple nvme1n1. Cette commande interroge les valeurs Queue_Id pour le périphérique spécifié.

    • Exécutez la commande cat /sys/block/your_device/mq/*/cpu_list. Dans cette commande, remplacez your_device par le nom réel du périphérique, par exemple nvme1n1. Cette commande indique quel cœur CPU est associé à chaque file d'attente de requêtes pour le périphérique spécifié.