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.
RemarqueFio (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.
RemarqueLes 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.
ImportantLe 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 :
Si vous souhaitez conserver le disque : ne l'utilisez pas directement. Vous devez réinitialiser le disque de données.
Si vous n'avez plus besoin du disque : Détachez le disque de données puis libérez le disque cloud.
Procédure
-
Connectez-vous à une instance ECS.
Pour plus d'informations, consultez la page Se connecter à une instance Linux via Workbench.
-
Exécutez la commande suivante pour lister les périphériques de stockage par bloc disponibles.
sudo fdisk -luLa 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 bytesLa 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.
-
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.
-
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.
RemarqueL'utilisation des snapshots est facturée. Pour plus d'informations, consultez la page Tarification des snapshots.
-
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
RemarqueCentOS 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 -yDebian 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 -
Accédez au répertoire /tmp.
cd /tmp -
Créez le script test100w.sh.
sudo vim test100w.sh -
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 -
Modifiez le script test100w.sh selon vos besoins.
Remplacez tous les paramètres
your_devicepar 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_deviceen fonction de votre situation réelle.-
La valeur
numjobsne 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
-
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!AvertissementSi 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 :
Vous pouvez créer un disque cloud en paiement à l'utilisation avec les mêmes configurations et l'attacher à l'instance pour les tests. Pour plus d'informations, consultez la page Créer un disque de données.
Une fois le test terminé, vous pouvez détacher et libérer le disque selon vos besoins. Pour plus d'informations, consultez les pages Détacher un disque de données et Libérer un disque cloud.
-
Script Test100w.sh
-
La commande suivante définit le paramètre
rq_affinitydu périphérique bloc sur 2.echo 2 > /sys/block/your_device/queue/rq_affinityValeurs 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=splitRemarqueEn 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
numjobsNombre de threads d'E/S.
10
/dev/your_deviceNom du périphérique du disque ESSD.
/dev/nvme1n1
cpus_allowed_policyFIO propose les paramètres
cpus_allowed_policyetcpus_allowedpour associer les vCPU.split
La commande précédente exécute plusieurs
jobset 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, remplacezyour_devicepar le nom réel du périphérique, par exemple nvme1n1. Cette commande interroge les valeursQueue_Idpour le périphérique spécifié.Exécutez la commande
cat /sys/block/your_device/mq/*/cpu_list. Dans cette commande, remplacezyour_devicepar 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é.