Benchmarking delle prestazioni dei dischi permanenti

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Per confrontare le prestazioni del disco permanente, utilizza FIO anziché altri strumenti di benchmarking del disco come dd. Per impostazione predefinita, dd utilizza una profondità di coda di I/O molto bassa, quindi è difficile garantire che il benchmark stia generando un numero sufficiente di I/O e byte per testare con precisione le prestazioni del disco.

Inoltre, i dispositivi speciali utilizzati con dd sono spesso molto lenti e non riflettono accuratamente le prestazioni del disco permanente. In generale, evita di utilizzare dispositivi speciali come /dev/urandom, /dev/random e /dev/zero nei benchmark di prestazioni permanenti dei dischi.

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

Per misurare le prestazioni non elaborate di un disco permanente, confronta direttamente il dispositivo con il blocco. Utilizza questa opzione per confrontare le prestazioni del disco non elaborato 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 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 in esecuzione senza perdere i contenuti del disco, confronta i dati con una nuova directory sul file system esistente.

  1. Connettiti alla tua istanza.

  2. Installa le dipendenze:

    sudo apt update
    sudo apt install -y fio
    
  3. Nel terminale, elenca i dischi collegati alla tua 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 dispositivo sdb.

  4. Crea una nuova directory sul disco (fiotest). In questo esempio, il disco è montato in /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ù flussi paralleli (più di 16), utilizzando una dimensione del blocco 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=60s --ramp_time=2s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
    --group_reporting=1
    
  6. Testa le IOPS di scrittura eseguendo scritture casuali, utilizzando una dimensione del blocco 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=60s --ramp_time=2s --ioengine=libaio --direct=1 \
    --verify=0 --bs=4K --iodepth=256 --rw=randwrite --group_reporting=1
    
  7. Testa la velocità effettiva di lettura eseguendo letture sequenziali con più flussi paralleli (oltre 16), utilizzando una dimensione del blocco 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=60s --ramp_time=2s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
    --group_reporting=1
    
  8. Testa le IOPS di lettura eseguendo letture casuali, utilizzando una dimensione del blocco 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=60s --ramp_time=2s --ioengine=libaio --direct=1 \
    --verify=0 --bs=4K --iodepth=256 --rw=randread --group_reporting=1
    
  9. Esegui la pulizia:

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

Benchmarking delle prestazioni del disco permanente non elaborato

Se vuoi misurare le prestazioni dei dischi permanenti da soli al di fuori dell'ambiente di sviluppo, testa le prestazioni di lettura e scrittura per un dispositivo a blocchi su una VM e un disco permanente permanente.

I comandi seguenti presuppongono un disco permanente SSD da 2500 GB collegato alla tua VM. Se le dimensioni del dispositivo sono diverse, modifica il valore dell'argomento --filesize. Questa dimensione del disco è necessaria per raggiungere i limiti di velocità effettiva delle VM di 32 vCPU. Per saperne di più, vedi Bloccare le prestazioni dello spazio di archiviazione.

  1. Connettiti alla tua istanza.

  2. Installa le dipendenze:

    sudo apt-get update
    sudo apt-get install -y fio
    
  3. 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 i 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=/dev/sdb --filesize=2500G \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=128K --iodepth=64 --rw=randwrite
    
  4. Testa la larghezza di banda di scrittura eseguendo scritture sequenziali con più flussi paralleli (più di 16), utilizzando 1 MB come dimensione di I/O e con 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=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=1M --iodepth=64 --rw=write --numjobs=16 --offset_increment=100G
    
  5. Test IOPS di scrittura. Per ottenere il massimo di IOPS di PD, 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 volo. Per raggiungere 15.000 IOPS di scrittura, la VM deve mantenere almeno 15 I/O in corso. Se il disco e la VM sono in grado di raggiungere 30.000 IOPS di scrittura, il numero di I/O in periodo di pubblicazione deve essere almeno 30 I/O. Se le dimensioni di I/O sono superiori a 4 kB, la VM potrebbe raggiungere il limite di larghezza di banda prima che raggiunga 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=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randwrite
    
  6. Testa la latenza di scrittura. Durante il test della latenza I/O, la VM non deve raggiungere la larghezza di banda massima o IOPS; in caso contrario, la latenza osservata non rifletterà la latenza I/O del disco permanente. Ad esempio, se il limite IOPS viene raggiunto a una profondità di I/O pari a 30 e il comando fio ha un valore doppio, il numero di IOPS totali 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 --name=write_latency_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randwrite
    
  7. Testa la larghezza di banda di lettura eseguendo letture sequenziali con più flussi paralleli (più di 16), utilizzando 1 MB come dimensione di I/O e con una profondità di I/O pari o superiore a 64.

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=1M --iodepth=64 --rw=read --numjobs=16 --offset_increment=100G
    
  8. Test IOPS di lettura. Per ottenere il numero massimo di IOPS di PD, devi mantenere una coda di I/O profonda. Se, ad esempio, le dimensioni di I/O sono superiori a 4 kB, la VM potrebbe raggiungere il limite di larghezza di banda prima che raggiunga il limite di IOPS. Per raggiungere il numero 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=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randread
    
  9. Testa la latenza di lettura. È importante riempire il disco di dati per ottenere una misurazione della latenza realistica. È importante che la VM non raggiunga i limiti di IOPS o di velocità effettiva durante questo test perché, dopo che il disco permanente ha raggiunto il limite di saturazione, viene eseguito il push su I/O in entrata 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=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randread
    
  10. Verifica la larghezza di banda di lettura sequenziale.

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --numjobs=4 --thread --offset_increment=500G \
      --bs=1M --iodepth=64 --rw=read
    
  11. Testare la larghezza di banda di scrittura sequenziale.

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

Passaggi successivi