Benchmarking der lokalen SSD-Leistung


Die im Abschnitt Speicheroption auswählen angegebenen Leistungsgrenzen für die lokale SSD wurden mit spezifischen Einstellungen auf der lokalen SSD-Instanz erreicht. Wenn Ihre VM-Instanz (virtuelle Maschine) Schwierigkeiten hat, diese Leistungsgrenzen zu erreichen, und Sie die Instanz mit den empfohlenen Einstellungen für die lokale SSD bereits konfiguriert haben, können Sie Ihre Leistungsgrenzen mit den veröffentlichten Grenzen vergleichen. Replizieren Sie dazu die Einstellungen, die das Compute Engine-Team verwendet hat.

In dieser Anleitung wird davon ausgegangen, dass Sie ein Linux-Betriebssystem verwenden, auf dem der Paketmanager apt installiert ist.

VM mit einem lokalen SSD-Gerät erstellen

Die Anzahl der lokalen SSDs, die eine VM haben kann, basiert auf dem Maschinentyp, den Sie zum Erstellen der VM verwenden. Weitere Informationen finden Sie unter Gültige Anzahl lokaler SSDs auswählen.

  1. Erstellen Sie je nach Arbeitslast eine lokale SSD-Instanz mit 4 oder 8 vCPUs pro Gerät.

    Mit dem folgenden Befehl wird beispielsweise eine C3-VM mit 4 vCPUs und einer lokalen SSD erstellt.

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

    Bei Maschinentypen der zweiten Generation und frühere Maschinentypen geben Sie die Anzahl der lokalen SSD mit dem Flag --local-ssd an, die an die VM angehängt werden soll. Mit dem folgenden Befehl wird eine N2-VM mit 8 vCPUs und 1 lokalen SSD erstellt, die die NVMe-Laufwerkschnittstelle verwendet:

    gcloud compute instances create ssd-test-instance \
        --machine-type "n2-standard-8" \
        --local-ssd interface=nvme
    
  2. Führen Sie auf Ihrer VM das folgende Script aus. Das Skript repliziert die Einstellungen, mit denen Sie die im Bereich "Leistung" angegebenen Leistungszahlen für die SSD erzielen. Der Parameter --bs definiert die Blockgröße, die die Ergebnisse für verschiedene Arten von Lese- und Schreibvorgängen beeinflusst.

    # 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
    

VM mit der maximalen Anzahl lokaler SSDs erstellen

  1. Wenn Sie einer Instanz mehr als 24 lokale SSD-Geräte hinzufügen möchten, verwenden Sie einen Maschinentyp mit 32 oder mehr vCPUs.

    Mit den folgenden Befehlen erstellen Sie eine VM mit der maximal zulässigen Anzahl von lokalen SSD-Laufwerken über die NVMe-Schnittstelle:

    Lokale SSD an VM anhängen

    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
    

    -lssd-Maschinentypen verwenden

    Neuere Maschinenserien bieten -lssd-Maschinentypen mit einer vordefinierten Anzahl lokaler SSD-Laufwerke. Verwenden Sie beispielsweise den folgenden Befehl, um eine VM mit 32 lokalen SSDs (Kapazität 12 TiB) zu erstellen:

    gcloud compute instances create ssd-test-instance \
        --machine-type "c3-standard-176-lssd"
    
  2. Sie haben das mdadm-Tool installiert. Der Installationsprozess für mdadm enthält eine Eingabeaufforderung, mit der Skripts angehalten werden. Führen Sie den Prozess daher manuell aus.

    Debian und Ubuntu

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

    CentOS und RHEL:

    sudo yum install mdadm -y
    

    SLES und openSUSE:

    sudo zypper install -y mdadm
    
  3. Verwenden Sie den Befehl find, um alle lokalen SSDs zu identifizieren, die zusammen bereitgestellt werden sollen.

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

    Die Ausgabe sieht dann ungefähr so aus:

    /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 garantiert keine Reihenfolge. Die Geräte können auch in einer anderen Reihenfolge aufgelistet werden, solange die Anzahl der Ausgabezeilen der erwarteten Anzahl von SSD-Partitionen entspricht.

    Wenn Sie SCSI-Geräte verwenden, führen Sie den folgenden find-Befehl aus:

    find /dev/ | grep google-local-ssd
    

    NVMe-Geräte sollten alle das Format google-local-nvme-ssd-# und SCSI-Geräte das Format google-local-ssd-# haben.

  4. Verwenden Sie das mdadm-Tool, um mehrere lokale SSD-Geräte zu einem einzigen Array namens /dev/md0 zu kombinieren. Im folgenden Beispiel werden 24 lokale SSD-Geräte zusammengeführt, die die NVMe-Schnittstelle verwenden. Verwenden Sie für lokale SSD-Geräte, die SCSI verwenden, die Gerätenamen, die vom Befehl find in Schritt 3 zurückgegeben wurden.

    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
    

    Die Antwort ähnelt dem folgenden Beispiel:

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

    Sie können die Details des Arrays mit mdadm --detail bestätigen. Wenn Sie das Flag --prefer=by-id hinzufügen, werden die Geräte über die Pfade /dev/disk/by-id aufgelistet.

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

    Die Ausgabe für jedes Gerät im Array sollte in etwa so aussehen:

     ...
     Number   Major   Minor   RaidDevice State
     0     259        0        0      active sync   /dev/disk/by-id/google-local-nvme-ssd-0
     ...
    
  5. Führen Sie auf Ihrer VM das folgende Script aus. Das Script repliziert die Einstellungen, mit denen Sie die im Bereich "Leistung" angegebenen Leistungszahlen für die SSD erzielen. Der Parameter --bs definiert die Blockgröße, die die Ergebnisse für verschiedene Arten von Lese- und Schreibvorgängen beeinflusst.

    # 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
    

Benchmarking von speicheroptimierten VMs

  1. Speicheroptimierte VMs (wie die Z3-Familie) sollten direkt mit den Gerätepartitionen verglichen werden. Sie können die Partitionsnamen mit lsblk abrufen.

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

    Die Ausgabe sieht dann ungefähr so aus:

    /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. Führen Sie die Benchmarks direkt für die lokalen SSD-Partitionen aus. Trennen Sie sie dazu durch Doppelpunkte als Trennzeichen.

    # 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
    

Nächste Schritte