Confronta le prestazioni di Hyperdisk

Per confrontare le prestazioni di Hypeperdisk, utilizza Tester I/O flessibile (FIO) anziché altri strumenti di benchmarking del disco come dd. Per impostazione predefinita, dd utilizza una profondità di coda I/O molto bassa, perciò è difficile assicurarsi che il benchmark generi un numero sufficiente di byte e operazioni di I/O per testare accuratamente le prestazioni del disco.

Inoltre, i dispositivi speciali utilizzati con dd sono spesso molto lenti e non riflettono in modo accurato le prestazioni del disco. In generale, evita di utilizzare dispositivi speciali come /dev/urandom, /dev/random e /dev/zero nei tuoi benchmark delle prestazioni di Hyperdisk.

Per misurare il numero di IOPS e la velocità effettiva di un disco in uso su un'istanza in esecuzione, esegui il markup del file system con la configurazione prevista. Utilizza questa opzione per testare un carico di lavoro realistico senza perdere i contenuti del disco esistente. Tieni presente che quando esegui il benchmark del file system su un disco esistente, ci sono molti fattori specifici del tuo ambiente di sviluppo che possono influire sui risultati del benchmarking e potresti non raggiungere i limiti delle prestazioni del disco.

Per misurare le prestazioni non elaborate di un Hyperdisk, effettua il benchmark direttamente del dispositivo a blocchi. Utilizza questa opzione per confrontare le prestazioni non elaborate del disco con i limiti delle prestazioni del disco.

I seguenti comandi funzionano con i sistemi operativi Debian o Ubuntu con il gestore di pacchetti apt.

Benchmarking di IOPS e velocità effettiva di un disco su un'istanza in esecuzione

Se vuoi misurare IOPS e velocità effettiva per un carico di lavoro realistico su un disco attivo su un'istanza VM in esecuzione senza perdere i contenuti del disco, applica il benchmark a una nuova directory sul file system esistente.

Preparati per i test

  1. Connettiti all'istanza.

  2. Installa le dipendenze:

    sudo apt update
    sudo apt install -y fio
    
  3. Se la formattazione dell'Hyperdisk non è ancora stata completata, formatta e monta il disco.

  4. Nel terminale, elenca i dischi collegati alla tua VM e trova quello che vuoi testare.

    sudo lsblk
    

    Il comando precedente produce un output simile al seguente:

    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
    

    In questo esempio, stiamo testando un volume Hyperdisk Extreme da 3500 GiB con il nome del dispositivo nvme0n2.

  5. Crea una nuova directory, fiotest, sul disco. In questo esempio, il disco viene montato in /mnt/disks/mnt_dir:

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  6. Se la VM utilizza l'interfaccia disco NVMe per il collegamento Hyperdisk (se il nome del disco non elaborato è preceduto da nvme), segui questi passaggi per ottenere il numero di nodi NUMA disponibili per la VM.

    La strategia di benchmarking per i dischi NVMe è diversa per le VM con un solo nodo NUMA e per le VM con più di un nodo NUMA. Durante il test delle prestazioni di Hyperdisk utilizzando l'interfaccia del disco NVMe, vengono allocate solo 256 dimensioni di code NVMe per ogni coda. A causa delle dimensioni limitate delle code NVMe disponibili e della potenziale contesa proveniente dagli altri dischi collegati alla stessa VM, questi test di benchmark utilizzano due code di disco NVMe per mantenere una dimensione aggregata della coda in grado di gestire la ioprofondità di 256.

    1. Ottieni il numero di NUMA nodi.

      lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
      
    2. Se la VM ha un solo nodo NUMA, ottieni la mappatura della coda da CPU a NVMe. Userai queste informazioni in seguito per il parametro --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")
      

Test velocità effettiva di scrittura

Testa la velocità effettiva di scrittura eseguendo scritture sequenziali con più flussi paralleli (oltre 16), utilizzando una dimensione del blocco di I/O di 1 MB e una profondità di I/O di almeno 64.

  1. Se Hyperdisk utilizza l'interfaccia 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. Se Hyperdisk utilizza l'interfaccia NVMe:

    1. Se la VM ha un solo nodo NUMA, utilizza il seguente comando:

      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. Se la VM ha più di un nodo NUMA, utilizza il seguente comando:

      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
      

Test IOPS di scrittura

Testa le IOPS di scrittura eseguendo scritture casuali, utilizzando una dimensione del blocco di I/O di 4 kB e una profondità di I/O di almeno 256.

  1. Se l'Hyperdisk è collegato tramite l'interfaccia 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. Se Hyperdisk utilizza l'interfaccia NVMe:

    1. Se la VM ha un solo nodo NUMA, utilizza il seguente comando:

      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. Se la VM ha più di un nodo NUMA, utilizza il seguente comando:

      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
      

Test velocità effettiva di lettura

Testa la velocità effettiva di lettura eseguendo letture sequenziali con più flussi paralleli (oltre 16), utilizzando una dimensione del blocco di I/O di 1 MB e una profondità di I/O di almeno 64.

  1. Se Hyperdisk utilizza l'interfaccia 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. Se Hyperdisk utilizza l'interfaccia NVMe:

    1. Se la VM ha un solo nodo NUMA, utilizza il seguente comando:

      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. Se la VM ha più di un nodo NUMA, utilizza il seguente comando:

      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
      

Test IOPS di lettura

Testa le IOPS di lettura con letture casuali, utilizzando una dimensione del blocco di I/O di 4 kB e una profondità di I/O di almeno 256.

  1. Se Hyperdisk utilizza l'interfaccia 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. Se Hyperdisk utilizza l'interfaccia NVMe:

    1. Se la VM ha un solo nodo NUMA, utilizza il seguente comando:

      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. Se la VM ha più di un nodo NUMA, utilizza il seguente comando:

      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
      

Esegui la pulizia

Rimuovi le directory di test.

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

Benchmarking di IOPS e velocità effettiva per Hyperdisk Extreme sulle VM C3

Google Cloud Hyperdisk Extreme offre prestazioni più elevate sulle VM C3 con 176 vCPU. Per raggiungere limiti di prestazioni più elevati, devi collegare più volumi Hyperdisk Extreme alla VM.

Per misurare I/O al secondo (IOPS) o la velocità effettiva per un carico di lavoro realistico su dischi attivi su una VM C3 in esecuzione senza perdere i contenuti dei dischi dati esistenti, esegui il confronto con una nuova directory sul file system esistente e collega i nuovi volumi Hyperdisk Extreme alla VM per le attività di benchmarking.

Per i dischi collegati con l'interfaccia NVMe, consigliamo di distribuire il carico di lavoro di I/O in tutte le code NVMe disponibili per la VM. Questo massimizza le prestazioni di Hyperdisk. Sulle VM C3 con 176 vCPU, ci sono quattro nodi NUMA mappati da 1 a 1 a quattro code NVMe. Questa mappatura viene utilizzata per i test di benchmark di questa sezione.

Preparati per i test

  1. Aggiungi nuovi dischi Hyperdisk Extreme alla tua VM e consulta i limiti delle prestazioni di Hyperdisk per ricavare la configurazione del disco necessaria per le prestazioni di destinazione.

  2. Connettiti all'istanza:

  3. Installa le dipendenze:

    sudo apt update
    sudo apt install -y fio
    
  4. Elenca i dischi collegati alla tua VM e trova quello che vuoi testare.

    sudo lsblk
    

    Il comando precedente produce un output simile al seguente:

    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
    

    In questo esempio, stiamo testando le prestazioni di Google Cloud Hyperdisk su tre volumi Hyperdisk da 2500 GiB con dispositivi denominati nvme0n2, nvme0n3 e nvme0n4.

Velocità effettiva benchmark di Hyperdisk Extreme su C3

Questa sezione mostra come confrontare la velocità effettiva di lettura e scrittura per i dischi Hypeperdisk Extreme.

Preparazione per i test

Prima di iniziare il benchmarking delle prestazioni dei dischi Hyperdisk Extreme collegati a una VM C3 con 176 vCPU, completa i seguenti passaggi.

  1. Crea una nuova directory, fiotest, nel tuo sistema operativo. In questo esempio, la directory root è /mnt/disks/mnt_dir:

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  2. Poiché la VM richiede più di un disco per raggiungere i massimi livelli di prestazioni, per semplicità, esegui RAID 0 su tutti i volumi Hypeperdisk collegati. che semplifica la distribuzione uniforme dei dati su più volumi Hyperdisk.

    In questo esempio, RAID 0 rappresenta le prestazioni su tre volumi Hyperdisk Extreme collegati alla VM C3.

    sudo mdadm --create /dev/md0 --level=0 --raid-devices=3 /dev/nvme0n2 /dev/nvme0n3 /dev/nvme0n4
    
  3. Formatta e monta il volume RAID /dev/md0.

Test velocità effettiva di scrittura

Testa la velocità effettiva di scrittura eseguendo scritture sequenziali con più flussi paralleli (almeno 16), utilizzando una dimensione del blocco I/O di 1 MiB e una profondità di I/O totale di almeno 32 per coda 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

Test velocità effettiva di lettura

Testa la velocità effettiva di lettura eseguendo letture sequenziali con più flussi paralleli (almeno 16), utilizzando una dimensione del blocco I/O di 1 MiB e una profondità di I/O totale di almeno 32 per coda 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

IOPS benchmark di Hyperdisk Extreme su C3

Per definire il benchmark per le prestazioni di I/O al secondo (IOPS), consigliamo di eseguire operazioni di I/O di piccole dimensioni parallele direttamente da o verso dischi non elaborati (senza RAID).

Test IOPS di scrittura

Testa le IOPS di scrittura eseguendo scritture casuali, utilizzando una dimensione del blocco I/O di 4 KiB e una profondità di I/O di almeno 256, utilizzando almeno 2 code 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

Test IOPS di lettura

Testa le IOPS di lettura eseguendo letture casuali con una dimensione del blocco I/O di 4 KiB e una profondità di I/O di almeno 256, utilizzando almeno 2 code 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

Latenza benchmark di Hyperdisk Extreme su C3

Durante il test della latenza I/O, la VM non deve raggiungere la larghezza di banda massima o il numero di IOPS. In caso affermativo, la latenza osservata non rifletterà la latenza effettiva di Hyperdisk I/O. Ad esempio, se la VM raggiunge il limite di IOPS a una profondità di I/O di 30 e il comando fio ha raddoppiato questo valore, il numero totale di IOPS rimane invariato e la latenza di I/O segnalata raddoppia.

È sufficiente scegliere come target un singolo dispositivo disco non elaborato per ottenere latenze di I/O realistiche.

Testa latenza di scrittura

Testa la latenza di scrittura eseguendo scritture casuali, utilizzando una dimensione del blocco I/O di 4 KiB e una profondità di I/O di 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

Testa latenza di lettura

Testa la latenza di lettura eseguendo letture casuali con una dimensione del blocco I/O di 4 KiB e una profondità di I/O pari a 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

Esegui la pulizia

  1. Rimuovi i file di test.

    sudo rm -rf $TEST_DIR/*
    
  2. Smonta e arresta il volume RAID.

    sudo umount /dev/md0
    sudo mdadm --stop /dev/md0
    
  3. Scollega ed elimina i volumi Hyperdisk collegati. Consulta i comandi gcloud compute instances detach-disk e gcloud compute disks delete.

Benchmarking delle prestazioni non elaborate di Hyperdisk

Se vuoi misurare solo le prestazioni dei volumi Hyperdisk al di fuori del tuo ambiente di sviluppo, puoi testare le prestazioni di lettura e scrittura per un dispositivo a blocchi su un disco usato e una VM.

I comandi seguenti presuppongono un volume Hyperdisk Extreme da 3500 GiB collegato alla tua VM. Questa dimensione del disco è necessaria per raggiungere i limiti di velocità effettiva delle VM vCPU. Se le dimensioni del dispositivo sono diverse, modifica il valore dell'argomento --filesize nei comandi seguenti. Per ulteriori informazioni sui limiti delle prestazioni per i tipi di macchine VM, consulta Supporto dei tipi di macchina.

Preparati per i test

  1. Connettiti all'istanza.

  2. Installa le dipendenze:

    sudo apt-get update
    sudo apt-get install -y fio
    
  3. Ottieni il percorso del disco non elaborato. Archivia il percorso in una variabile. Il seguente esempio utilizza /dev/nvme0n2 come percorso del disco non elaborato:

    TEST_DIR=/dev/nvme0n2
    
  4. Riempi il disco con dati diversi da zero. Le letture di Hyperdisk dai blocchi vuoti hanno un profilo di latenza diverso da quello dei blocchi che contengono dati. Ti consigliamo di riempire il disco prima di eseguire qualsiasi benchmark di latenza di lettura.

    # 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. Se la VM utilizza l'interfaccia disco NVMe per il collegamento Hyperdisk (se il nome del disco non elaborato è preceduto dal prefisso nvme), segui questi passaggi per ottenere il numero di nodi NUMA disponibili per la VM.

    La strategia di benchmarking per i dischi NVMe è diversa per le VM con un solo nodo NUMA e per le VM con più di un nodo NUMA. Durante il test delle prestazioni di Hyperdisk utilizzando l'interfaccia del disco NVMe, vengono allocate solo 256 dimensioni di code NVMe per ogni coda. A causa delle dimensioni limitate delle code NVMe disponibili e della potenziale contesa proveniente dagli altri dischi collegati alla stessa VM, questi test di benchmark utilizzano due code di disco NVMe per mantenere una dimensione di coda aggregata in grado di gestire la ioprofondità di 256.

    1. Ottieni il numero di NUMA nodi.

      lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
      
    2. Se la VM ha un solo nodo NUMA, ottieni la mappatura della coda da CPU a NVMe. Userai queste informazioni in seguito per il parametro --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")
      

Test velocità effettiva di scrittura

Testa la velocità effettiva di scrittura eseguendo scritture sequenziali con più flussi paralleli (oltre 16), utilizzando 1 MB come dimensione di I/O e con una profondità di I/O di almeno 64.

  1. Se l'Hyperdisk viene collegato tramite l'interfaccia 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. Se Hyperdisk utilizza l'interfaccia NVMe:

    1. Se la VM ha un solo nodo NUMA, utilizza il seguente comando:

      # 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. Se la VM ha più di un nodo NUMA, utilizza il seguente comando:

      # 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
      

Test IOPS di scrittura

Per raggiungere il numero massimo di IOPS Hyperdisk, devi mantenere una coda di I/O profonda. Se, ad esempio, la latenza di scrittura è di 1 millisecondo, la VM può raggiungere al massimo 1000 IOPS per ogni I/O in fase di pubblicazione. Per raggiungere 15.000 IOPS di scrittura, la VM deve mantenere almeno 15 operazioni di I/O in volo. Se il disco e la VM possono raggiungere 30.000 IOPS di scrittura, il numero di operazioni di I/O in esecuzione deve essere almeno 30. Se la dimensione di I/O è superiore a 4 kB, la VM potrebbe raggiungere il limite di larghezza di banda prima di raggiungere il limite di IOPS.

Testa le IOPS di scrittura eseguendo scritture casuali, utilizzando una dimensione del blocco di I/O di 4 kB e una profondità di I/O di almeno 256.

  1. Se il volume Hyperdisk Extreme è collegato tramite interfaccia 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. Se il volume Hyperdisk Extreme viene collegato utilizzando l'interfaccia NVMe:

    1. Se la VM ha un solo nodo NUMA, utilizza il seguente comando:

      # 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. Se la VM ha più di un nodo NUMA, utilizza il seguente comando:

      # 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
      

Testa latenza di scrittura

Durante il test della latenza di I/O, la VM non deve raggiungere la larghezza di banda massima o il numero massimo di IOPS; altrimenti, la latenza osservata non rifletterà la latenza effettiva di I/O di Hyperdisk. Ad esempio, se il limite di IOPS viene raggiunto a una profondità di I/O di 30 e il comando fio lo ha raddoppiato, il numero totale di IOPS rimane invariato e la latenza di I/O segnalata raddoppia.

# 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

Test larghezza di banda di lettura

Testa la larghezza di banda di lettura eseguendo letture sequenziali con più flussi paralleli (oltre 16), utilizzando una dimensione di I/O di 1 MB e una profondità di I/O di almeno 64.

  1. Se il volume Hyperdisk Extreme viene collegato tramite l'interfaccia 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. Se il volume Hyperdisk Extreme viene collegato utilizzando l'interfaccia NVMe:

    1. Se la VM ha un solo nodo NUMA, utilizza il seguente comando:

        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. Se la VM ha più di un nodo NUMA, utilizza il seguente comando:

        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

Test IOPS di lettura

Per raggiungere il numero massimo di IOPS Hyperdisk, devi mantenere una coda di I/O profonda. Se, ad esempio, la dimensione di I/O è superiore a 4 kB, la VM potrebbe raggiungere il limite di larghezza di banda prima di raggiungere il limite di IOPS. Per raggiungere il numero massimo di IOPS di lettura disponibile per un tipo di macchina, specifica --iodepth=256 per questo test.

  1. Se il volume Hyperdisk Extreme viene collegato tramite l'interfaccia 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. Se il volume Hyperdisk Extreme viene collegato utilizzando l'interfaccia NVMe:

    1. Se la VM ha un solo nodo NUMA, utilizza il seguente comando:

      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. Se la VM ha più di un nodo NUMA, utilizza il seguente comando:

      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
      

Testa latenza di lettura

È importante riempire il disco con dati per ottenere una misurazione realistica della latenza. È importante che la VM non raggiunga i limiti di IOPS o di velocità effettiva durante questo test perché, una volta che il volume di Hyperdisk raggiunge il limite di saturazione, respinge le operazioni di I/O in entrata. Questo respingimento è considerato come un aumento artificiale della latenza di I/O.

 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

Esegui la pulizia

Se hai utilizzato un disco usato e una VM come consigliato, dopo aver completato i test di benchmark, puoi:

  • Scollega ed elimina il disco.
  • Eliminare la VM.

Passaggi successivi