MySQL-Benchmark mittels sysbench
Die im Artikel Server-Benchmark mittels sysbench beschriebenen Benchmarks von sysbench testen die einzelnen Komponenten eines Servers: Die CPU, den RAM und die Festplatte.
Diese Werte können hilfreich bei einem Vergleich von verschiedenen Server-Angeboten sein, spiegeln aber nicht unbedingt die Realität wieder in die der Server eingesetzt wird. Stattdessen empfiehlt es sich einen Benchmark auf einer realen Server-Anwendung durchzuführen.
In diesem Artikel zeige ich euch, wie ihr die Performances eines MySQL-Servers ermitteln könnt. Der ermittelte Wert kann sowohl genutzt werden, um den MySQL-Server zu optimieren, als auch um verschiedene Server-Angebote miteinander zu vergleichen.
Inhaltsverzeichnis
MySQL installieren
Sofern noch nicht passiert ist, müsst ihr als erstes den MySQL-Server installieren. In diesem Artikel gehe ich von einem aktuellen Ubuntu-System aus. Dort könnt ihr den MySQL-Server wie folgt installieren:
1 |
sudo apt-get install mysql-server |
MySQL-Konfiguration optimieren
Für einen realistischen Vergleich kann es sich empfehlen, die MySQL-Konfiguration zu optimieren. Eine ausführliche Anleitung für MySQL 5.7 findet ihr hier: MySQL 5.7 optimieren.
Für meine Benchmarks habe ich folgende MySQL-Konfiguration gewählt. Speichert diese in der Datei
/etc/mysql/conf.d/innodb.cnf ab:
1 2 3 4 5 6 |
[mysqld] innodb_buffer_pool_size = 16G # (adjust value here, 50%-70% of total RAM) innodb_log_file_size = 256M innodb_log_buffer_size = 256M innodb_flush_log_at_trx_commit = 0 # Default is 1 sync_binlog=0 |
Den Buffer für InnoDB ( innodb_buffer_pool_size ) solltet ihr auf ca. 50% – 70% des RAMs setzen. Da der getestete vServer 32GB RAM hatte, habe ich hier 16 GB RAM gewählt.
innodb_log_file_size und innodb_log_buffer_size bestimmen die Buffer für Schreibvorgänge. 256MB sollten ausreichen.
Der Parameter innodb_flush_log_at_trx_commit = 0 bestimmt dass Änderungen nicht unmittelbar auf die Festplatte geschrieben werden, sondern erst nach 1 Sekunde. Dies kann deutlich die Performance des MySQL-Server steigern.
Für den Vergleich zwischen verschiedenen Servern ist es wichtig, dass die Konfigurationsdateien ähnlich sind. Den innodb_buffer_pool_size könnt je anpassen an den verfügbaren RAM je Server.
Nach der Änderung der Konfigurationsdatei solltet ihr den Server neustarten:
1 2 |
sudo service mysql restart #bis Ubuntu 14.04 sudo systemctl restart mysql.service #ab Ubuntu 14.10 |
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 |
Testdatenbank erstellen
Für den Performance-Test mittels sysbench solltet ihr die Datenbank sbtesterstellen. Dies geht z.B. indem ihr euch einloggt in den lokalen MySQL-Server ( mysql -u root) und den SQL-Befehl create database sbtest; ausführt.
Sobald ihr die Datenbank angelegt habt, könnt ihr folgenden Befehl in der Shell ausführen:
1 |
sysbench --test=oltp --oltp-table-size=25000000 --mysql-user=root --db-driver=mysql --mysql-password= prepare |
Dies erstellt eine Tabelle mit 25 Millionen Einträgen, was ca. 5,6 GB an Daten entspricht. Ihr könnt den Wert anpassen um größere oder kleinere Datenbanken zu testen.
MySQL-Benchmark
Mit der erstellen Tabelle könnt ihr nun einen Lasttest durchführen:
1 |
sysbench --db-driver=mysql --num-threads=64 --max-requests=0 --db-driver=mysql --test=oltp --mysql-table-engine=innodb --oltp-table-size=25000000 --max-time=300 --mysql-engine-trx=yes --mysql-user=root --mysql-password= run |
Bei diesem Test wird über 64 paralelle Verbindungen (–num-threads=64) auf den MySQL-Server zugegriffen und es werden verschiedene SQL-Befehle auf der zuvor erstellen Tabelle ausgeführt. Der Test läuft ingesamt 300 Sekunden (–max-time=300).
Das Ergebnis 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 27 28 29 30 31 32 33 34 35 36 37 |
Running the test with following options: Number of threads: 64 Doing OLTP test. Running mixed OLTP test Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases) Using "BEGIN" for starting transactions Using auto_inc on the id column Threads started! Time limit exceeded, exiting... (last message repeated 63 times) Done. OLTP test statistics: queries performed: read: 4966262 write: 1773587 other: 709440 total: 7449289 transactions: 354707 (1182.19 per sec.) deadlocks: 26 (0.09 per sec.) read/write requests: 6739849 (22463.02 per sec.) other operations: 709440 (2364.47 per sec.) Test execution summary: total time: 300.0420s total number of events: 354707 total time taken by event execution: 19197.5151 per-request statistics: min: 2.77ms avg: 54.12ms max: 801.67ms approx. 95 percentile: 129.41ms Threads fairness: events (avg/stddev): 5542.2969/65.25 execution time (avg/stddev): 299.9612/0.02 |
Das wichtige Ergebnis steht in Zeile 20. Der MySQL-Server kann auf diesem vServer im Schnitt 1182 Transaktionen pro Sekunde durchführen. Je höher das Ergebnis, desto schneller / besser euer Server.
Auch wenn der MySQL-Test etwas komplexer in der Durchführung ist, so misst dieser sehr gut die komplette Performance eines Servers in einem realistischen Szenario, da die SQL-Befehle sowohl den RAM, die Festplatte und die CPU beansprucht.
Allerdings lassen sich mit dem Test fairerweise nur Server vergleichen, die etwa gleich teurer sind. Die obigen Zahlen stammen von einem Hetzner vServer mit 8 vCores und 32 GB RAM für ca. 60 Euro / Monat. Günstigere Server sollten entsprechend geringere Zahlen bzgl. den Transaktionen pro Sekunde zeigen.