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
Installieren Sie die Abhängigkeiten:
sudo apt update sudo apt install -y fio
Wenn die Hyperdisk noch nicht formatiert ist, formatieren Sie das Laufwerk und stellen Sie es bereit.
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
.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
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.
Rufen Sie die Anzahl der NUMA-Knoten ab.
lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
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:
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
Wenn die Hyperdisk die NVMe-Schnittstelle verwendet:
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
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:
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
Wenn die Hyperdisk die NVMe-Schnittstelle verwendet:
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
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.
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
Wenn die Hyperdisk die NVMe-Schnittstelle verwendet:
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
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.
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
Wenn die Hyperdisk die NVMe-Schnittstelle verwendet:
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
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
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.
Stellen Sie eine Verbindung zur Instanz her.
Installieren Sie die Abhängigkeiten:
sudo apt update sudo apt install -y fio
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
undnvme0n4
.
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.
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
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
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
Entfernen Sie die Testdateien.
sudo rm -rf $TEST_DIR/*
Heben Sie die Bereitstellung des RAID-Volumes auf und beenden Sie es.
sudo umount /dev/md0 sudo mdadm --stop /dev/md0
Trennen Sie die angehängten Hyperdisk-Volumes und löschen Sie sie. Weitere Informationen finden Sie unter
gcloud compute instances detach-disk
undgcloud 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
Installieren Sie die Abhängigkeiten:
sudo apt-get update sudo apt-get install -y fio
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
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
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.
Rufen Sie die Anzahl der NUMA-Knoten ab.
lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
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.
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
Wenn die Hyperdisk die NVMe-Schnittstelle verwendet:
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
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:
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
Wenn das Hyperdisk Extreme-Volume über die NVMe-Schnittstelle angehängt ist:
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
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:
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
Wenn das Hyperdisk Extreme-Volume über die NVMe-Schnittstelle angehängt ist:
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
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.
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
Wenn das Hyperdisk Extreme-Volume über die NVMe-Schnittstelle angehängt ist:
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
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.