MySQL mit NVMe SSD langsamer als erwartet
Bei der Evaluierung neuer Server haben wir den Import eines MySQL-Dumps auf zwei verschiedenen Plattformen mit unterschiedlichen Komponenten und ähnlicher Leistungsfähigkeit verglichen. Dabei gab es überraschende Abweichungen von mehr als 450%.
Basisdaten für den Test
Es soll ein MySQL-Dump mit ca. 15 Millionen Datensätzen eingespielt werden. Folgende Software und Server wurden dabei verwendet:
Software
- CentOS 8.3, 64 Bit
- Percona Server 8.0.22
- MySQL-Dump mit ca. 15 Millionen Datenstätzen
Server1
- AMD Ryzen 7 3700X 8-Core Processor, 3.6 GHZ
- 64 GB ECC RAM
- SAMSUNG MZVLB1T0HBLR, 1TB, Sequentielles Schreiben 3000MB/s, Zufällige IOPS schreibend 500000
Samsung MZVLB1T0HBLR
Server2
- Intel(R) Xeon(R) E-2288G CPU, 3.70GHz
- 64 GB ECC RAM
- SAMSUNG MZQLB960HAJR, 960GB, Sequentielles Schreiben 1050MB/s, Zufällige IOPS schreibend 40000
Samsung MZQLB960HAJR
Der offizielle Link zu samsung.com enthält bei Erstellung dieser Seite keine Spezifikationen, daher Informationen aus dem Handel: Samsung MZQLB960HAJR - alternativ
Ergebnisse
Server 1 (AMD, MZVLB1T0HBLR)
[root@server1 ~]# date; zcat test.sql.gz | mysql -psecret test; date Thu Mar 25 19:45:14 CET 2021 Thu Mar 25 20:08:33 CET 2021 Delta: 23:19 minutes avg-cpu: %user %nice %system %iowait %steal %idle 0.80 0.00 0.27 4.74 0.00 94.19 Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util nvme0n1 0.00 1431.60 0.00 31421.85 0.00 290.07 0.00 16.85 0.00 0.40 0.26 0.00 21.95 0.50 71.40 nvme1n1 0.00 1431.57 0.00 31421.72 0.00 290.07 0.00 16.85 0.00 1.00 1.15 0.00 21.95 0.70 99.68
Dauer: 23:19 Minuten
Server 2 (Intel, MZQLB960HAJR)
[root@server2 ~]# date; zcat test.sql.gz | mysql -psecret test; date Thu Mar 25 19:00:01 UTC 2021 Thu Mar 25 19:04:44 UTC 2021 Delta: 04:43 minutes avg-cpu: %user %nice %system %iowait %steal %idle 6.32 0.00 0.87 0.75 0.00 92.05 Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util nvme0n1 0.00 4319.53 0.00 140428.80 0.00 485.03 0.00 10.10 0.00 0.08 0.02 0.00 32.51 0.02 10.28 nvme1n1 0.00 4319.53 0.00 140428.80 0.00 485.03 0.00 10.10 0.00 0.08 0.02 0.00 32.51 0.02 10.29
Dauer: 04:43 Minuten
Bewertung der Ergebnisse und Tuning
Zunächst muss man festhalten, dass diesem Test ein spezieller Fall zugrunde liegt: das Einspielen eines MySQL-Dumps ist single-threaded und kann daher weder Multicore-CPUs noch aktuelle SSDs auslasten. Dennoch lassen sich Schlussfolgerungen aus den Ergebnissen ziehen, da die Abweichungen aufgrund identischer Software und Daten von der Hardware kommen müssen.
Laut den technischen Daten des Herstellers müsste die in Server 1 verbaute NVMe SSD (MZVLB1T0HBLR) bei zufälligen Schreibvorgängen schneller sein als das in Server 2 verbaute Modell (MZQLB960HAJR). Trotzdem dauert der Vorgang mit der vermeintlich schnelleren SSD ca. um den Faktor 4,5 länger.
Es folgten weitere Tests um einen Defekt der NVMe SSDs auszuschließen (SMART-Werte überprüft, Selbsttests, Benchmarks, ...): die NVME SSDs sind in Ordnung und erzielen auch eine sequentielle Schreibleistung weit über 2GByte pro Sekunde. Aufgrunddessen wurde die MySQL-Config geändert und der Parameter innodb_log_file_size von 128MB auf 5GB erhöht (Gruppe von jeweils zwei Logs). Danach wurde der Test wiederholt:
[root@server1 ~]# date; zcat test.sql.gz | mysql -psecret test; date Fri Mar 26 16:57:12 CET 2021 Fri Mar 26 17:03:45 CET 2021 Delta: 06:33
Dauer: 06:33 Minuten
Zusammenfassung
Die Tests legen nahe, dass der große Unterschied bei den Schreibraten der SSDs in der Ausrichtung zu suchen ist: die SSD von Server 1 ist für Clients/Desktops gedacht, die SSD in Server 2 für Anwendungen im Rechenzentrum. Der Controller bzw. die Firmware der SSD von Server 2 kommt scheinbar besser mit den Anforderungen einer Datenbankwiederherstellung zurecht.
Im Zusammenhang mit einer Samsung 970 Pro NVMe und MySQL 8.0 ist folgender Bugreport interessant:
Bug 93734 - MySQL 8.0 is 36 times slower than MySQL 5.7