Effectuer l'analyse comparative des performances d'un disque SSD local


Les limites de performances des disques SSD locaux indiquées dans la section Choisir une option de stockage ont été atteintes en utilisant des paramètres spécifiques sur l'instance SSD locale. Si votre instance de machine virtuelle (VM) ne parvient pas à atteindre ces limites de performances alors que vous l'avez configurée à l'aide des paramètres recommandés pour les disques SSD locaux, vous pouvez comparer le niveau de performances que vous atteignez aux limites publiées en répliquant les paramètres utilisés par l'équipe Compute Engine.

Dans ces instructions, nous partons du principe que vous utilisez un système d'exploitation Linux avec le gestionnaire de packages apt installé.

Créer une VM avec un disque SSD local

Le nombre de disques SSD locaux pouvant être associés à une VM dépend du type de machine que vous utilisez pour créer la VM. Pour plus d'informations, consultez la section Choisir un nombre valide de disques SSD locaux.

  1. Créez une instance SSD locale dotée de quatre ou huit processeurs virtuels pour chaque appareil, en fonction de votre charge de travail.

    Par exemple, la commande suivante crée une VM C3 avec quatre processeurs virtuels et un SSD local.

    gcloud compute instances create c3-ssd-test-instance \
        --machine-type "c3-standard-4-lssd"
    

    Pour les types de machines de deuxième génération et antérieurs, spécifiez le nombre de disques SSD locaux à associer à la VM à l'aide de l'option --local-ssd. La commande suivante crée une VM N2 avec huit processeurs virtuels et un SSD local qui utilise l'interface de disque NVMe:

    gcloud compute instances create ssd-test-instance \
        --machine-type "n2-standard-8" \
        --local-ssd interface=nvme
    
  2. Exécutez le script suivant sur votre VM. Ce script réplique les paramètres utilisés pour atteindre les niveaux de performance de disque SSD indiqués dans la section Performances. Notez que le paramètre --bs définit la taille de bloc, laquelle a une incidence sur les résultats pour les différents types d'opérations de lecture et d'écriture.

    # install tools
    sudo apt-get -y update
    sudo apt-get install -y fio util-linux
    
    # discard Local SSD sectors
    sudo blkdiscard /dev/disk/by-id/google-local-nvme-ssd-0
    
    # full write pass - measures write bandwidth with 1M blocksize
    sudo fio --name=writefile \
    --filename=/dev/disk/by-id/google-local-nvme-ssd-0 --bs=1M --nrfiles=1 \
    --direct=1 --sync=0 --randrepeat=0 --rw=write --end_fsync=1 \
    --iodepth=128 --ioengine=libaio
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --time_based --name=readbenchmark --runtime=30 --ioengine=libaio \
    --filename=/dev/disk/by-id/google-local-nvme-ssd-0  --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randread --blocksize=4k --group_reporting
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --time_based --name=writebenchmark  --runtime=30 --ioengine=libaio \
    --filename=/dev/disk/by-id/google-local-nvme-ssd-0 --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randwrite --blocksize=4k --group_reporting
    

Créer une VM avec le nombre maximal de disques SSD locaux

  1. Si vous souhaitez associer 24 disques SSD locaux ou plus à une instance, utilisez un type de machine avec au moins 32 processeurs virtuels.

    Les commandes suivantes créent une VM avec le nombre maximal autorisé de disques SSD locaux à l'aide de l'interface NVMe :

    Associer un disque SSD local à une VM

    gcloud compute instances create ssd-test-instance \
        --machine-type "n1-standard-32" \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme
    

    Utiliser les types de machines -lssd

    Les séries de machines les plus récentes proposent des types de machines -lssd dotés d'un nombre prédéterminé de disques SSD locaux. Par exemple, pour évaluer les performances d'une VM dotée de 32 SSD locaux (capacité de 12 Tio), exécutez la commande suivante :

    gcloud compute instances create ssd-test-instance \
        --machine-type "c3-standard-176-lssd"
    
  2. Installer l'outil mdadm. Le processus d'installation de mdadm inclut une invite utilisateur qui interrompt les scripts. Vous devez donc exécuter ce processus manuellement :

    Debian et Ubuntu

    sudo apt update && sudo apt install mdadm --no-install-recommends
    

    CentOS et RHEL

    sudo yum install mdadm -y
    

    SLES et openSUSE

    sudo zypper install -y mdadm
    
  3. Exécutez la commande find pour identifier tous les disques SSD locaux que vous souhaitez installer ensemble :

    find /dev/ | grep google-local-nvme-ssd
    

    La sortie ressemble à ceci :

    /dev/disk/by-id/google-local-nvme-ssd-23
    /dev/disk/by-id/google-local-nvme-ssd-22
    /dev/disk/by-id/google-local-nvme-ssd-21
    /dev/disk/by-id/google-local-nvme-ssd-20
    /dev/disk/by-id/google-local-nvme-ssd-19
    /dev/disk/by-id/google-local-nvme-ssd-18
    /dev/disk/by-id/google-local-nvme-ssd-17
    /dev/disk/by-id/google-local-nvme-ssd-16
    /dev/disk/by-id/google-local-nvme-ssd-15
    /dev/disk/by-id/google-local-nvme-ssd-14
    /dev/disk/by-id/google-local-nvme-ssd-13
    /dev/disk/by-id/google-local-nvme-ssd-12
    /dev/disk/by-id/google-local-nvme-ssd-11
    /dev/disk/by-id/google-local-nvme-ssd-10
    /dev/disk/by-id/google-local-nvme-ssd-9
    /dev/disk/by-id/google-local-nvme-ssd-8
    /dev/disk/by-id/google-local-nvme-ssd-7
    /dev/disk/by-id/google-local-nvme-ssd-6
    /dev/disk/by-id/google-local-nvme-ssd-5
    /dev/disk/by-id/google-local-nvme-ssd-4
    /dev/disk/by-id/google-local-nvme-ssd-3
    /dev/disk/by-id/google-local-nvme-ssd-2
    /dev/disk/by-id/google-local-nvme-ssd-1
    /dev/disk/by-id/google-local-nvme-ssd-0
    

    find ne garantit pas d'ordre particulier. Ce n'est pas un problème si les disques sont répertoriés dans un ordre différent, à condition que le nombre de lignes de sortie corresponde au nombre attendu de partitions SSD.

    Si vous utilisez des appareils SCSI, utilisez la commande find suivante :

    find /dev/ | grep google-local-ssd
    

    Les appareils NVMe doivent tous être au format google-local-nvme-ssd-#, et les appareils SCSI doivent tous être au format google-local-ssd-#.

  4. Utilisez l'outil mdadm pour combiner plusieurs disques SSD locaux dans une baie unique nommée /dev/md0. Dans l'exemple suivant, vous fusionnez 24 disques SSD locaux qui utilisent l'interface NVMe. Pour les disques SSD locaux qui utilisent SCSI, utilisez les noms renvoyés par la commande find à l'étape 3.

    sudo mdadm --create /dev/md0 --level=0 --raid-devices=24 \
    /dev/disk/by-id/google-local-nvme-ssd-0 \
    /dev/disk/by-id/google-local-nvme-ssd-1 \
    /dev/disk/by-id/google-local-nvme-ssd-2 \
    /dev/disk/by-id/google-local-nvme-ssd-3 \
    /dev/disk/by-id/google-local-nvme-ssd-4 \
    /dev/disk/by-id/google-local-nvme-ssd-5 \
    /dev/disk/by-id/google-local-nvme-ssd-6 \
    /dev/disk/by-id/google-local-nvme-ssd-7 \
    /dev/disk/by-id/google-local-nvme-ssd-8 \
    /dev/disk/by-id/google-local-nvme-ssd-9 \
    /dev/disk/by-id/google-local-nvme-ssd-10 \
    /dev/disk/by-id/google-local-nvme-ssd-11 \
    /dev/disk/by-id/google-local-nvme-ssd-12 \
    /dev/disk/by-id/google-local-nvme-ssd-13 \
    /dev/disk/by-id/google-local-nvme-ssd-14 \
    /dev/disk/by-id/google-local-nvme-ssd-15 \
    /dev/disk/by-id/google-local-nvme-ssd-16 \
    /dev/disk/by-id/google-local-nvme-ssd-17 \
    /dev/disk/by-id/google-local-nvme-ssd-18 \
    /dev/disk/by-id/google-local-nvme-ssd-19 \
    /dev/disk/by-id/google-local-nvme-ssd-20 \
    /dev/disk/by-id/google-local-nvme-ssd-21 \
    /dev/disk/by-id/google-local-nvme-ssd-22 \
    /dev/disk/by-id/google-local-nvme-ssd-23
    

    La réponse est semblable à ce qui suit :

    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md0 started.
    

    Vous pouvez confirmer les détails du tableau avec mdadm --detail. L'ajout de l'option --prefer=by-id permet de répertorier les appareils à l'aide des chemins /dev/disk/by-id.

     sudo mdadm --detail --prefer=by-id /dev/md0
    

    La sortie doit ressembler à ce qui suit pour chaque appareil du tableau.

     ...
     Number   Major   Minor   RaidDevice State
     0     259        0        0      active sync   /dev/disk/by-id/google-local-nvme-ssd-0
     ...
    
  5. Exécutez le script suivant sur votre VM. Ce script réplique les paramètres utilisés pour atteindre les niveaux de performance de disque SSD indiqués dans la section Performances. Notez que le paramètre --bs définit la taille de bloc, laquelle a une incidence sur les résultats pour les différents types d'opérations de lecture et d'écriture.

    # install tools
    sudo apt-get -y update
    sudo apt-get install -y fio util-linux
    
    # full write pass - measures write bandwidth with 1M blocksize
    sudo fio --name=writefile \
    --filename=/dev/md0 --bs=1M --nrfiles=1 \
    --direct=1 --sync=0 --randrepeat=0 --rw=write --end_fsync=1 \
    --iodepth=128 --ioengine=libaio
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --time_based --name=benchmark  --runtime=30 \
    --filename=/dev/md0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=32 --rw=randread --blocksize=4k --group_reporting --norandommap
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --time_based --name=benchmark  --runtime=30 \
    --filename=/dev/md0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=32 --rw=randwrite --blocksize=4k --group_reporting --norandommap
    

Effectuer une analyse comparative des VM optimisées pour le stockage

  1. Les VM optimisées pour le stockage (telles que la famille Z3) doivent être comparées directement aux partitions d'appareils. Vous pouvez obtenir les noms de partition avec la commande lsblk.

    lsblk -o name,size -lpn | grep 2.9T | awk '{print $1}'
    

    La sortie ressemble à ceci :

    /dev/nvme1n1
    /dev/nvme2n1
    /dev/nvme3n1
    /dev/nvme4n1
    /dev/nvme5n1
    /dev/nvme6n1
    /dev/nvme7n1
    /dev/nvme8n1
    /dev/nvme9n1
    /dev/nvme10n1
    /dev/nvme11n1
    /dev/nvme12n1
    
  2. Exécutez directement les analyses comparatives sur les partitions des disques SSD locaux en les séparant par des délimiteurs de deux-points.

    # install benchmarking tools
    sudo apt-get -y update
    sudo apt-get install -y fio util-linux
    
    # Full Write Pass.
    # SOVM achieves max read performance on previously written/discarded ranges.
    sudo  fio --readwrite=write --blocksize=1m --iodepth=4 --ioengine=libaio \
    --direct=1 --group_reporting \
    --name=job1 --filename=/dev/nvme1n1 --name=job2 --filename=/dev/nvme2n1 \
    --name=job3 --filename=/dev/nvme3n1 --name=job4 --filename=/dev/nvme4n1 \
    --name=job5 --filename=/dev/nvme5n1 --name=job6 --filename=/dev/nvme6n1 \
    --name=job7 --filename=/dev/nvme7n1 --name=job8 --filename=/dev/nvme8n1 \
    --name=job9 --filename=/dev/nvme9n1 --name=job10 --filename=/dev/nvme10n1 \
    --name=job11  --filename=/dev/nvme11n1 --name=job12 --filename=/dev/nvme12n1
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --readwrite=randread --blocksize=4k --iodepth=128  \
    --numjobs=4 --direct=1 --runtime=30 --group_reporting  --ioengine=libaio \
    --name=job1 --filename=/dev/nvme1n1 --name=job2 --filename=/dev/nvme2n1 \
    --name=job3 --filename=/dev/nvme3n1 --name=job4 --filename=/dev/nvme4n1 \
    --name=job5 --filename=/dev/nvme5n1 --name=job6 --filename=/dev/nvme6n1 \
    --name=job7 --filename=/dev/nvme7n1 --name=job8 --filename=/dev/nvme8n1 \
    --name=job9 --filename=/dev/nvme9n1 --name=job10 --filename=/dev/nvme10n1 \
    --name=job11  --filename=/dev/nvme11n1 --name=job12 --filename=/dev/nvme12n1
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --readwrite=randwrite --blocksize=4k --iodepth=128 \
    --numjobs=4 --direct=1 --runtime=30 --group_reporting --ioengine=libaio \
    --name=job1 --filename=/dev/nvme1n1 --name=job2 --filename=/dev/nvme2n1 \
    --name=job3 --filename=/dev/nvme3n1 --name=job4 --filename=/dev/nvme4n1 \
    --name=job5 --filename=/dev/nvme5n1 --name=job6 --filename=/dev/nvme6n1 \
    --name=job7 --filename=/dev/nvme7n1 --name=job8 --filename=/dev/nvme8n1 \
    --name=job9 --filename=/dev/nvme9n1 --name=job10 --filename=/dev/nvme10n1 \
    --name=job11  --filename=/dev/nvme11n1 --name=job12 --filename=/dev/nvme12n1
    

Étapes suivantes