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 Laufwerksleistung 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. Um die höheren Leistungsgrenzen zu erreichen, müssen Sie mehrere VMs mit extremen Hypervolumes an die VM anhängen.

Zur Messung des E/A-Vorgangs (IOPS) oder des Durchsatzes für eine realistische Arbeitslast auf aktiven Laufwerken auf einer laufenden C3-VM führen Sie ein Benchmarking anhand eines neuen Verzeichnisses im vorhandenen Dateisystem durch. und hängen neue VM-Extreme-Volumes für die Benchmarking-Aufgaben an die VM an.

Bei Laufwerken, die mit der NVMe-Schnittstelle verbunden sind, wird empfohlen, die E/A-Arbeitslast auf alle für die VM verfügbaren NVMe-Warteschlangen zu verteilen. Dadurch wird die Leistung des Hyperdisks maximiert. Auf C3-VMs mit 176 vCPUs werden vier NUMA-Knoten von 1 bis 1 bis 4 NVMe-Warteschlangen zugeordnet. Diese Zuordnung wird für die Benchmark-Tests in diesem Abschnitt angenommen.

Test vorbereiten

  1. Fügen Sie Ihrer VM neue Hyperdisk-Extremlaufwerke hinzu und lesen Sie die Leistungslimits von Hyperdisk, um die für Ihre Zielleistung erforderliche Laufwerkeinrichtung 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 an Ihre VM angehängt 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 Volumes mit extremen Laufwerken der Größe 2.500 GiB und mit den Geräten nvme0n2, nvme0n3 und nvme0n4.

Benchmark-Durchsatz von Hyperdisk Extreme an C3

In diesem Abschnitt wird gezeigt, wie Sie sowohl den Lese- als auch den Schreibdurchsatz für extrem große Laufwerke vergleichen.

Vorbereitung auf Tests

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

  1. Erstellen Sie in Ihrem Betriebssystem ein neues Verzeichnis, fiotest. In diesem Beispiel lautet 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, führen Sie der Einfachheit halber RAID 0 auf allen angehängten Hyperdisk-Volumes durch. Die Daten können dadurch gleichmäßiger auf mehrere Hyperdisk-Volumes verteilt werden.

    In diesem Beispiel ist RAID 0 die Leistung auf drei Hypervolumes-Extremen-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 stellen Sie das RAID-Volume bereit. /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-Gesamttiefe 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-Gesamttiefe 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

Benchmarking-IOPS von Hyperdisk Extreme auf C3

Zur Benchmark für die E/A-Leistung (IOPS) empfehlen wir, parallele E/A-Vorgänge direkt an oder von Rohlaufwerken (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 mit 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 mit 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

Benchmarking-Latenz von Hyperdisk Extreme on C3

Beim Test der E/A-Latenz darf die VM nicht das Bandbreiten- oder IOPS-Limit erreichen. Ist dies der Fall, spiegelt die beobachtete Latenz nicht die tatsächliche E/A-Latenz des Hyperlaufwerks wider. Wenn beispielsweise die VM das IOPS-Limit bei einer E/A-Tiefe von 30 erreicht und der Befehl fio doppelt so groß ist, ändern sich die IOPS-Gesamtwerte nicht, während sich die gemeldete E/A-Latenz verdoppelt. eine

Es ist ausreichend, ein einzelnes Ziellaufwerk direkt auszuwählen, um realistische E/A-Latenzen zu erhalten.

Schreiblatenz testen

Testen Sie die Schreiblatenz durch Ausführung 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. Trennen Sie das RAID-Volume 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 in den Befehlen 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