Esegui il benchmark delle prestazioni del disco permanente su una VM Linux

Questo documento descrive come eseguire il benchmark delle prestazioni del disco permanente sulle macchine virtuali (VM) Linux. Per le VM Windows, vedi Esegui il benchmark delle prestazioni del disco permanente su una VM Windows.

Per eseguire il benchmark delle prestazioni del Persistent Disk su Linux, utilizza Flexible I/O tester (FIO) al posto di altri strumenti di benchmarking del disco come dd. Per impostazione predefinita, dd utilizza una profondità di coda di I/O molto bassa e potrebbe non testare con precisione le prestazioni del disco. In generale, evita di utilizzare dispositivi speciali come /dev/urandom, /dev/random e /dev/zero nei benchmark delle prestazioni di Persistent Disk.

Per misurare le IOPS e il throughput di un disco in uso su un'istanza in esecuzione, esegui il benchmark del file system con la configurazione prevista. Utilizza questa opzione per testare un workload 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 legati all'ambiente di sviluppo che possono influire sui risultati del benchmarking. Quindi potresti non raggiungere i limiti di prestazioni del disco.

Per misurare le prestazioni non elaborate di un disco permanente, esegui il benchmark direttamente sul dispositivo a blocchi. Utilizza questa opzione per confrontare le prestazioni del disco non formattato con i limiti di prestazioni del disco.

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

Benchmarking delle IOPS e del throughput di un disco su un'istanza in esecuzione

Se vuoi misurare le IOPS e il throughput per un workload realistico su un disco attivo di un'istanza in esecuzione senza perdere i contenuti del disco, esegui il benchmark rispetto a una nuova directory sul file system esistente. Ogni test fio viene eseguito per cinque minuti.

  1. Connettiti all'istanza.

  2. Installa le dipendenze:

    sudo apt update
    sudo apt install -y fio
    
  3. Nel terminale crea un elenco dei dischi collegati alla VM e trova il disco che vuoi testare. Se il disco permanente non è ancora formattato, formatta e monta il disco.

    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
    

    In questo esempio, testiamo un disco permanente SSD da 2500 GB con ID dispositivo sdb.

  4. Crea una nuova directory, fiotest, sul disco. In questo esempio, il disco è montato su /mnt/disks/mnt_dir:

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  5. Testa il throughput di scrittura eseguendo scritture sequenziali con più stream paralleli (più di 16), utilizzando una dimensione dei blocchi di I/O di 1 MB e una profondità di I/O di almeno 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. Testa le IOPS di scrittura eseguendo scritture casuali, utilizzando una dimensione dei blocchi di I/O di 4 KB e una profondità di I/O di almeno 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. Testa il throughput di lettura eseguendo letture sequenziali con più stream paralleli (più di 16), utilizzando una dimensione dei blocchi di I/O di 1 MB e una profondità di I/O di almeno 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. Testa le IOPS di lettura eseguendo letture casuali, utilizzando una dimensione dei blocchi di I/O di 4 KB e una profondità di I/O di almeno 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. Esegui la pulizia:

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

Benchmarking delle prestazioni non elaborate del disco permanente

Se vuoi misurare le prestazioni dei dischi permanenti da soli al di fuori del tuo ambiente di sviluppo, testa le prestazioni di lettura e scrittura di un dispositivo a blocchi su un disco permanente e una VM usa e getta. Ogni test fio dura cinque minuti. Per i comandi seguenti è richiesto un disco permanente SSD da 2500 GB collegato alla VM. Se le dimensioni del dispositivo sono diverse, modifica il valore dell'argomento --filesize. Queste dimensioni di disco sono necessarie per raggiungere i limiti di throughput delle VM con 32 vCPU. Per maggiori informazioni, vedi Prestazioni dell'archiviazione a blocchi.

  1. Crea e avvia un'istanza VM.

  2. Aggiungi un Persistent Disk all'istanza VM che intendi sottoporre a benchmark.

  3. Connettiti all'istanza.

  4. Installa le dipendenze:

    sudo apt-get update
    sudo apt-get install -y fio
    
  5. Riempi il disco con dati diversi da zero. Le letture di Persistent Disk di 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 attività di benchmarking della 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=/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
    
  6. Testa la larghezza di banda di scrittura eseguendo scritture sequenziali con più stream paralleli (più di 16), utilizzando 1 MB come dimensione di I/O e una profondità di I/O maggiore o uguale a 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
    
  7. Testa le IOPS di scrittura. Per ottenere il massimo dalle IOPS del disco permanente, devi mantenere una profondità della coda di I/O elevata. Se, ad esempio, la latenza di scrittura è di 1 millisecondo, la VM può raggiungere al massimo 1000 IOPS per ogni I/O in esecuzione. Per raggiungere 15.000 IOPS in scrittura, la VM deve mantenere in esecuzione almeno 15 operazioni di I/O. Se il disco e la VM sono in grado di raggiungere 30.000 IOPS in scrittura, il numero di I/O in esecuzione deve essere almeno 30. Se le dimensioni di I/O sono superiori a 4 KB, la VM potrebbe raggiungere il limite di larghezza di banda prima del limite di 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
    
  8. Testa la latenza di scrittura. Durante il test della latenza di I/O, la VM non deve raggiungere la larghezza di banda o le IOPS massime; altrimenti, la latenza osservata non rifletterà la latenza di I/O effettiva del disco permanente. Ad esempio, se il limite di IOPS viene raggiunto a una profondità di I/O di 30 e il comando fio ha raddoppiato questo valore, le IOPS totali rimangono invariate e la latenza di I/O registrata raddoppia.

    # 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
    
  9. Testa la larghezza di banda di lettura eseguendo letture sequenziali con più stream paralleli (più di 16), utilizzando 1 MB come dimensione di I/O e una profondità di I/O di almeno 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
    
  10. Testa le IOPS di lettura. Per raggiungere le IOPS massime del disco permanente, devi mantenere una profondità della coda di I/O elevata. Ad esempio, se le dimensioni di I/O sono superiori a 4 KB, la VM potrebbe raggiungere il limite di larghezza di banda prima del limite di IOPS. Per ottenere le IOPS di lettura massime di 100.000, specifica --iodepth=256 per questo 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
    
  11. Testa la latenza di lettura. È importante riempire il disco con dei dati per ottenere una misurazione realistica della latenza. È importante che la VM non raggiunga i limiti di IOPS o throughput durante il test perché, una volta che il disco permanente ha raggiunto il limite di saturazione, respinge le operazioni di I/O in entrata e ciò si riflette in un aumento artificiale della latenza di I/O.

    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
    
  12. Testa la larghezza di banda di lettura sequenziale.

    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
    
  13. Testa la larghezza di banda di scrittura sequenziale.

    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
    
  14. Pulisci il Persistent Disk e la VM temporanei:

    1. Elimina il disco utilizzato per il benchmarking delle prestazioni.
    2. Elimina la VM creata per il benchmarking delle prestazioni.

Passaggi successivi