Server-Benchmark mittels sysbench
Um die Performance der virtuellen Servern zu testen und zu vergleichen habe ich die bekannte Software sysbench genutzt. Diese Software bietet verschiedene Tests an um die Performance der CPU, des RAMs und der Festplatte zu messen. So könnt ihr verschiedene Server / vServer-Angebote miteinander verglichen werden und schauen wie gut die Performance der jeweiligen Angebote ist.
Ebenfalls interessant könnte der Artikel MySQL-Benchmark mittels sysbench sein, um mittels sysbench und eines MySQL-Servers die Performance eines Servers zu messen.
Inhaltsverzeichnis
Benchmark-Software sysbench installieren
In meinen Tests habe ich Ubuntu 16.04 als Betriebssystem verwendet, dort lässt sich sysbench in Version 0.4.2 einfach installieren:
1 |
sudo apt-get install sysbench |
Auch bei anderen Betriebssystem lässt sich sysbench oftmals einfach installieren.
Wichtig: Die nachfolgenden Befehle funktionieren nur mit sysbench 0.4.2 und 0.5. Leider wird bei manchen Linux-Version sysbench in Version 1.x installiert. Version 1 unterscheidet sich komplett zu der 0.4.2. Version und meiner Meinung nach ist neue Version von sysbench kaum zu gebrauchen.
So könnt ihr eine spezielle Version von sysbench installieren:
1 |
sudo apt-get install sysbench=0.4.2 |
CPU-Benchmark
Mittels des folgenden Befehls könnt ihr einen CPU-Benchmark durchführen:
1 |
sysbench --num-threads=1 --test=cpu --cpu-max-prime=20000 run |
Der Output sollte wie folgt aussehen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
sysbench 0.4.12: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 1 Doing CPU performance benchmark Threads started! Done. Maximum prime number checked in CPU test: 20000 Test execution summary: total time: 36.2060s total number of events: 10000 total time taken by event execution: 36.2022 per-request statistics: min: 3.51ms avg: 3.62ms max: 7.10ms approx. 95 percentile: 3.76ms Threads fairness: events (avg/stddev): 10000.0000/0.00 execution time (avg/stddev): 36.2022/0.00 |
Die wichtige Zeile ist hierbei Zeile 15. Für die Ausführung des Tests wurden insgesamt 36,2 Sekunden benötigt. Diese Zeitdauer lässt sich mit den Ergebnissen anderer vServer vergleichen.
Der CPU-Test sucht nach allen Primzahlen zwischen 1 und 20.000. Die Obergrenze könnt ihr mittels dem Parameter –cpu-max-prime=20000 verändern. Bei der Suche greift der Test dabei auf nur einen CPU-Core zurück. Die Anzahl dort könnt ihr mittels –num-threads=1 verändern.
Der Primzahlentest überprüft für jede Zahl ob es einen ganzzahligen Teiler zwischen 2 und der Wurzel aus der Zahl existiert. Zum Beispiel für die Primzahl 4567 wird jede Zahl zwischen 2 und sqrt(4567)=67 getestet, ob 4567 durch die Zahl zu teilen ist. Falls ein Teiler gefunden wird, wissen wir, dass die Zahl keine Primzahl sein kann.
Bei diesem Test und mit der Obergrenze 20.000 werden 321.238 rechenaufwendige Operationen auf der CPU ausgeführt, welches den CPU-Kern für gut 30 Sekunden komplett auslastet.
Für das Ranking hier rechne ich die Dauer des Tests in Operationen pro Sekunde um. Der obige vServer von Hetzner schafft demzufolge 321.238 / 36,2 = 8897 Rechenoperationen pro Sekunde.
RAM-Benchmark
Mittels dem folgenden Befehl könnt die Geschwindigkeit des RAMs messen:
1 |
sysbench --num-threads=1 --test=memory --memory-block-size=1M --memory-total-size=100G run |
Hierbei werden 100 GB in Blöcken von je 1 MB in den RAM geschrieben. Der Output sieht wie folgt aus.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
sysbench 0.4.12: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 1 Doing memory operations speed test Memory block size: 1024K Memory transfer size: 102400M Memory operations type: write Memory scope type: global Threads started! Done. Operations performed: 102400 ( 7126.32 ops/sec) 102400.00 MB transferred (7126.32 MB/sec) Test execution summary: total time: 14.3693s total number of events: 102400 total time taken by event execution: 14.3552 per-request statistics: min: 0.12ms avg: 0.14ms max: 5.19ms approx. 95 percentile: 0.22ms Threads fairness: events (avg/stddev): 102400.0000/0.00 execution time (avg/stddev): 14.3552/0.00 |
Das relevante Ergebnis steht in Zeile 18: Der getestete vServer konnte 7126 MB / Sekunde im Hauptspeicher abspeichern.
Festplatten-Benchmark
Der Festplatten-Benchmark ist etwas komplizierter durchzuführen, da man zuerst abklären muss was man nun genau testen will. Tendenziell gibt es zwei große Bereiche: Das sequentielle Lesen und Schreiben vs. zufälliger Dateizugriff.
Sequentielles Lesen / Schreiben
Beim sequentiellen Lesen / Schreiben wird eine große Datei von der Festplatte gelesen bzw. auf diese geschrieben. Das Ergebnis entspricht der maximalen Performance die die Festplatte beim Lesen / Schreiben erreichen kann.
Mittels dem Tool dd lässt sich die Geschwindigkeit der Festplatte schnell ermitteln.
Schreibgeschwindigkeit – 10 GB Daten
1 |
dd if=/dev/zero of=./test.file bs=1M count=10000 oflag=direct |
Das Ergebnis sieht wie folgt aus:
1 |
10485760000 bytes (10 GB, 9.8 GiB) copied, 30.6147 s, 343 MB/s |
Die Daten konnten mit 343 MB/s auf die Festplatte geschrieben werden.
Lesegeschwindigkeit – 10 GB Daten
Wie nutzen die zuvor erstelle Datei und lesen diese aus. Dabei messen wir die Lesegeschwindigkeit.
1 |
dd if=./test.file of=/dev/null bs=1M count=10000 |
Das Ergebnis sieht wie folgt aus:
1 |
10485760000 bytes (10 GB, 9.8 GiB) copied, 59.4985 s, 176 MB/s |
Die Datei konnte mit 176 MB/s von der Festplatte gelesen werden.
Mittels dem Parameter count=10000 könnt ihr die Größe der Datei anpassen. In diesem Beispiel werden 10.000 * 1 MB geschrieben, sprich, die angesprochen 10 GB an Daten.
Zufälliges Lesen & Schreiben
In den meisten Szenarien ist das sequentielle Lesen- und Schreiben eher praxisfern, denn meistens werden auf einem Server keine großen Dateien abgespeichert oder ausgelesen.
Oftmals ist eher das zufällige Lesen und Schreib interessant. Bei diesem Test werden viele kleinere Dateien auf die Festplatte geschrieben, die dann zufällig ausgelesen und/oder beschrieben werden.
Zuerst erstellen wir die Testdateien:
1 |
sysbench --test=fileio --file-total-size=10G --file-num=1024 prepare |
Dieser Befehlt erstell 1024 Dateien mit einer insgesamten Größe von 10GB, d.h. jeder der 1024 Dateien besitzt eine Dateigröße von 10 MB. Ihr könnt die Parameter –file-num=1024 euren Bedürfnissen anpassen und eher weniger dafür größere Dateien erstellen oder viele dafür aber kleinere Dateien erstellen.
Damit wir den Test laufen lassen können, müssen wir die Anzahl der gleichzeitig geöffneten Dateien ggf. erhöhen. Das Limit könnt ihr wie folgt einsehen.
1 |
ulimit -a |
Die Ausgabe erhält eine Zeile ‘open files‘ die die maximale Anzahl an geöffneten Dateien angibt. Sollte diese kleiner als 1024 sein, so müssen wir das Limit erhöhen. Ansonsten kann sysbench den Test nicht durchführen.
Zur Erhöhung des Limits müsst ihr zum root-User wechseln und folgenden Befehl ausführen:
1 2 |
sudo su ulimit -n 100000 |
Dies erhöht das Limit auf 100.000.
Zur Ausführung des Festplattentests könnt ihr jetzt folgenden Befehl ausführen:
1 |
sysbench --num-threads=1 --test=fileio --file-total-size=10G --file-num=1024 --file-test-mode=rndrw --max-time=300 --max-requests=0 --file-extra-flags=direct --file-fsync-freq=1 run |
Das Ergebnis sieht wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
sysbench 0.4.12: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 1 Extra file open flags: 16384 1024 files, 10Mb each 10Gb total file size Block size 16Kb Number of random requests for random IO: 0 Read/Write ratio for combined random IO test: 1.50 Periodic FSYNC enabled, calling fsync() each 1 requests. Calling fsync() at the end of test, Enabled. Using synchronous I/O mode Doing random r/w test Threads started! Time limit exceeded, exiting... Done. Operations performed: 4546 Read, 3031 Write, 3102835 Other = 3110412 Total Read 71.031Mb Written 47.359Mb Total transferred 118.39Mb (404.1Kb/sec) 25.26 Requests/sec executed Test execution summary: total time: 300.0024s total number of events: 7577 total time taken by event execution: 8.6232 per-request statistics: min: 0.09ms avg: 1.14ms max: 12.68ms approx. 95 percentile: 2.42ms Threads fairness: events (avg/stddev): 7577.0000/0.00 execution time (avg/stddev): 8.6232/0.00 |
Die relevante Zahl steht in Zeile 21. Diese durchschnittliche Lese- und Schreibgeschwindigkeit bei diesem vServer betrug nur 404 Kb / Sekunde.
Nach Beendigung des Tests könnt ihr die Testdateien wie folgt wieder löschen:
1 |
sysbench --test=fileio --file-total-size=10G --file-num=1024 cleanup |
Testparameter
- –file-total-size=10G –file-num=1024: Die Anzahl der erstellten Dateien und die Gesamtgröße. Diese Werte müssen wie beim prepare-Aufruf sein.
- –file-test-mode=rndrw: Der Testmodus ist rndrw was für random read write steht. Im >Sysbench Handbuch stehen weitere Optionen.
- –max-time=300: Der Test läuft für 300 Sekunden, anschließend wird die Lese- und Schreibgeschwindigkeit ermittelt.
- –file-fsync-freq=1: Nach jedem Schreibvorgang wird fsync() aufgrufen, sprich, es wird erzwungen, dass die Datei tatsächlich auf die Festplatte geschrieben wird. Man kann den Wert erhöhen, z.B. auf 100. Hier werden Änderungen an Dateien u.U. erst im Hauptspeicher gepuffert und erst nach 100 Schreibvorgängen auf die Festplatte geschrieben.