Effectuer une analyse comparative des performances Hyperdisk


Pour comparer les performances des hyperdisques, utilisez un testeur d'E/S flexible (FIO) au lieu d'autres outils d'analyse comparative de disques tels que dd. Par défaut, dd utilise une profondeur de file d'attente d'E/S très faible. Il est donc difficile de garantir que l'analyse comparative génère un nombre suffisant d'octets et d'opérations d'E/S pour tester précisément les performances du disque.

De plus, les appareils spéciaux utilisés avec dd sont souvent très lents et ne reflètent pas précisément les performances du disque. En général, évitez d'utiliser des appareils spéciaux tels que /dev/urandom, /dev/random et /dev/zero dans vos analyses comparatives des performances Hyperdisk.

Pour mesurer les IOPS et le débit d'un disque utilisé sur une instance en cours d'exécution, effectuez l'analyse du système de fichiers avec la configuration souhaitée. Utilisez cette option pour tester une charge de travail réaliste sans perdre le contenu de votre disque existant. Notez que lorsque vous comparez le système de fichiers sur un disque existant, de nombreux facteurs propres à votre environnement de développement peuvent affecter les résultats de l'analyse comparative. Vous risquez donc de ne pas atteindre les limites de performances des disques.

Pour mesurer les performances brutes d'un hyperdisque, évaluez directement le périphérique en mode bloc. Utilisez cette option pour comparer les performances brutes des disques avec les limites de performances des disques.

Les commandes suivantes fonctionnent avec le gestionnaire de packages apt sur les systèmes d'exploitation Debian ou Ubuntu.

Analyse comparative des IOPS et du débit d'un disque sur une instance en cours d'exécution

Si vous souhaitez mesurer les IOPS et le débit pour une charge de travail réaliste sur un disque actif sur une instance de VM en cours d'exécution sans perdre le contenu de votre disque, effectuez l'analyse comparative sur un nouveau répertoire sur le système de fichiers existant.

Préparer les tests

  1. Connectez-vous à l'instance.

  2. Installez les dépendances :

    sudo apt update
    sudo apt install -y fio
    
  3. Si votre hyperdisque n'est pas encore formaté, formatez et installez le disque.

  4. Dans le terminal, répertoriez les disques associés à votre VM et recherchez le disque que vous souhaitez tester.

    sudo lsblk
    

    Cette commande produit un résultat semblable à celui-ci:

    NAME         MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
    nvme0n1      259:0    0    10G  0 disk
    ├─nvme0n1p1  259:1    0   9.9G  0 part  /
    ├─nvme0n1p14 259:2    0     4M  0 part
    └─nvme0n1p15 259:3    0   106M  0 part  /boot/efi
    nvme0n2      259:4    0   3.4T  0 disk
    

    Dans cet exemple, nous testons un volume extrême sur 3 500 Gio d'hyperdisque portant le nom d'appareil nvme0n2.

  5. Créez un répertoire fiotest sur le disque. Dans cet exemple, le disque est installé dans /mnt/disks/mnt_dir :

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  6. Si la VM utilise l'interface de disque NVMe pour le rattachement d'hyperdisque (si le nom du disque brut est précédé du préfixe nvme), procédez comme suit pour obtenir le nombre de nœuds NUMA disponibles pour la VM.

    La stratégie d'analyse comparative des disques NVMe diffère pour les VM ne comportant qu'un seul nœud NUMA et les VM comportant plusieurs nœuds NUMA. Lorsque vous testez les performances d'hyperdisque à l'aide de l'interface de disque NVMe, seules 256 tailles de files d'attente NVMe sont allouées par file d'attente. En raison de la taille limitée des files d'attente NVMe disponibles et du conflit potentiel provenant des autres disques associés à la même VM, ces tests d'analyse comparative utilisent deux files d'attente de disque NVMe pour conserver une taille de file d'attente agrégée, capable de gérer une profondeur d'E/S de 256.

    1. Obtenez le nombre de nœuds NUMA.

      lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
      
    2. Si la VM ne comporte qu'un seul nœud NUMA, obtenez le mappage de la file d'attente entre le processeur et le NVMe. Vous utiliserez ces informations ultérieurement pour le paramètre --cpus-allowed.

      QUEUE_1_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 1p | tr -d " \t")
      QUEUE_2_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 2p | tr -d " \t")
      

Tester le débit en écriture

Testez le débit en écriture à l'aide d'écritures séquentielles comportant plusieurs flux parallèles (plus de 16). Prévoyez une taille de bloc d'E/S de 1 Mo et une profondeur d'E/S d'au moins 64 :

  1. Si l'hyperdisque utilise l'interface SCSI:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
    --name=write_throughput
    
  2. Si l'hyperdisque utilise l'interface NVMe:

    1. Si la VM ne comporte qu'un seul nœud NUMA, utilisez la commande suivante:

      sudo fio --directory=$TEST_DIR --numjobs=8 \
      --size=10G --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=write_throughput --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_throughput_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Si la VM comporte plusieurs nœuds NUMA, utilisez la commande suivante:

      sudo fio --directory=$TEST_DIR --numjobs=8 \
      --size=10G --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --group_reporting \
      --name=write_throughput --numa_cpu_nodes=0 \
      --name=write_throughput_2 --numa_cpu_nodes=1
      

Testez les IOPS en écriture.

Testez les IOPS en écriture à l'aide d'écritures aléatoires. Prévoyez une taille de bloc d'E/S de 4 ko et une profondeur d'E/S d'au moins 256 :

  1. Si l'hyperdisque est associé à l'aide de l'interface SCSI:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G -time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256 \
    --name=write_iops
    
  2. Si l'hyperdisque utilise l'interface NVMe:

    1. Si la VM ne comporte qu'un seul nœud NUMA, utilisez la commande suivante:

      sudo fio --directory=$TEST_DIR --numjobs=8 \
      --size=10G --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=write_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Si la VM comporte plusieurs nœuds NUMA, utilisez la commande suivante:

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=write_iops --numa_cpu_nodes=0 \
      --name=write_iops_2 --numa_cpu_nodes=1
      

Testez le débit en lecture :

Testez le débit en lecture à l'aide de lectures séquentielles comportant plusieurs flux parallèles (plus de 16). Prévoyez une taille de bloc d'E/S de 1 Mo et une profondeur d'E/S d'au moins 64 :

  1. Si l'hyperdisque utilise l'interface SCSI:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
    --name=read_throughput
    
  2. Si l'hyperdisque utilise l'interface NVMe:

    1. Si la VM ne comporte qu'un seul nœud NUMA, utilisez la commande suivante:

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=read_throughput --cpus_allowed=$QUEUE_1_CPUS \
      --name=read_throughput_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Si la VM comporte plusieurs nœuds NUMA, utilisez la commande suivante:

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --group_reporting \
      --name=read_throughput --numa_cpu_nodes=0 \
      --name=read_throughput_2 --numa_cpu_nodes=1
      

Testez les IOPS en lecture.

Testez les IOPS en lecture à l'aide de lectures aléatoires. Prévoyez une taille de bloc d'E/S de 4 ko et une profondeur d'E/S d'au moins 256 :

  1. Si l'hyperdisque utilise l'interface SCSI:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
    --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
    --name=read_iops
    
  2. Si l'hyperdisque utilise l'interface NVMe:

    1. Si la VM ne comporte qu'un seul nœud NUMA, utilisez la commande suivante:

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=read_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=read_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Si la VM comporte plusieurs nœuds NUMA, utilisez la commande suivante:

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=read_iops --numa_cpu_nodes=0 \
      --name=read_iops_2 --numa_cpu_nodes=1
      

Effectuer un nettoyage

Supprimez les répertoires de test.

sudo rm $TEST_DIR/write* $TEST_DIR/read*

Analyse comparative des IOPS et du débit pour les hyperdisques extrêmes sur des VM C3

Google Cloud Hyperdisk Extreme offre de meilleures performances sur les VM C3 avec 176 processeurs virtuels. Pour atteindre les limites de performances plus élevées, vous devez associer plusieurs volumes Hyperdisk Extreme à la VM.

Pour mesurer les E/S par seconde (IOPS) ou le débit pour une charge de travail réaliste sur des disques actifs sur une VM C3 en cours d'exécution sans perdre le contenu de vos disques de données existants, effectuez l'analyse comparative sur un nouveau répertoire sur le système de fichiers existant et associer de nouveaux volumes Hyperdisque extrême à la VM pour les tâches d'analyse comparative.

Pour les disques associés à l'interface NVMe, il est recommandé de répartir la charge de travail d'E/S sur toutes les files d'attente NVMe disponibles pour la VM. Cela permet d'optimiser les performances de l'hyperdisque. Sur les VM C3 avec 176 processeurs virtuels, quatre nœuds NUMA sont mappés de 1 à 1 à quatre files d'attente NVMe. Ce mappage est supposé pour les tests d'analyse comparative décrits dans cette section.

Préparer les tests

  1. Ajoutez de nouveaux disques Hyperdisques extrêmes à votre VM et consultez les limites de performances des hyperdisques pour déduire la configuration de disque nécessaire à vos performances cibles.

  2. Se connecter à l'instance :

  3. Installez les dépendances :

    sudo apt update
    sudo apt install -y fio
    
  4. Répertoriez les disques associés à votre VM et recherchez le disque que vous souhaitez tester.

    sudo lsblk
    

    Cette commande produit un résultat semblable à celui-ci:

    NAME         MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
    nvme0n1      259:0    0    10G  0 disk
    ├─nvme0n1p1  259:1    0   9.9G  0 part  /
    ├─nvme0n1p14 259:2    0     4M  0 part
    └─nvme0n1p15 259:3    0   106M  0 part  /boot/efi
    nvme0n2      259:4    0   2.5T  0 disk
    nvme0n3      259:5    0   2.5T  0 disk
    nvme0n4      259:6    0   2.5T  0 disk
    

    Dans cet exemple, nous testons les performances de l'hyperdisque Google Cloud sur trois volumes Hyperdisk Extreme de 2 500 Gio avec des appareils nommés nvme0n2, nvme0n3 et nvme0n4.

Analyse comparative du débit de l'hyperdisque extrême sur C3

Cette section explique comment comparer le débit en lecture et en écriture des disques hyperdisques extrêmes.

Préparation aux tests

Avant de commencer à comparer les performances des disques hyperdisques extrêmes associés à une VM C3 avec 176 processeurs virtuels, procédez comme suit.

  1. Créez un répertoire fiotest dans votre système d'exploitation. Dans cet exemple, le répertoire racine est /mnt/disks/mnt_dir:

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  2. Étant donné que la VM nécessite plusieurs disques pour atteindre les niveaux de performance les plus élevés, effectuez RAID 0 sur tous les volumes d'hyperdisques associés pour plus de simplicité. Cela facilite la répartition uniforme des données sur plusieurs volumes d'hyperdisques.

    Dans cet exemple, RAID 0 correspond aux performances de trois volumes Hyperdisk Extreme associés à la VM C3.

    sudo mdadm --create /dev/md0 --level=0 --raid-devices=3 /dev/nvme0n2 /dev/nvme0n3 /dev/nvme0n4
    
  3. Formatez et installez le volume RAID /dev/md0.

Tester le débit en écriture

Testez le débit en écriture à l'aide d'écritures séquentielles comportant plusieurs flux parallèles (au moins 16). Prévoyez une taille de bloc d'E/S de 1 Mio et une profondeur totale d'E/S d'au moins 32 par file d'attente NVMe.

# Running this command causes data loss on the targeted file on the device.
# We strongly recommend using a throwaway disk.

sudo fio --name=global --group_reporting=1 --filesize=1024G \
--filename=$TEST_DIR/fiotestfile --numjobs=4 --size=64G \
--offset_increment=64G --time_based --runtime=5m \
--ramp_time=10s --ioengine=libaio --direct=1 --verify=0 \
--bs=1M --iodepth=8 --rw=write \
--name=write_throughput --numa_cpu_nodes=0 \
--name=write_throughput_1 --numa_cpu_nodes=1 \
--name=write_throughput_2 --numa_cpu_nodes=2 \
--name=write_throughput_3 --numa_cpu_nodes=3

Testez le débit en lecture :

Testez le débit en lecture à l'aide de lectures séquentielles comportant plusieurs flux parallèles (au moins 16). Prévoyez une taille de bloc d'E/S de 1 Mio et une profondeur totale d'E/S d'au moins 32 par file d'attente NVMe.

sudo fio --name=global --group_reporting=1 --filesize=1024G \
--filename=$TEST_DIR/fiotestfile --numjobs=4 --size=64G \
--offset_increment=64G --time_based --runtime=5m \
--ramp_time=10s --ioengine=libaio --direct=1 \
--verify=0 --bs=1M --iodepth=8 --rw=read \
--name=read_throughput --numa_cpu_nodes=0 \
--name=read_throughput_1 --numa_cpu_nodes=1 \
--name=read_throughput_2 --numa_cpu_nodes=2 \
--name=read_throughput_3 --numa_cpu_nodes=3

Analyse comparative des IOPS de l'hyperdisque extrême sur C3

Pour comparer les performances d'E/S par seconde (IOPS), nous vous recommandons d'effectuer de petites opérations d'E/S parallèles directement vers ou depuis des disques bruts (sans RAID).

Testez les IOPS en écriture.

Testez les IOPS en écriture à l'aide d'écritures aléatoires. Prévoyez une taille de bloc d'E/S de 4 Kio et une profondeur d'E/S d'au moins 256, en utilisant au moins deux files d'attente NVMe.

# Running this command causes data loss on the targeted device.
# We strongly recommend using a throwaway disk.

sudo fio --name=global --group_reporting=1 \
--directory=/ --bs=4K --direct=1 \
--filesize=512G --iodepth=256 \
--iodepth_batch_complete_max=256 --iodepth_batch_submit=256 \
--ioengine=libaio --numjobs=5 --ramp_time=10s \
--randrepeat=0 --runtime=5m --rw=randwrite \
--time_based=1 --verify=0 \
--name=write_iops_test --filename=/dev/nvme0n2 --numa_cpu_nodes=0 \
--name=write_iops_test_1 --filename=/dev/nvme0n3  --numa_cpu_nodes=1 \
--name=write_iops_test_2 --filename=/dev/nvme0n4 --numa_cpu_nodes=2

Testez les IOPS en lecture.

Testez les IOPS en lecture à l'aide de lectures aléatoires. Prévoyez une taille de bloc d'E/S de 4 Kio et une profondeur d'E/S d'au moins 256, en utilisant au moins deux files d'attente NVMe.

sudo fio --name=global --group_reporting=1 --directory=/ \
--bs=4K --direct=1 --filesize=512G --iodepth=256 \
--iodepth_batch_complete_max=256 --iodepth_batch_submit=256 \
--ioengine=libaio --numjobs=5 --ramp_time=10s \
--randrepeat=0 --runtime=5m --rw=randread \
--time_based=1 --verify=0 \
--name=read_iops_test --filename=/dev/nvme0n2 --numa_cpu_nodes=0 \
--name=read_iops_test_1 --filename=/dev/nvme0n3  --numa_cpu_nodes=1 \
--name=read_iops_test_2 --filename=/dev/nvme0n4 --numa_cpu_nodes=2

Analyse comparative de latence de l'hyperdisque extrême sur C3

Lors du test de la latence E/S, la VM ne doit pas atteindre la limite de bande passante ou d'IOPS. Si c'est le cas, la latence observée ne reflète pas la latence réelle des E/S d'hyperdisque. Par exemple, si la VM atteint la limite d'IOPS à une profondeur d'E/S de 30 et que la commande fio a doublé cette valeur, le nombre total d'IOPS reste le même et la latence d'E/S rapportée double.

Il suffit de cibler directement un seul disque dur brut pour obtenir des latences d'E/S réalistes.

Testez la latence en écriture.

Testez la latence en écriture à l'aide d'écritures aléatoires. Prévoyez une taille de bloc d'E/S de 4 Kio et une profondeur d'E/S de 4.

# Running this command causes data loss on the targeted device.
# We strongly recommend using a throwaway disk.

sudo fio --filename=/dev/nvme0n2  \
--filesize=512G --time_based \
--runtime=5m --ramp_time=10s --ioengine=libaio \
--direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randwrite \
--iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
--name=write_latency

Testez la latence en lecture.

Testez la latence en lecture à l'aide de lectures aléatoires. Prévoyez une taille de bloc d'E/S de 4 Kio et une profondeur d'E/S de 4.

sudo fio --filename=/dev/nvme0n2  \
--filesize=512G --time_based \
--runtime=5m --ramp_time=10s --ioengine=libaio \
--direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randread \
--iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
--name=read_latency

Effectuer un nettoyage

  1. Supprimez les fichiers de test.

    sudo rm -rf $TEST_DIR/*
    
  2. Désinstallez et arrêtez le volume RAID.

    sudo umount /dev/md0
    sudo mdadm --stop /dev/md0
    
  3. Dissociez et supprimez les volumes Hyperdisk associés. Reportez-vous aux commandes gcloud compute instances detach-disk et gcloud compute disks delete.

Analyse comparative des performances brutes de l'hyperdisque

Si vous souhaitez mesurer les performances des volumes Hyperdis seuls, en dehors de votre environnement de développement, vous pouvez tester les performances de lecture et d'écriture pour un périphérique en mode bloc sur un disque et une VM non critiques.

Les commandes ci-dessous concernent un volume extrême de 3 500 Gio associé à votre VM. Cette taille de disque est nécessaire pour atteindre les limites de débit de 32 processeurs virtuels par VM. Si la taille de votre disque est différente, modifiez la valeur de l'argument --filesize dans les commandes ci-dessous. Pour en savoir plus sur les limites de performances des types de machines des VM, consultez la section Compatibilité avec les types de machines.

Préparer les tests

  1. Connectez-vous à l'instance.

  2. Installez les dépendances :

    sudo apt-get update
    sudo apt-get install -y fio
    
  3. Obtenez le chemin d'accès au disque brut. Stockez le chemin d'accès dans une variable. L'exemple suivant utilise /dev/nvme0n2 comme chemin d'accès au disque brut:

    TEST_DIR=/dev/nvme0n2
    
  4. Remplissez le disque avec des données non nulles. Les lectures hyperdisques de blocs vides ont un profil de latence différent des lectures de blocs contenant des données. Nous vous recommandons donc de remplir le disque avant de lancer des analyses comparatives de latence de lecture.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    
    sudo fio --name=fill_disk \
    --filename=$TEST_DIR --filesize=2500G \
    --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
    --bs=128K --iodepth=64 --rw=randwrite \
    --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    
  5. Si la VM utilise l'interface de disque NVMe pour le rattachement d'hyperdisque (si le nom du disque brut est précédé du préfixe nvme), procédez comme suit pour obtenir le nombre de nœuds NUMA disponibles pour la VM.

    La stratégie d'analyse comparative des disques NVMe diffère pour les VM ne comportant qu'un seul nœud NUMA et les VM comportant plusieurs nœuds NUMA. Lorsque vous testez les performances d'hyperdisque à l'aide de l'interface de disque NVMe, seules 256 tailles de files d'attente NVMe sont allouées par file d'attente. En raison de la taille limitée des files d'attente NVMe disponibles et du conflit potentiel provenant des autres disques associés à la même VM, ces tests d'analyse comparative utilisent deux files d'attente de disque NVMe pour conserver une taille de file d'attente agrégée, capable de gérer la profondeur d'E/S de 256.

    1. Obtenez le nombre de nœuds NUMA.

      lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
      
    2. Si la VM ne comporte qu'un seul nœud NUMA, obtenez le mappage de la file d'attente entre le processeur et le NVMe. Vous utiliserez ces informations ultérieurement pour le paramètre --cpus-allowed.

      QUEUE_1_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 1p | tr -d " \t")
      QUEUE_2_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 2p | tr -d " \t")
      

Tester le débit en écriture

Testez le débit en écriture à l'aide d'écritures séquentielles comportant plusieurs flux parallèles (plus de 16). Prévoyez une taille d'E/S de 1 Mo et une profondeur d'E/S de 64 ou plus.

  1. Si l'hyperdisque est associé via l'interface SCSI:

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    
    sudo fio --filename=$TEST_DIR \
    --numjobs=16 --size=500G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
    --offset_increment=20G \
    --name=write_throughput
    
  2. Si l'hyperdisque utilise l'interface NVMe:

    1. Si la VM ne comporte qu'un seul nœud NUMA, utilisez la commande suivante:

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --cpus_allowed_policy=split \
      --offset_increment=20G --group_reporting \
      --name=write_throughput --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_throughput_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Si la VM comporte plusieurs nœuds NUMA, utilisez la commande suivante:

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --offset_increment=20G --group_reporting \
      --name=write_throughput --numa_cpu_nodes=0 \
      --name=write_throughput_2 --numa_cpu_nodes=1
      

Testez les IOPS en écriture.

Pour atteindre le nombre maximal d'IOPS d'Hyperdisk, vous devez conserver une file d'attente d'E/S de grande profondeur. Par exemple, si la latence d'écriture est de 1 milliseconde, la VM peut atteindre au maximum 1 000 IOPS pour chaque E/S en cours de transfert. Pour atteindre 15 000 IOPS en écriture, la VM doit maintenir au moins 15 opérations d'E/S en cours de transfert. Si votre disque et votre VM peuvent atteindre 30 000 IOPS d'écriture, vous devez maintenir au moins 30 opérations d'E/S en cours de transfert. Si la taille des E/S est supérieure à 4 Ko, il est possible que la VM atteigne la limite de bande passante avant d'atteindre la limite d'IOPS.

Testez les IOPS en écriture à l'aide d'écritures aléatoires. Prévoyez une taille de bloc d'E/S de 4 ko et une profondeur d'E/S d'au moins 256 :

  1. Si le volume hyperdisque extrême est associé à l'aide de l'interface SCSI:

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    
    sudo fio --filename=$TEST_DIR \
    --numjobs=16 --size=500G -time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256 \
    --name=write_iops
    
  2. Si le volume hyperdisque extrême est associé à l'aide de l'interface NVMe:

    1. Si la VM ne comporte qu'un seul nœud NUMA, utilisez la commande suivante:

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=write_write_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_write_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Si la VM comporte plusieurs nœuds NUMA, utilisez la commande suivante:

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=write_iops --numa_cpu_nodes=0 \
      --name=write_iops_2 --numa_cpu_nodes=1
      

Testez la latence en écriture.

Lors du test de la latence par E/S, la VM ne doit pas atteindre la limite de bande passante ou d'IOPS, sinon la latence observée ne reflétera pas la latence réelle des E/S d'Hyperdisk. Par exemple, si la limite d'IOPS est atteinte avec une profondeur d'E/S de 30 et que la commande fio présente le double de cette valeur, alors le total d'IOPS reste le même et la latence d'E/S rapportée double.

# Running this command causes data loss on the second device.
# We strongly recommend using a throwaway VM and disk.
sudo fio --filename=$TEST_DIR \
--filesize=500G --time_based \
--runtime=5m --ramp_time=10s --ioengine=libaio \
--direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randwrite \
--iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
--name=write_latency

Tester la bande passante en lecture

Testez la bande passante en lecture à l'aide de lectures séquentielles comportant plusieurs flux parallèles (plus de 16). Prévoyez une taille de bloc d'E/S de 1 Mo et une profondeur d'E/S d'au moins 64 :

  1. Si le volume Hyperdisk Extreme est associé à l'aide de l'interface SCSI:

     sudo fio --filename=$TEST_DIR \
     --numjobs=16 --size=500G --time_based \
     --runtime=5m --ramp_time=10s --ioengine=libaio \
     --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
     --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
     --offset_increment=20G --name=read_bandwidth
  2. Si le volume hyperdisque extrême est associé à l'aide de l'interface NVMe:

    1. Si la VM ne comporte qu'un seul nœud NUMA, utilisez la commande suivante:

        sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
        --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
        --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
        --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
        --cpus_allowed_policy=split \
        --offset_increment=20G --group_reporting \
        --name=read_bandwidth --cpus_allowed=$QUEUE_1_CPUS \
        --name=read_bandwidth_2 --cpus_allowed=$QUEUE_2_CPUS
    2. Si la VM comporte plusieurs nœuds NUMA, utilisez la commande suivante:

        sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
        --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
        --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
        --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
        --offset_increment=20G --group_reporting \
        --name=read_bandwidth --numa_cpu_nodes=0 \
        --name=read_bandwidth_2 --numa_cpu_nodes=1

Testez les IOPS en lecture.

Pour atteindre le nombre maximal d'IOPS d'Hyperdisk, vous devez conserver une file d'attente d'E/S de grande profondeur. Si la taille des E/S est supérieure à 4 Ko, il est possible que la VM atteigne la limite de bande passante avant d'atteindre la limite d'IOPS. Pour atteindre le nombre maximal d'IOPS en lecture disponibles pour un type de machine donné, spécifiez --iodepth=256 pour ce test.

  1. Si le volume Hyperdisk Extreme est associé à l'aide de l'interface SCSI:

    sudo fio --filename=$TEST_DIR \
    --numjobs=16 --size=500G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
    --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
    --name=read_iops
    
  2. Si le volume hyperdisque extrême est associé à l'aide de l'interface NVMe:

    1. Si la VM ne comporte qu'un seul nœud NUMA, utilisez la commande suivante:

      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=read_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=read_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Si la VM comporte plusieurs nœuds NUMA, utilisez la commande suivante:

      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=read_iops --numa_cpu_nodes=0 \
      --name=read_iops_2 --numa_cpu_nodes=1
      

Testez la latence en lecture.

Il est important de remplir le disque avec des données afin d'obtenir une mesure de latence réaliste. Il est important que la VM n'atteigne pas les limites d'IOPS ou de débit lors de ce test : une fois que le volume d'hyperdisques atteint sa limite de saturation, il repousse toute E/S entrante. Ce refus se traduit par une augmentation artificielle de la latence des E/S.

 sudo fio --filename=$TEST_DIR \
 --filesize=500G --time_based \
 --runtime=5m --ramp_time=10s --ioengine=libaio \
 --direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randread \
 --iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
 --name=read_latency

Effectuer un nettoyage

Si vous avez utilisé un disque et une VM non critiques comme recommandé, vous pouvez effectuer les opérations suivantes après avoir effectué les tests d'analyse comparative:

  • Dissociez et supprimez le disque.
  • Supprimez la VM.

Étapes suivantes