Benchmarking der Hyperdisk-Leistung


Verwenden Sie für das Benchmarking der Hyperdisk-Leistung den Flexiblen E/A-Tester (FIO) anstelle anderer Benchmarking-Tools für Laufwerke wie dd. Standardmäßig verwendet dd eine sehr niedrige E/A-Warteschlangentiefe. Daher ist es schwierig sicherzustellen, dass die Benchmark eine ausreichende Anzahl von Byte und E/A-Vorgängen generiert, um die Laufwerksleistung genau zu testen.

Außerdem sind spezielle Geräte, die mit dd verwendet werden, oft sehr langsam und spiegeln die Speicherleistung nicht genau wider. Vermeiden Sie im Allgemeinen die Verwendung spezieller Geräte wie /dev/urandom, /dev/random und /dev/zero in Ihren Hyperdisk-Leistungsbenchmarks.

Zum Messen von IOPS und Durchsatz eines Laufwerks, das auf einer laufenden Instanz verwendet wird, führen Sie ein Benchmarking des Dateisystems mit der gewünschten Konfiguration durch. Mit dieser Option können Sie eine realistische Arbeitslast testen, ohne den Inhalt des vorhandenen Laufwerks zu verlieren. Beachten Sie, dass beim Benchmarking des Dateisystems auf einem vorhandenen Laufwerk viele für Ihre Entwicklungsumgebung spezifische Faktoren die Benchmarking-Ergebnisse beeinflussen können und die Leistungsgrenzen des Laufwerks möglicherweise nicht erreicht werden.

Zum Messen der Rohleistung einer Hyperdisk führen Sie ein direktes Benchmarking des blockorientierten Geräts durch. Verwenden Sie diese Option, um die reine Leistung der Festplatte mit den Leistungsgrenzen der Festplatte zu vergleichen.

Die folgenden Befehle funktionieren auf Debian- oder Ubuntu-Betriebssystemen mit dem Paketmanager apt.

Benchmarking von IOPS und Durchsatz eines Laufwerks auf einer laufenden Instanz

Wenn Sie IOPS und Durchsatz für eine realistische Arbeitslast auf einem aktiven Laufwerk auf einer laufenden VM-Instanz messen möchten, ohne den Inhalt des Laufwerks zu verlieren, führen Sie ein Benchmarking mit einem neuen Verzeichnis im vorhandenen Dateisystem durch.

Test vorbereiten

  1. Stellen Sie eine Verbindung zur Instanz her.

  2. Installieren Sie die Abhängigkeiten:

    sudo apt update
    sudo apt install -y fio
    
  3. Wenn die Hyperdisk noch nicht formatiert ist, formatieren Sie das Laufwerk und stellen Sie es bereit.

  4. Lassen Sie sich im Terminal die Laufwerke auflisten, die mit Ihrer VM verbunden sind, und suchen Sie das Laufwerk, das Sie testen möchten.

    sudo lsblk
    

    Die Ausgabe des vorherigen Befehls sieht in etwa so aus:

    NAME         MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
    nvme0n1      259:0    0    10G  0 disk
    ├─nvme0n1p1  259:1    0   9.9G  0 part  /
    ├─nvme0n1p14 259:2    0     4M  0 part
    └─nvme0n1p15 259:3    0   106M  0 part  /boot/efi
    nvme0n2      259:4    0   3.4T  0 disk
    

    In diesem Beispiel testen wir ein Hyperdisk Extreme-Volume mit 3.500 GiB und dem Gerätenamen nvme0n2.

  5. Erstellen Sie auf dem Laufwerk das neue Verzeichnis fiotest. In diesem Beispiel wird das Laufwerk unter /mnt/disks/mnt_dir bereitgestellt:

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  6. Wenn die VM die NVMe-Laufwerksschnittstelle für den Hyperdisk-Anhang verwendet (wenn der Name des Rohlaufwerks das Präfix nvme hat), führen Sie die folgenden Schritte aus, um die Anzahl der für die VM verfügbaren NUMA-Knoten abzurufen.

    Die Benchmarking-Strategie für NVMe-Laufwerke unterscheidet sich bei VMs mit nur einem NUMA-Knoten und VMs mit mehr als einem NUMA-Knoten. Beim Testen der Hyperdisk-Leistung über die NVMe-Laufwerksschnittstelle werden nur 256 NVMe-Warteschlangengrößen pro Warteschlange zugewiesen. Aufgrund der begrenzten NVMe-Warteschlangengrößen und der potenziellen Konflikte von den anderen Laufwerken, die an dieselbe VM angehängt sind, verwenden diese Benchmark-Tests zwei NVMe-Laufwerkswarteschlangen, um eine aggregierte Warteschlangengröße beizubehalten, die mit einer Iodepth von 256 umgehen kann.

    1. Rufen Sie die Anzahl der NUMA-Knoten ab.

      lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
      
    2. Wenn die VM nur einen NUMA-Knoten hat, rufen Sie die CPU-zu-NVMe-Warteschlangenzuordnung ab. Sie benötigen diese Informationen später für den Parameter --cpus-allowed.

      QUEUE_1_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 1p | tr -d " \t")
      QUEUE_2_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 2p | tr -d " \t")
      

Schreibdurchsatz testen

Testen Sie den Schreibdurchsatz mithilfe sequenzieller Schreibvorgänge mit mehreren parallelen Streams (mindestens 16) mit einer E/A-Blockgröße von 1 MB und einer E/A-Tiefe von mindestens 64:

  1. Wenn die Hyperdisk die SCSI-Schnittstelle verwendet:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
    --name=write_throughput
    
  2. Wenn die Hyperdisk die NVMe-Schnittstelle verwendet:

    1. Wenn die VM nur einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

      sudo fio --directory=$TEST_DIR --numjobs=8 \
      --size=10G --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=write_throughput --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_throughput_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Wenn die VM mehr als einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

      sudo fio --directory=$TEST_DIR --numjobs=8 \
      --size=10G --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --group_reporting \
      --name=write_throughput --numa_cpu_nodes=0 \
      --name=write_throughput_2 --numa_cpu_nodes=1
      

Schreib-IOPS testen

Testen Sie die Schreib-IOPS mithilfe zufälliger Schreibvorgänge mit einer E/A-Blockgröße von 4 KB und einer E/A-Tiefe von mindestens 256:

  1. Wenn die Hyperdisk über die SCSI-Schnittstelle angehängt ist:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G -time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256 \
    --name=write_iops
    
  2. Wenn die Hyperdisk die NVMe-Schnittstelle verwendet:

    1. Wenn die VM nur einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

      sudo fio --directory=$TEST_DIR --numjobs=8 \
      --size=10G --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=write_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Wenn die VM mehr als einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=write_iops --numa_cpu_nodes=0 \
      --name=write_iops_2 --numa_cpu_nodes=1
      

Lesedurchsatz testen

Testen Sie den Lesedurchsatz mithilfe sequenzieller Lesevorgänge mit mehreren parallelen Streams (mindestens 16) mit einer E/A-Blockgröße von 1 MB und einer E/A-Tiefe von mindestens 64.

  1. Wenn die Hyperdisk die SCSI-Schnittstelle verwendet:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
    --name=read_throughput
    
  2. Wenn die Hyperdisk die NVMe-Schnittstelle verwendet:

    1. Wenn die VM nur einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=read_throughput --cpus_allowed=$QUEUE_1_CPUS \
      --name=read_throughput_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Wenn die VM mehr als einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --group_reporting \
      --name=read_throughput --numa_cpu_nodes=0 \
      --name=read_throughput_2 --numa_cpu_nodes=1
      

Lese-IOPS testen

Testen Sie die Lese-IOPS mithilfe zufälliger Lesevorgänge mit einer E/A-Blockgröße von 4 KB und einer E/A-Tiefe von mindestens 256.

  1. Wenn die Hyperdisk die SCSI-Schnittstelle verwendet:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
    --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
    --name=read_iops
    
  2. Wenn die Hyperdisk die NVMe-Schnittstelle verwendet:

    1. Wenn die VM nur einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=read_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=read_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Wenn die VM mehr als einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=read_iops --numa_cpu_nodes=0 \
      --name=read_iops_2 --numa_cpu_nodes=1
      

Bereinigen

Entfernen Sie die Testverzeichnisse.

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

Benchmarking von IOPS und Durchsatz für Hyperdisk Extreme auf C3-VMs

Google Cloud Hyperdisk Extreme bietet eine höhere Leistung auf C3-VMs mit 176 vCPUs. Wenn Sie die höheren Leistungsgrenzen erreichen möchten, müssen Sie der VM mehrere Hyperdisk Extreme-Volumes zuordnen.

Wenn Sie IOPS (I/O per Second) oder den Durchsatz für eine realistische Arbeitslast auf aktiven Laufwerken auf einer laufenden C3-VM messen möchten, ohne den Inhalt Ihrer vorhandenen Datenlaufwerke zu verlieren, führen Sie ein Benchmarking mit einem neuen Verzeichnis im vorhandenen Dateisystem durch und hängen Sie der VM für die Benchmarking-Aufgaben neue Hyperdisk Extreme-Volumes an.

Bei Laufwerken, die über die NVMe-Schnittstelle verbunden sind, wird empfohlen, die E/A-Arbeitslast auf alle NVMe-Warteschlangen zu verteilen, die für die VM verfügbar sind. Dadurch wird die Hyperdisk-Leistung maximiert. Auf C3-VMs mit 176 vCPUs sind vier NUMA-Knoten vorhanden, die jeweils einer NVMe-Warteschlange zugeordnet sind. Diese Zuordnung wird für die Benchmark-Tests in diesem Abschnitt vorausgesetzt.

Test vorbereiten

  1. Fügen Sie Ihrer VM neue Hyperdisk Extreme-Laufwerke hinzu und sehen Sie sich die Leistungsgrenzen von Hyperdisk an, um die für die gewünschte Leistung erforderliche Laufwerkkonfiguration abzuleiten.

  2. Stellen Sie eine Verbindung zur Instanz her.

  3. Installieren Sie die Abhängigkeiten:

    sudo apt update
    sudo apt install -y fio
    
  4. Listen Sie die Laufwerke auf, die mit Ihrer VM verbunden sind, und suchen Sie das Laufwerk, das Sie testen möchten.

    sudo lsblk
    

    Die Ausgabe des vorherigen Befehls sieht in etwa so aus:

    NAME         MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
    nvme0n1      259:0    0    10G  0 disk
    ├─nvme0n1p1  259:1    0   9.9G  0 part  /
    ├─nvme0n1p14 259:2    0     4M  0 part
    └─nvme0n1p15 259:3    0   106M  0 part  /boot/efi
    nvme0n2      259:4    0   2.5T  0 disk
    nvme0n3      259:5    0   2.5T  0 disk
    nvme0n4      259:6    0   2.5T  0 disk
    

    In diesem Beispiel testen wir die Leistung von Google Cloud Hyperdisk auf drei Hyperdisk Extreme-Volumes mit 2.500 GiB und den Gerätenamen nvme0n2, nvme0n3 und nvme0n4.

Benchmark-Durchsatz von Hyperdisk Extreme auf C3

In diesem Abschnitt erfahren Sie, wie Sie sowohl den Lese- als auch den Schreibdurchsatz für Hyperdisk Extreme-Laufwerke benchmarken.

Vorbereitung auf Tests

Bevor Sie mit dem Benchmarking der Leistung von Hyperdisk Extreme-Laufwerken beginnen, die an eine C3-VM mit 176 vCPUs angehängt sind, führen Sie die folgenden Schritte aus.

  1. Erstellen Sie in Ihrem Betriebssystem ein neues Verzeichnis fiotest. In diesem Beispiel ist das Stammverzeichnis /mnt/disks/mnt_dir:

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  2. Da die VM mehr als ein Laufwerk benötigt, um die höchste Leistung zu erreichen, sollten Sie aus Gründen der Einfachheit RAID 0 auf allen angehängten Hyperdisk-Volumes ausführen. So können Daten leichter gleichmäßig auf mehrere Hyperdisk-Volumes verteilt werden.

    In diesem Beispiel steht RAID 0 für die Leistung von drei Hyperdisk Extreme-Volumes, die an die C3-VM angehängt sind.

    sudo mdadm --create /dev/md0 --level=0 --raid-devices=3 /dev/nvme0n2 /dev/nvme0n3 /dev/nvme0n4
    
  3. Formatieren und bereitstellen Sie das RAID-Volume /dev/md0.

Schreibdurchsatz testen

Testen Sie den Schreibdurchsatz mithilfe sequenzieller Schreibvorgänge mit mehreren parallelen Streams (mindestens 16) mit einer E/A-Blockgröße von 1 MiB und einer E/A-Tiefe von mindestens 32 pro NVMe-Warteschlange.

# Running this command causes data loss on the targeted file on the device.
# We strongly recommend using a throwaway disk.

sudo fio --name=global --group_reporting=1 --filesize=1024G \
--filename=$TEST_DIR/fiotestfile --numjobs=4 --size=64G \
--offset_increment=64G --time_based --runtime=5m \
--ramp_time=10s --ioengine=libaio --direct=1 --verify=0 \
--bs=1M --iodepth=8 --rw=write \
--name=write_throughput --numa_cpu_nodes=0 \
--name=write_throughput_1 --numa_cpu_nodes=1 \
--name=write_throughput_2 --numa_cpu_nodes=2 \
--name=write_throughput_3 --numa_cpu_nodes=3

Lesedurchsatz testen

Testen Sie den Lesedurchsatz mithilfe sequenzieller Lesevorgänge mit mehreren parallelen Streams (mindestens 16) mit einer E/A-Blockgröße von 1 MiB und einer E/A-Tiefe von mindestens 32 pro NVMe-Warteschlange.

sudo fio --name=global --group_reporting=1 --filesize=1024G \
--filename=$TEST_DIR/fiotestfile --numjobs=4 --size=64G \
--offset_increment=64G --time_based --runtime=5m \
--ramp_time=10s --ioengine=libaio --direct=1 \
--verify=0 --bs=1M --iodepth=8 --rw=read \
--name=read_throughput --numa_cpu_nodes=0 \
--name=read_throughput_1 --numa_cpu_nodes=1 \
--name=read_throughput_2 --numa_cpu_nodes=2 \
--name=read_throughput_3 --numa_cpu_nodes=3

Benchmark-IOPS von Hyperdisk Extreme auf C3

Für einen Benchmark zur Leistung in IOPS (I/O per Second) empfehlen wir, parallele kleine I/O-Vorgänge direkt auf oder von Raw-Laufwerken (ohne RAID) auszuführen.

Schreib-IOPS testen

Testen Sie die Schreib-IOPS mithilfe zufälliger Schreibvorgänge mit einer E/A-Blockgröße von 4 KiB und einer E/A-Tiefe von mindestens 256. Verwenden Sie dabei mindestens zwei NVMe-Warteschlangen.

# Running this command causes data loss on the targeted device.
# We strongly recommend using a throwaway disk.

sudo fio --name=global --group_reporting=1 \
--directory=/ --bs=4K --direct=1 \
--filesize=512G --iodepth=256 \
--iodepth_batch_complete_max=256 --iodepth_batch_submit=256 \
--ioengine=libaio --numjobs=5 --ramp_time=10s \
--randrepeat=0 --runtime=5m --rw=randwrite \
--time_based=1 --verify=0 \
--name=write_iops_test --filename=/dev/nvme0n2 --numa_cpu_nodes=0 \
--name=write_iops_test_1 --filename=/dev/nvme0n3  --numa_cpu_nodes=1 \
--name=write_iops_test_2 --filename=/dev/nvme0n4 --numa_cpu_nodes=2

Lese-IOPS testen

Testen Sie die Lese-IOPS mithilfe zufälliger Lesevorgänge mit einer E/A-Blockgröße von 4 KiB und einer E/A-Tiefe von mindestens 256. Verwenden Sie dabei mindestens zwei NVMe-Warteschlangen.

sudo fio --name=global --group_reporting=1 --directory=/ \
--bs=4K --direct=1 --filesize=512G --iodepth=256 \
--iodepth_batch_complete_max=256 --iodepth_batch_submit=256 \
--ioengine=libaio --numjobs=5 --ramp_time=10s \
--randrepeat=0 --runtime=5m --rw=randread \
--time_based=1 --verify=0 \
--name=read_iops_test --filename=/dev/nvme0n2 --numa_cpu_nodes=0 \
--name=read_iops_test_1 --filename=/dev/nvme0n3  --numa_cpu_nodes=1 \
--name=read_iops_test_2 --filename=/dev/nvme0n4 --numa_cpu_nodes=2

Benchmark-Latenz von Hyperdisk Extreme auf C3

Beim Testen der E/A-Latenz darf die VM nicht das Bandbreiten- oder IOPS-Limit erreichen. Andernfalls spiegelt die Latenz nicht die tatsächliche Hyperdisk-E/A-Latenz wider. Wenn beispielsweise das IOPS-Limit bei einer E/A-Tiefe von 30 erreicht wird und der Befehl fio für eine Verdopplung gesorgt hat, ändern sich die IOPS-Gesamtwerte nicht, während sich die gemeldete E/A-Latenz verdoppelt.

Es reicht aus, direkt auf ein einzelnes Rohlaufwerk zuzugreifen, um realistische I/O-Latenzen zu erhalten.

Schreiblatenz testen

Testen Sie die Schreiblatenz mithilfe zufälliger Schreibvorgänge mit einer E/A-Blockgröße von 4 KiB und einer E/A-Tiefe von 4.

# Running this command causes data loss on the targeted device.
# We strongly recommend using a throwaway disk.

sudo fio --filename=/dev/nvme0n2  \
--filesize=512G --time_based \
--runtime=5m --ramp_time=10s --ioengine=libaio \
--direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randwrite \
--iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
--name=write_latency

Leselatenz testen

Testen Sie die Leselatenz mithilfe zufälliger Lesevorgänge mit einer E/A-Blockgröße von 4 KiB und einer E/A-Tiefe von 4.

sudo fio --filename=/dev/nvme0n2  \
--filesize=512G --time_based \
--runtime=5m --ramp_time=10s --ioengine=libaio \
--direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randread \
--iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
--name=read_latency

Bereinigen

  1. Entfernen Sie die Testdateien.

    sudo rm -rf $TEST_DIR/*
    
  2. Heben Sie die Bereitstellung des RAID-Volumes auf und beenden Sie es.

    sudo umount /dev/md0
    sudo mdadm --stop /dev/md0
    
  3. Trennen Sie die angehängten Hyperdisk-Volumes und löschen Sie sie. Weitere Informationen finden Sie unter gcloud compute instances detach-disk und gcloud compute disks delete.

Benchmarking der reinen Hyperdisk-Leistung

Wenn Sie die Leistung von Hyperdisk-Volumes allein außerhalb Ihrer Entwicklungsumgebung messen möchten, können Sie die Lese- und Schreibleistung für ein blockorientiertes Gerät auf einem Wegwerf-Laufwerk und einer Wegwerf-VM testen.

Bei den folgenden Befehlen wird davon ausgegangen, dass ein Hyperdisk-Extreme-Volume mit 3.500 GiB an Ihre VM angehängt ist. Diese Laufwerkgröße ist erforderlich, um die aktuellen Durchsatzlimits für eine VM mit 32 vCPUs zu erreichen. Wenn Ihr Gerät eine andere Kapazität hat, ändern Sie den Wert des Arguments --filesize in den folgenden Befehlen. Weitere Informationen zu den Leistungsgrenzen für VM-Maschinentypen finden Sie unter Unterstützung von Maschinentypen.

Test vorbereiten

  1. Stellen Sie eine Verbindung zur Instanz her.

  2. Installieren Sie die Abhängigkeiten:

    sudo apt-get update
    sudo apt-get install -y fio
    
  3. Rufen Sie den Pfad zum Rohlaufwerk ab. Speichern Sie den Pfad in einer Variable. Im folgenden Beispiel wird /dev/nvme0n2 als Rohpfad des Laufwerks verwendet:

    TEST_DIR=/dev/nvme0n2
    
  4. Füllen Sie den Speicher mit Daten ungleich null. Hyperdisk-Lesevorgänge aus leeren Blöcken haben ein Latenzprofil, das sich von Blöcken mit Daten unterscheidet. Wir empfehlen daher, das Laufwerk mit Daten aufzufüllen, bevor Leselatenz-Benchmarks ausgeführt werden.

    # 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=$TEST_DIR --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
    
  5. Wenn die VM die NVMe-Laufwerksschnittstelle für den Hyperdisk-Anhang verwendet (wenn der Name des Rohlaufwerks das Präfix nvme hat), führen Sie die folgenden Schritte aus, um die Anzahl der für die VM verfügbaren NUMA-Knoten abzurufen.

    Die Benchmarking-Strategie für NVMe-Laufwerke unterscheidet sich bei VMs mit nur einem NUMA-Knoten und VMs mit mehr als einem NUMA-Knoten. Beim Testen der Hyperdisk-Leistung über die NVMe-Laufwerksschnittstelle werden nur 256 NVMe-Warteschlangengrößen pro Warteschlange zugewiesen. Aufgrund der begrenzten NVMe-Warteschlangengrößen und der potenziellen Konflikte von den anderen Laufwerken, die an dieselbe VM angehängt sind, verwenden diese Benchmark-Tests zwei NVMe-Laufwerkswarteschlangen, um eine aggregierte Warteschlangengröße beizubehalten, die mit einer Iodepth von 256 umgehen kann.

    1. Rufen Sie die Anzahl der NUMA-Knoten ab.

      lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
      
    2. Wenn die VM nur einen NUMA-Knoten hat, rufen Sie die CPU-zu-NVMe-Warteschlangenzuordnung ab. Sie benötigen diese Informationen später für den Parameter --cpus-allowed.

      QUEUE_1_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 1p | tr -d " \t")
      QUEUE_2_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 2p | tr -d " \t")
      

Schreibdurchsatz testen

Testen Sie den Schreibdurchsatz mithilfe sequenzieller Schreibvorgänge mit mehreren parallelen Streams (mindestens 16) mit einer E/A-Größe von 1 MB und einer E/A-Tiefe von mindestens 64.

  1. Wenn die Hyperdisk über die SCSI-Schnittstelle angehängt ist:

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    
    sudo fio --filename=$TEST_DIR \
    --numjobs=16 --size=500G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
    --offset_increment=20G \
    --name=write_throughput
    
  2. Wenn die Hyperdisk die NVMe-Schnittstelle verwendet:

    1. Wenn die VM nur einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --cpus_allowed_policy=split \
      --offset_increment=20G --group_reporting \
      --name=write_throughput --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_throughput_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Wenn die VM mehr als einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --offset_increment=20G --group_reporting \
      --name=write_throughput --numa_cpu_nodes=0 \
      --name=write_throughput_2 --numa_cpu_nodes=1
      

Schreib-IOPS testen

Damit das Hyperdisk-IOPS-Limit erreicht werden kann, muss die E/A-Warteschlange eine entsprechende Tiefe haben. Wenn beispielsweise die Schreiblatenz 1 Millisekunde beträgt, können für die VM höchstens 1.000 IOPS für jeden aktiven E/A-Vorgang erreicht werden. Für 15.000 IOPS muss die VM mindestens 15 E/A-Vorgänge gleichzeitig ausführen. Damit Speicher und VM 30.000 IOPS erreichen können, sind mindestens 30 aktive E/A-Vorgänge erforderlich. Wenn die E/A-Größe 4 KB übersteigt, kann das Bandbreitenlimit für die VM vor dem IOPS-Limit erreicht werden.

Testen Sie die Schreib-IOPS mithilfe zufälliger Schreibvorgänge mit einer E/A-Blockgröße von 4 KB und einer E/A-Tiefe von mindestens 256:

  1. Wenn das Hyperdisk Extreme-Volume über die SCSI-Schnittstelle angehängt ist:

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    
    sudo fio --filename=$TEST_DIR \
    --numjobs=16 --size=500G -time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256 \
    --name=write_iops
    
  2. Wenn das Hyperdisk Extreme-Volume über die NVMe-Schnittstelle angehängt ist:

    1. Wenn die VM nur einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=write_write_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_write_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Wenn die VM mehr als einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=write_iops --numa_cpu_nodes=0 \
      --name=write_iops_2 --numa_cpu_nodes=1
      

Schreiblatenz testen

Beim Test der E/A-Latenz darf die VM nicht das Bandbreiten- oder IOPS-Limit erreichen. Andernfalls spiegelt die Latenz nicht die tatsächliche Hyperdisk E/A-Latenz wider. Wenn beispielsweise das IOPS-Limit bei einer E/A-Tiefe von 30 erreicht wird und der Befehl fio für eine Verdopplung gesorgt hat, ändern sich die IOPS-Gesamtwerte nicht, während sich die gemeldete E/A-Latenz verdoppelt.

# Running this command causes data loss on the second device.
# We strongly recommend using a throwaway VM and disk.
sudo fio --filename=$TEST_DIR \
--filesize=500G --time_based \
--runtime=5m --ramp_time=10s --ioengine=libaio \
--direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randwrite \
--iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
--name=write_latency

Lesebandbreite testen

Testen Sie die Lesebandbreite mithilfe sequenzieller Lesevorgänge mit mehreren parallelen Streams (mindestens 16) mit einer E/A-Blockgröße von 1 MB und einer E/A-Tiefe von mindestens 64:

  1. Wenn das Hyperdisk Extreme-Volume über die SCSI-Schnittstelle angehängt ist:

     sudo fio --filename=$TEST_DIR \
     --numjobs=16 --size=500G --time_based \
     --runtime=5m --ramp_time=10s --ioengine=libaio \
     --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
     --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
     --offset_increment=20G --name=read_bandwidth
  2. Wenn das Hyperdisk Extreme-Volume über die NVMe-Schnittstelle angehängt ist:

    1. Wenn die VM nur einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

        sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
        --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
        --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
        --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
        --cpus_allowed_policy=split \
        --offset_increment=20G --group_reporting \
        --name=read_bandwidth --cpus_allowed=$QUEUE_1_CPUS \
        --name=read_bandwidth_2 --cpus_allowed=$QUEUE_2_CPUS
    2. Wenn die VM mehr als einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

        sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
        --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
        --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
        --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
        --offset_increment=20G --group_reporting \
        --name=read_bandwidth --numa_cpu_nodes=0 \
        --name=read_bandwidth_2 --numa_cpu_nodes=1

Lese-IOPS testen

Damit das Hyperdisk IOPS-Limit erreicht werden kann, muss die E/A-Warteschlange eine entsprechende Tiefe haben. Wenn die E/A-Größe beispielsweise 4 KB übersteigt, kann das Bandbreitenlimit für die VM vor dem IOPS-Limit erreicht werden. Geben Sie für diesen Test --iodepth=256 ein, um die für einen Maschinentyp verfügbaren maximalen Lese-IOPS zu erreichen.

  1. Wenn das Hyperdisk Extreme-Volume über die SCSI-Schnittstelle angehängt ist:

    sudo fio --filename=$TEST_DIR \
    --numjobs=16 --size=500G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
    --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
    --name=read_iops
    
  2. Wenn das Hyperdisk Extreme-Volume über die NVMe-Schnittstelle angehängt ist:

    1. Wenn die VM nur einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=read_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=read_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Wenn die VM mehr als einen NUMA-Knoten hat, verwenden Sie den folgenden Befehl:

      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=read_iops --numa_cpu_nodes=0 \
      --name=read_iops_2 --numa_cpu_nodes=1
      

Leselatenz testen

Es ist wichtig, den Speicher mit Daten zu füllen, um eine realistische Latenzmessung zu erhalten. Die VM darf während dieses Tests nicht das IOPS- oder Durchsatzlimit erreichen. Erreicht das Hyperdisk-Volume das Sättigungslimit, werden eingehende E/A-Vorgänge verzögert. Dadurch steigt die E/A-Latenz künstlich an.

 sudo fio --filename=$TEST_DIR \
 --filesize=500G --time_based \
 --runtime=5m --ramp_time=10s --ioengine=libaio \
 --direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randread \
 --iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
 --name=read_latency

Bereinigen

Wenn Sie wie empfohlen ein Wegwerf-Laufwerk und eine Wegwerf-VM verwendet haben, können Sie nach Abschluss der Benchmarktests Folgendes tun:

  • Trennen und löschen Sie das Laufwerk.
  • Löschen Sie die VM.

Nächste Schritte