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


Questo documento descrive come eseguire il benchmark delle prestazioni dei dischi permanenti su macchine virtuali (VM) Linux. Per le VM Windows, consulta Eseguire il benchmark delle prestazioni dei dischi permanenti su una VM Windows.

Per eseguire il benchmark delle prestazioni dei dischi permanenti su Linux, utilizza Flexible I/O tester (FIO) invece di altri strumenti di benchmarking dei dischi come dd. Per impostazione predefinita, dd utilizza una profondità della coda 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 sul rendimento di Persistent Disk.

Per misurare le IOPS e la velocità effettiva 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 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, esistono molti fattori specifici del tuo ambiente di sviluppo che possono influire sui risultati del benchmark e potresti non raggiungere i limiti di prestazioni del disco.

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

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

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

Se vuoi misurare le IOPS e il throughput per un carico di lavoro realistico su un disco attivo di un'istanza in esecuzione senza perdere i contenuti del disco, esegui un benchmark rispetto a una nuova directory nel 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, elenca i dischi collegati alla VM e trova il disco che vuoi testare. Se il disco permanente non è ancora formattato, formattalo e montalo.

    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 dispositivosdb.

  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 la velocità effettiva di scrittura eseguendo scritture sequenziali con più stream paralleli (almeno 16), utilizzando una dimensione del blocco I/O di 1 MB e una profondità 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 in scrittura eseguendo scritture casuali, utilizzando una dimensione del blocco I/O di 4 KB e una profondità 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 la velocità effettiva di lettura eseguendo letture sequenziali con più stream paralleli (almeno 16), utilizzando una dimensione del blocco I/O di 1 MB e una profondità 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 del blocco I/O di 4 KB e una profondità 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. Pulizia:

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

Benchmarking delle prestazioni dei dischi permanenti non elaborati

Se vuoi misurare le prestazioni dei soli dischi permanenti 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 viene eseguito per cinque minuti. I comandi seguenti presuppongono 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 del disco sono necessarie per raggiungere i limiti di throughput delle VM con 32 vCPU. Per ulteriori informazioni, consulta Rendimento dello spazio di archiviazione a blocchi.

  1. Crea e avvia un'istanza VM.

  2. Aggiungi un disco permanente all'istanza VM di cui vuoi eseguire il 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 del disco permanente da 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 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 in scrittura eseguendo scritture sequenziali con più stream paralleli (almeno 16), utilizzando 1 MB come dimensione I/O e una profondità 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 delle IOPS del PD, devi mantenere una coda I/O profonda. Ad esempio, se 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 almeno 15 I/O in esecuzione. 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 di almeno 30. Se le dimensioni di I/O sono superiori a 4 KB, la VM potrebbe raggiungere il limite di larghezza di banda prima di raggiungere il 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 I/O, la VM non deve raggiungere la larghezza di banda o le IOPS massime; in caso contrario, la latenza osservata non rifletterà la latenza I/O effettiva del disco persistente. Ad esempio, se il limite di IOPS viene raggiunto con una profondità I/O di 30 e il comando fio ha il doppio, le IOPS totali rimangono invariate e la latenza 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 in lettura eseguendo letture sequenziali con più stream paralleli (almeno 16), utilizzando 1 MB come dimensione I/O e una profondità I/O uguale o superiore a 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 ottenere il numero massimo di IOPS del PD, devi mantenere una coda I/O profonda. Ad esempio, se le dimensioni di I/O sono superiori a 4 KB, la VM potrebbe raggiungere il limite di larghezza di banda prima di raggiungere il limite di IOPS. Per ottenere il massimo di 100.000 IOPS di lettura, 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 dati per ottenere una misurazione della latenza realistica. È importante che la VM non raggiunga i limiti di IOPS o di throughput durante questo test perché, dopo che il disco persistente raggiunge il limite di saturazione, restituisce le I/O in arrivo e questo si riflette come un aumento artificiale della latenza 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. Elimina il disco permanente e la VM usa e getta:

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

Passaggi successivi