Benchmarking von DigitalOcean-Volumes

Einführung

Mit dem Benchmarking können Sie die Infrastrukturleistung schätzen, um festzustellen, ob ein bestimmtes Setup Ihren Workload-Anforderungen gerecht wird. Dies ist eine wichtige Komponente für die Aufrechterhaltung einer hohen Serverleistung und Skalierung, um den wachsenden Computeranforderungen gerecht zu werden. Mit Benchmark-Tests können Sie Serverressourcen überwachen, die Leistung optimieren, die Auslastung verwalten und auftretende Probleme vorhersagen.

In diesem Lernprogramm werden die Best Practices für das Benchmarking Ihrer DigitalOcean-Blockspeichervolumes durch die Simulation von Workloads erläutert, die Ihre Anwendung imitieren.

Einrichtung zum Testen des Droplet- und Block-Speichervolumens

Sie möchten die Spezifikationen der Workload ermitteln, die Sie testen, um ein geeignetes Droplet- und Block Storage Volume-Setup zu konfigurieren. Wenn Sie DigitalOcean Volumes mit einem alternativen Produkt vergleichen, stellen Sie sicher, dass Sie Pläne mit ähnlicher Konfiguration auswählen, damit Sie einen genaueren Vergleich erhalten.

Anleitungen zum Einrichten eines Droplets finden Sie in unserem Tutorial „https://www.digitalocean.com/community/tutorials/how-to-create-your-first-digitalocean-droplet[How To Create Your First DigitalOcean Droplet]. ”Das Blockspeicher-Volume kann gleichzeitig mit dem Droplet erstellt werden. In einigen Fällen können Sie es später über die Registerkarte * Volumes * unter * Droplets * in der * Systemsteuerung * erstellen. Weitere Informationen zum Erstellen und Verwalten von Volumes finden Sie unter "https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-block-storage[An Introduction to DigitalOcean Block Storage".

Formatieren Sie das Volume mit dem Dateisystem, das Ihren Leistungsanforderungen entspricht. Das beliebteste Standarddateisystem ist Ext4, das leistungsstärker ist als die vorherigen Generationen Ext3 und Ext2. Das XFS-Dateisystem ist auf Leistung und große Datendateien spezialisiert. Weitere Informationen zu Dateisystemen finden Sie unter „https://www.digitalocean.com/community/tutorials/how-to-partition-and-format-digitalocean-block-storage-volumes-inlinux#formatting-the-partitions [Partitionieren und Formatieren von DigitalOcean-Blockspeichervolumes unter Linux]. “Wenn Sie kein bestimmtes Dateisystem oder keine bestimmte Konfigurationseinstellung haben, wird der Vorgang zum Erstellen und Mounten von Blockvolumes in der Systemsteuerung automatisiert.

image: https://assets.digitalocean.com/articles/benchmark-digitalocean-volumes/add-volume-gui.png [DigitalOcean Control Panel-Ansicht zum Einrichten von Volumes]

Nachdem Sie Ihre Einstellungen vorgenommen haben, werden Benchmarking-Tools und -Konfigurationen besprochen, mit denen Sie Ihre Leistungstests optimal nutzen können.

Benchmarking-Tools und -Konfigurationen

Wir werden das Tool zur Leistungsmessung fio zum Testen der Leistung diskutieren, da es äußerst flexibel ist und von den meisten Distributionen unterstützt wird. Zu den alternativen Benchmarking-Tools, die Sie möglicherweise untersuchen und verwenden möchten, gehören https://www.coker.com.au/bonnie/[Bonnie], btest und https: // github.com/filebench/filebench/wiki[Filebench].

Um fio auf einem Ubuntu-Server zu installieren, müssen Sie zuerst Ihre Paketliste aktualisieren und dann mit den folgenden Befehlen installieren:

sudo apt update
sudo apt install fio

Jedes Benchmark-Tool verfügt über eine Vielzahl von Parametern, die Sie einstellen können, um die optimale Leistung für Ihren Test zu erzielen.

Ein Parameter, der optimiert werden sollte, ist die Warteschlangentiefe. Hierbei handelt es sich um die Parallelität, bei der das Volume die beste Leistung erzielt. Normalerweise zeigt eine Warteschlangentiefe von "+ 1 +" an, dass die Workload keine weitere Transaktion starten kann, bis die vorherige Transaktion abgeschlossen wurde. Verwenden Sie für Ihre Tests nur niedrige Warteschlangentiefen, wenn Sie eine stark parallelisierte Anwendung simulieren möchten. Erhöhen Sie andernfalls die Warteschlangentiefe so lange, bis Sie die Leistung erhalten, die Sie für Ihre Anwendung wünschen.

Zu den typischen Konfigurationsoptionen des Benchmarking-Tools fio gehören:

Option Recommendations

iodepth

The queue depth that fio will issue to the file. In order to hit best input/output (I/O) rates, a number greater than iodepth=64 is recommended.

bs

Block size in bytes for I/O to use. File systems use 4K for metadata but tend to store files in much larger block sizes. Databases typically issue 8-16K sized I/O. For peak bandwidth tests, we recommend a block size of bs=64k or greater.

runtime

The time in seconds to run the benchmark. We recommend a runtime greater than 60 seconds, usually in the range of runtime=120s to runtime=300s.

ioengine

The ioengine option defines how the job issues I/O to the file. We recommend ioengine=libaio which refers to Linux native asynchronous I/O.

direct

Takes a Boolean value: 0 uses the filesystem cache returning a value closest to the application behavior which may result in higher than typical benchmark results; and 1 skips any file system caching behavior, returning the closest performance to what the block volume can do. We recommend direct=1.

sync

Use synchronous I/O for buffered writes. This option takes a Boolean value: 0 means not to force unit access, allowing for writeback cache behavior to operate like it does on normal disk drives with fio behaving more like a filesystem; 1 forces unit access, meaning I/O will not complete until the disk has guaranteed physical placement. We recommend sync=0.

size

Size of test file, taking an integer. We typically recommend at least 20 gigabytes. Note that DigitalOcean’s performance does not vary with volume size.

In Anbetracht dieser Konfigurationen können wir nun einige Beispiel-Benchmark-Tests durchgehen, die Sie möglicherweise ausführen möchten.

Ausführen von Benchmark-Tests

Hier sind einige Beispiel-Benchmarks, die Sie ausführen können. Im nächsten Abschnitt dieses Tutorials erfahren Sie, wie Sie die Ausgabe, die Sie erhalten, genauer untersuchen können.

In den folgenden Befehlen verweisen wir auf eine "+ fio.test +" - Datei auf einem Volume im NYC3-Rechenzentrum. Aktualisieren Sie diese Datei unbedingt so, dass sie auf das jeweilige Dateisystem verweist, das Sie verwenden möchten.

Bandbreite schreiben

Dieser Test führt ein zufälliges Schreiben von 1 MB auf die Block-Volumes durch.

fio --filename= \
--direct=1 \
--rw=randwrite \
--ioengine=libaio \
--bs=1024K \
--iodepth=32 \
--name=bw-test \
--runtime=120s \

Für ein Standard-Droplet erwarten wir eine Ausgabe von + 200MB / sec +. Wenn Sie mit einem Droplet mit hoher CPU-Auslastung arbeiten, sollten Sie eine Ausgabe von "+ 300 MB / s +" erwarten.

Gelegentlicher Lesetest

Hiermit wird gemessen, wie schnell mehrere kleine Dateien von einem Gerät gelesen werden können.

fio --filename= \
--direct=1 \
--rw=randread \
--ioengine=libaio \
--bs=4K \
--iodepth=128 \
--name=rand-r \
--runtime=120s \

Für ein Standard-Droplet erwarten wir eine Ausgabe von "+ 5000 " E / A-Operationen pro Sekunde (IOPS). Für ein hohes CPU-Droplet erwarten wir eine Ausgabe von mehr als " 6000 +" IOPS.

Random Write Test

Hiermit wird gemessen, wie schnell mehrere kleine Dateien geschrieben werden können.

fio --filename= \
--direct=1 \
--rw=randwrite \
--ioengine=libaio \
--bs=4K \
--iodepth=128 \
--name=rand-w \
--runtime=120s \

Eine Ausgabe von "+ 5000 " IOPS ist das, was wir für ein Standard-Droplet erwarten, während eine Ausgabe, die größer als " 6000 +" IOPS ist, das ist, was wir für ein High-CPU-Droplet erwarten.

Lesen Sie den Latenztest

Die Zeit, die erforderlich ist, um die richtigen Datenblöcke auf der Festplatte zu finden und darauf zuzugreifen, ermitteln wir mit einem Leselatenztest.

fio --filename= \
--direct=1 \
--rw=randread \
--ioengine=libaio \
--bs=4K \
--iodepth=1 \
--name=lat-read \
--runtime=120s \

Für diesen Test erwarten wir eine Ausgabe, die weniger als "+ 5ms +" zurückgibt.

Latenztest schreiben

Dieser Test misst die Verzögerung von der Erstellung einer Festplattenschreibanforderung bis zum Abschluss.

fio --filename= \
--direct=1 \
--rw=randwrite \
--ioengine=libaio \
--bs=4K \
--iodepth=1 \
--name=lat-write \
--runtime=120s \

Auch hier erwarten wir für diesen Test eine Leistung von weniger als "+ 5ms +".

Überprüfen der Ausgabe

Sobald Sie Ihren Test ausgeführt haben, überprüfen Sie die resultierende Ausgabe, um festzustellen, wie viele Lese- und Schreibvorgänge von DigitalOcean Volumes ausgeführt wurden. Sie sollten darauf achten, wie lange es gedauert hat, bis jeder Test abgeschlossen ist.

Unten finden Sie ein Beispiel für die Ausgabe eines Schreibbandbreitentests.

fio --filename=/mnt/volume-nyc3-04/test.fio --direct=1 --rw=randwrite --ioengine=libaio --bs=1024k --iodepth=32  --name=bw-test --runtime=120s
Outputbw-test: (groupid=0, jobs=1): err= 0: pid=2584: Fri Apr 20 17:14:19 2018
 write: io=22937MB, , , runt=120160msec
   slat (usec): min=54, max=622, avg=135.46, stdev=23.21
   clat (msec): min=7, max=779, avg=167.48, stdev=26.28
    lat (msec): min=7, max=779, avg=167.62, stdev=26.28
   clat percentiles (msec):
    |  1.00th=[  101],  5.00th=[  155], 10.00th=[  159], 20.00th=[  163],
    | 30.00th=[  165], 40.00th=[  167], 50.00th=[  167], 60.00th=[  167],
    | 70.00th=[  169], 80.00th=[  169], 90.00th=[  172], 95.00th=[  178],
    | 99.00th=[  306], 99.50th=[  363], 99.90th=[  420], 99.95th=[  474],
    | 99.99th=[  545]
   bw (KB  /s): min=137730, max=254485, per=100.00%, avg=195681.88, stdev=9590.24
   lat (msec) : 10=0.01%, 20=0.03%, 50=0.37%, 100=0.58%, 250=97.55%
   lat (msec) : 500=1.44%, 750=0.03%, 1000=0.01%
 cpu          : usr=1.76%, sys=1.83%, ctx=22777, majf=0, minf=11
 IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=99.9%, >=64=0.0%
    submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
    complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
    issued    : total=r=0/w=22937/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
    latency   : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
 WRITE: io=22937MB, aggrb=195468KB/s, minb=195468KB/s, maxb=195468KB/s, mint=120160msec, maxt=120160msec

Die hervorgehobene Zeile in der obigen Ausgabe zeigt unsere durchschnittliche Bandbreite als "+ bw = 195468KB / s " sowie unsere E / A-Operationen pro Sekunde (IOPS) als " iops = 190 ". In diesem speziellen Szenario ist der IOPS-Wert niedrig, da 1 MB Schreibzugriff mit einer Spitzenrate von 200 MB pro Sekunde durchgeführt wurde (" 190iops * 1M = ~ 190 MB / s +").

Bei der Durchführung eines Leselatenztests erhalten Sie die Metriken in Zeilen, die wie folgt aussehen:

Outputlat-read: (groupid=0, jobs=1): err= 0: pid=2628: Fri Apr 20 17:32:51 2018
 read : io=855740KB, bw=7131.2KB/s, iops=1782, runt=120001msec
   slat (usec): min=8, max=434, avg=16.77, stdev= 5.92
   clat (usec): min=2, max=450994, avg=539.15, stdev=2188.85
    lat (usec): min=53, max=451010, , stdev=2188.91

Im obigen Beispiel sehen wir, dass die E / A-Latenzzeit 556 usec oder Mikrosekunden (oder 0,5 ms oder Millisekunden) beträgt. Dies gibt die Zeit an, die erforderlich ist, um eine einzelne 4-KB-E / A-Operation für das Block-Volume auszuführen.

Die Latenz wird von mehreren Faktoren beeinflusst, darunter die Leistung des Speichersystems, die Größe der E / A, die Warteschlangentiefe und alle ausgelösten Drosselungsgrenzwerte.

Wenn Ihre Benchmark-Tests abgeschlossen sind, können Sie das Droplet und das Volume löschen.

Performance-Ergebnisse verstehen

DigitalOcean Block Storage Volumes sind SAN-basierte SSD-Speicher. Aus diesem Grund skaliert die Leistung eines bestimmten Volumes mit der Blockgröße und der Warteschlangentiefe. Das heißt, der Speicher bietet die beste Leistung, wenn gleichzeitig viel Arbeit erledigt wird.

Das folgende Diagramm zeigt ein Beispiel für die Leistung bei Parallelität. Klicken Sie auf das Bild, um es zu erweitern.

image: https://assets.digitalocean.com/articles/benchmark-digitalocean-volumes/impact-queue-depth-graph.png [Auswirkung der Warteschlangentiefe auf das IOPS-Diagramm]

Die Leistung von DigitalOcean wird durch maximales IOPS und maximale Bandbreite begrenzt, je nachdem, was zuerst erreicht wird. Bei DigitalOcean ändert sich die Leistung nicht mit der Größe des Volumes. Da IOPS und Bandbreite jedoch auf bestimmte Raten begrenzt sind, tritt ein Crossover-Effekt auf. Das heißt, wenn Sie die Warteschlangentiefe bei kleinen E / A-Vorgängen erhöhen, wird die maximale Bandbreite von 200 MB / s nicht erreicht, da stattdessen das IOPS-Limit überschritten wird. Bei großen Blöcken werden Spitzen-IOPS von 5000 nicht erreicht, da stattdessen das Bandbreitenlimit von 200 MB / s erreicht wird.

Als Faustregel gilt, dass die Verwendung einer Blockgröße von 32 KB oder mehr weniger als 5000 IOPS zur Folge hat, da die Bandbreitenbeschränkung von 200 MB / s überschritten wird, während die Verwendung einer Blockgröße von 16 KB oder weniger weniger weniger als die Bandbreitenbeschränkung zur Folge hat von 200 MB / s, da es 5000 IOPS treffen wird.

Vergleichen wir als praktisches Beispiel IOPS und Bandbreite.

Das erste Diagramm zeigt die typische Bandbreite bei gegebener Blockgröße und Warteschlangentiefe einer Anwendung. Wir betrachten zwei verschiedene Blockgrößen von 4K und 256K.

Bei Betrachtung der 4K-Werte stellen wir fest, dass bei einer Warteschlangentiefe von 4 5000 IOPS erreicht werden, es wird jedoch immer nur eine Bandbreite von 20 MB / s erreicht. Das liegt daran, dass "+5000 IOPS * 4K = 20MB / sec +". Dies bedeutet, dass eine 4-KByte-Workload niemals 20 MByte / s überschreitet, da sie E / A-begrenzt ist.

Bei Betrachtung der 256-KByte-Auslastung stellen wir fest, dass sie 200 MByte / s bei einer Warteschlangentiefe von 2 erreicht, jedoch niemals eine IOPS-Rate von mehr als 800 IOPS aufweist, da "+ 200 MByte / s / 256 KByte = 800 IOPS +".

DigitalOcean-Blockspeichervolumes sind für typische Dateisystem-Workloads von 16K-64K optimiert. Bei diesen Blockgrößen sehen wir einen guten Kompromiss zwischen IOPS und Bandbreite.

Block Size IOPS Bandwidth

4K

~5000 IOPS

~20MB/sec

16K

~5000 IOPS

~80MB/sec

32K

~5000 IOPS

~160MB/sec

64K

~3200 IOPS

~200MB/sec

256K

~800 IOPS

~200MB/sec

Sobald Sie die Ergebnisse aus dem Benchmarking einer simulierten E / A-Auslastung erhalten, können Sie das beste Setup basierend auf den Anforderungen Ihrer App analysieren.

Fazit

In diesem Handbuch wurde beschrieben, wie Sie ein Benchmarking Ihrer DigitalOcean Droplets und Block Storage Volumes durchführen, um erwartete Workflows zu simulieren. Durch das Einbeziehen von Benchmark-Tests als Teil Ihres Workflows können Sie sicherstellen, dass Sie eine angemessene Skalierung für Ihre Anwendungen beibehalten und Probleme vorhersagen, bevor sie auftreten.

Weitere Informationen zur Arbeit mit DigitalOcean Block Storage finden Sie unter „https://www.digitalocean.com/community/tutorials/how-to-create-an-encrypted-file-system-on-a-digitalocean -block-storage-volume [So erstellen Sie ein verschlüsseltes Dateisystem auf einem DigitalOcean-Blockspeicher-Volume] “und„ https://www.digitalocean.com/community/tutorials/how-to-work-with-digitalocean-block- storage-using-doctl [So arbeiten Sie mit DigitalOcean Block Storage mit Doctl]. “