Benchmarking delle prestazioni delle SSD locali


I limiti delle prestazioni degli SSD locali forniti in Scegliere una sezione per le opzioni di archiviazione sono stati ottenuti usando impostazioni specifiche sull'istanza SSD locale. Se la tua istanza di macchina virtuale (VM) ha difficoltà a raggiungere questi limiti di prestazioni e l'hai già configurata utilizzando le impostazioni consigliate per le unità SSD locali, puoi confrontare i tuoi limiti di prestazioni con quelli pubblicati replicando le impostazioni utilizzate dal team di Compute Engine.

Queste istruzioni presuppongono che tu stia utilizzando un sistema operativo Linux con Gestore di pacchetti apt installato.

Creare una VM con un dispositivo SSD locale

Il numero di SSD locali che una VM può avere si basa sul tipo di macchina utilizzato per crearla. Per maggiori dettagli, vedi Scegli un numero valido di SSD locali.

  1. Crea un'istanza SSD locale con quattro o otto vCPU per ogni dispositivo, a seconda del carico di lavoro.

    Ad esempio, il seguente comando crea una VM C3 con 4 vCPU e 1 unità SSD locale.

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

    Per i tipi di macchine di seconda generazione e precedenti, specifica il numero di SSD locali da collegare alla VM utilizzando il flag --local-ssd. Le seguenti crea una VM N2 con 8 vCPU e 1 SSD locale che utilizza il disco NVMe dell'interfaccia:

    gcloud compute instances create ssd-test-instance \
        --machine-type "n2-standard-8" \
        --local-ssd interface=nvme
    
  2. Esegui lo script seguente sulla VM. Lo script replica le impostazioni utilizzate per ottenere i dati sulle prestazioni delle unità SSD forniti nella sezione sul rendimento. Nota definito dal parametro --bs la dimensione del blocco, che influisce sui risultati per diversi tipi di operazioni di scrittura.

    # 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
    

Creare una VM con il numero massimo di SSD locali

  1. Se vuoi collegare 24 o più dispositivi SSD locali a un'istanza, utilizza un tipo di macchina con almeno 32 vCPU.

    I comandi seguenti creano una VM con il numero massimo consentito di dischi SSD locali che utilizzano l'interfaccia NVMe:

    Collega SSD locale alla 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
    

    Utilizza tipi di macchina -lssd

    Le serie di macchine più recenti offrono -lssd tipi di macchina con un di dischi SSD locali. Ad esempio, per eseguire il benchmark di una VM con 32 unità SSD locali (capacità di 12 TiB), utilizza il seguente comando:

    gcloud compute instances create ssd-test-instance \
        --machine-type "c3-standard-176-lssd"
    
  2. Installa lo strumento mdadm. La procedura di installazione di mdadm include una richiesta all'utente che interrompe gli script, quindi esegui la procedura manualmente:

    Debian e Ubuntu

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

    CentOS e RHEL

    sudo yum install mdadm -y
    

    SLES e openSUSE

    sudo zypper install -y mdadm
    
  3. Utilizza il comando find per identificare tutte le unità SSD locali che vuoi montare insieme:

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

    L'output è simile al seguente:

    /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 non garantisce un ordine. Non è un problema se i dispositivi sono elencati in un ordine diverso, purché il numero di righe di output corrisponda al numero previsto di partizioni dell'unità SSD.

    Se utilizzi dispositivi SCSI, utilizza il seguente comando find:

    find /dev/ | grep google-local-ssd
    

    I dispositivi NVMe devono tutti avere il formato google-local-nvme-ssd-#, mentre i dispositivi SCSI devono essere tutti nel formato google-local-ssd-#.

  4. Utilizza lo strumento mdadm per combinare più dispositivi SSD locali in un singolo array denominato /dev/md0. L'esempio seguente unisce venti quattro dispositivi SSD locali che usano l'interfaccia NVMe. Per i dispositivi SSD locali che utilizzano SCSI, utilizza i nomi dei dispositivi restituiti dal comando find nel passaggio 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 risposta è simile alla seguente:

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

    Puoi verificare i dettagli dell'array con mdadm --detail. Aggiunta in corso... Il flag --prefer=by-id elencherà i dispositivi utilizzando i percorsi /dev/disk/by-id.

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

    L'output dovrebbe essere simile al seguente per ogni dispositivo nell'array.

     ...
     Number   Major   Minor   RaidDevice State
     0     259        0        0      active sync   /dev/disk/by-id/google-local-nvme-ssd-0
     ...
    
  5. Esegui lo script seguente sulla VM. Lo script replica le impostazioni utilizzati per ottenere i dati delle prestazioni SSD forniti sezione sul rendimento. definito dal parametro --bs la dimensione del blocco, che influisce sui risultati per diversi tipi di operazioni di scrittura.

    # 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
    

Benchmark delle VM ottimizzate per lo spazio di archiviazione

  1. Le VM ottimizzate per lo spazio di archiviazione (come la famiglia Z3) devono essere confrontate direttamente con le partizioni del dispositivo. Puoi ottenere i nomi delle partizioni con lsblk

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

    L'output è simile al seguente:

    /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. Esegui direttamente i benchmark sulle partizioni SSD locali separandoli con i delimitatori di due punti.

    # 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
    

Passaggi successivi