Effectuer l'analyse comparative des performances de disques persistants sur une VM Linux


Pour comparer les performances des disques persistants, 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'E/S et d'octets pour tester avec précision 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 des disques persistants. 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 des disques persistants.

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 disque persistant, é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 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. Chaque test fio s'exécute pendant cinq minutes.

  1. Connectez-vous à l'instance.

  2. Installez les dépendances :

    sudo apt update
    sudo apt install -y fio
    
  3. Dans le terminal, répertoriez les disques associés à votre VM et recherchez le disque que vous souhaitez tester. Si votre disque persistant n'est pas encore formaté, formatez et installez le disque.

    sudo lsblk
    
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   10G  0 disk
    └─sda1   8:1    0   10G  0 part /
    sdb      8:32   0  2.5T  0 disk /mnt/disks/mnt_dir
    

    Dans cet exemple, nous testons un disque persistant SSD de 2 500 Go avec l'ID d'appareil sdb.

  4. 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
    
  5. 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 :

    sudo fio --name=write_throughput --directory=$TEST_DIR --numjobs=16 \
    --size=10G --time_based --runtime=5m --ramp_time=2s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
    --group_reporting=1 --iodepth_batch_submit=64 \
    --iodepth_batch_complete_max=64
    
  6. 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 :

     sudo fio --name=write_iops --directory=$TEST_DIR --size=10G \
    --time_based --runtime=5m --ramp_time=2s --ioengine=libaio --direct=1 \
    --verify=0 --bs=4K --iodepth=256 --rw=randwrite --group_reporting=1  \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  7. 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 :

    sudo fio --name=read_throughput --directory=$TEST_DIR --numjobs=16 \
    --size=10G --time_based --runtime=5m --ramp_time=2s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
    --group_reporting=1 \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64
    
  8. 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 :

    sudo fio --name=read_iops --directory=$TEST_DIR --size=10G \
    --time_based --runtime=5m --ramp_time=2s --ioengine=libaio --direct=1 \
    --verify=0 --bs=4K --iodepth=256 --rw=randread --group_reporting=1 \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  9. Effectuer un nettoyage :

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

Analyse comparative des performances brutes des disques persistants

Si vous souhaitez mesurer les performances des disques persistants uniquement en dehors de votre environnement de développement, testez les performances de lecture et d'écriture pour un périphérique en mode bloc sur un disque persistant et une VM non critiques. Chaque test fio s'exécute pendant cinq minutes.

Les commandes ci-dessous concernent un disque persistant SSD de 2 500 Go associé à votre VM. Si la taille de votre disque est différente, modifiez la valeur de l'argument --filesize. Cette taille de disque est nécessaire pour atteindre les limites de débit de 32 processeurs virtuels par VM. Pour en savoir plus, consultez la page Performances des options de stockage de blocs.

  1. Connectez-vous à l'instance.

  2. Installez les dépendances :

    sudo apt-get update
    sudo apt-get install -y fio
    
  3. Remplissez le disque avec des données non nulles. Les lectures à partir 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=/dev/sdb --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
    
  4. Testez la bande passante 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 égale ou supérieure à 64.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=1M --iodepth=64  --iodepth_batch_submit=64  --iodepth_batch_complete_max=64 \
      --rw=write --numjobs=16 --offset_increment=100G
    
  5. Testez les IOPS en écriture. Pour atteindre le nombre maximal d'IOPS des disques persistants, 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, la VM doit maintenir au moins 15 E/S simultanées. Si votre disque et votre VM peuvent atteindre 30 000 IOPS, vous devez maintenir au moins 30 E/S simultanées. 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.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_iops_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  6. 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 du disque persistant. 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 --name=write_latency_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randwrite --iodepth_batch_submit=4  \
      --iodepth_batch_complete_max=4
    
  7. Testez la bande passante en lecture à l'aide de lectures 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 égale ou supérieure à 64.

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=1M --iodepth=64 --rw=read --numjobs=16 --offset_increment=100G \
      --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    
  8. Testez les IOPS en lecture. Pour atteindre le nombre maximal d'IOPS des disques persistants, 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 la valeur maximale de 100 000 IOPS en lecture, spécifiez --iodepth=256 pour ce test.

    sudo fio --name=read_iops_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  9. 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 disque persistant atteint sa limite de saturation, il repousse toute E/S, ce qui se traduit par une augmentation artificielle de la latence des E/S.

    sudo fio --name=read_latency_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randread \
      --iodepth_batch_submit=4  --iodepth_batch_complete_max=4
    
  10. Testez la bande passante en lecture séquentielle.

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --numjobs=4 --thread --offset_increment=500G \
      --bs=1M --iodepth=64 --rw=read \
      --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    
  11. Testez la bande passante en écriture séquentielle.

    sudo fio --name=write_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --numjobs=4 --thread --offset_increment=500G \
      --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    

Étape suivante