Redis Teil 3 - Sessions Benchmark - NVMe SSDs, Redis und MySQL

26.09.2019
extendedLogo

Welche Form der Session-Speicherung führt zu mehr Performance bei Onlineshops: Dateisystem, Arbeitsspeicher oder Datenbank? In unserem Sessions Benchmark haben die wir die Schreib-, Lese- und Änderungs-Operationen pro Sekunde von Redis, NVMe SSDs und MySQL gemessen und ausgewertet.

Testumgebung

Die Tests wurden auf einem unserer Cluster durchgeführt mit unserer aktuellen Hardware (zum Zeitpunkt des Tests), wie etwa Intel Xeon Gold 6254. Bei der Testumgebung haben wir 4 CPU Kerne gewählt, um die Rechenkraft eines unserer durchschnittlichen Cluster darzustellen. Die RAM-Höhe haben wir auf den sehr hohen Wert von 32 GB gestellt, damit alle Cache-Dateien in den Linux-Dateisystem-Cache abgelegt werden konnten. In den meisten Fällen ist dies mit wesentlich weniger RAM möglich.

KomponenteHardware
CPUIntel Xeon Gold 6254 @ 3.10GHz (4 aktivierte CPU Kerne)
SSDSamsung SSD PM1725b 3.2TB, PCIe 3.0 x8 NVMe SSD
RAM32 GB DDR4 2933 MHz

Benchmark: Sessions

Neben den Anwendungscaches wollten wir zusätzlich wissen, wie sich die verschiedenen Speichermöglichkeiten, sprich NVMe SSDs (Dateisystem), Redis (Arbeitsspeicher) und MySQL (Datenbank), auf die Performance des Sessions-Speichers auswirken.

Anders als bei den Anwendungscaches konnten wir uns nicht auf ein etabliertes Benchmark-Tool stützen, da bislang noch kein Tool existiert, welches das Verhalten von Magento- und Shopware Sessions mit allen jeweils üblichen Backends möglichst passend nachstellt. Aus diesem Grund erstellten wir unser eigenes Skript, welches wir auf GitHub veröffentlicht haben.

Da Sessions einfach nur Daten sind, welche für jeden Nutzer von Onlineshops einzeln gespeichert werden, haben wir zum Testen zufällige Strings mit der Länge von 1.500 Zeichen verwendet. Diese haben wir im Dateisystem, in Redis und in MySQL gespeichert und dabei gemessen, wie viele Operationen im Schreiben, Lesen und Ändern pro Sekunde durchgesetzt werden. Da die Lösch-Operationen für Sessions gewöhnlich nicht relevant sind, wurden sie nicht gemessen. Denn Lösch-Operationen erfolgen nicht während Nutzer ihre Requests senden, sondern erfolgen (optimalerweise) im Hintergrund.

Um das Verhalten von E-Commerce Projekten nachzustellen, haben wir die Messungen nicht nur hintereinander durchgeführt (als Single Thread), sondern auch in 8 parallelen Threads (Multi-Thread), welche permanent Daten in das Backend gelesen, geschrieben und geändert haben. So konnten wir das Verhalten von einzelnen und mehreren gleichzeitigen Onlineshop Nutzern nachstellen.

Dateisystem

Eine einfache Möglichkeit Sessions zu speichern, besteht darin, für jede Session eine einzelne Datei innerhalb eines bestimmten Ordners anzulegen. Standardmäßig ist diese Art der Sessions-Speicherung bei PHP und Magento konfiguriert.

Redis

Wie bei den Anwendungscaches, haben wir die Sessions in Redis abgelegt. Hierbei haben wir allen Sessions ein Ablaufdatum erteilt. Dadurch werden alte Sessions nach einer Zeit automatisch bereinigt

MySQL

Außerdem haben wir Sessions in der MySQL-Datenbank mit denselben Einstellungen, welche auch unsere Cluster beim Auslieferungszustand erhalten, für einen performanten MySQL Betrieb abgelegt und getestet. Das Ablegen der Sessions in MySQL wird von Shopware (per default) durchgeführt, wenn keine anderweitigen Einstellungen vorgenommen werden.

Ergebnisse

maxcluster Sessions Benchmark

Benchmark über Schreib-, Lese- und Ändern-Operationen, Single und Multi Threaded, um das Verhalten von Redis, NVMe SSDs und MySQL vergleichen zu können. Je höher der Balken, umso besser das Ergebnis.

Eine Schreib-Operation erzeugt hierbei einen bisher noch nicht vorhandenen Wert und legt ihn im Backend ab. Dies entspricht dem Anlegen einer neuen Session.

Eine Lese-Operation liest einen solchen Wert aus. Dies entspricht dem Lesen einer Session.

Eine Ändern-Operation, ersetzt einen vorhandenen Wert, durch einen anderen Wert. Dies entspricht, dem aktualisierten einer Session durch eine Kundeninteraktion.

Unser Sessions Benchmark zeigt für den Single Thread, dass der Durchsatz an Schreib- und Änderungs-Operationen zwischen den NVMe SSDs und Redis sehr ähnlich ist. Im Fall der Lese-Operationen zeigen die NVMe SSDS allerdings einen wesentlich höheren Durchsatz als Redis. Für einen Onlineshop bedeutet das, dass NVMe SSDs bei einem einzelnen Nutzer des Shops eine bessere Performance erzielen als Redis. Schlussfolgernd lässt sich feststellen, dass Onlineshops mit wenig Conversion bereits von NVMe SSDs allein profitieren, ein großer Vorteil durch Redis ergibt sich hier nicht.

ABER: Sobald mehrere Anfragen gleichzeitig verarbeitet werden, zeigt sich die Stärke von Redis. Im Multi Thread steigt die Verarbeitungsgeschwindigkeit bei allen drei Operationen. Im Vergleich der Balken des Diagramms zeigt sich, dass Redis bei den Lese-Operationen einen um 33 % höheren Durchsatz erreicht als die NVMe SSDs und fast dreimal höheren wie MySQL. Im Schreiben verarbeitet Redis sogar um 41 % mehr Operationen als die NVMe SSDs und 60 % mehr als MySQL. Bei den ändernden Operationen zeigte sich im Test die höchste Differenz, da Redis einen um 61 % höheren Durchsatz als die NVMe SSDs erreichte und um 87 % höher als MySQL.

MySQL verfügt im Vergleich zu den beiden anderen Sessions-Speichern in allen Operationen über den geringsten Durchsatz, sowohl im Bereich Single Thread als auch im Bereich Multi Thread.

Fazit: Welcher Sessions-Speicher sorgt für mehr Performance bei Onlineshops?

Sobald auf einem Onlineshop mehrere Besucher gleichzeitig ihre Warenkörbe füllen und somit von mehreren Besuchern Sessions gespeichert werden müssen, lohnt sich die Nutzung von Redis. Unser Benchmark zeigt, dass Redis in allen drei Operationen schneller ist als die Dateisystem-basierte Speicherung (NVMe SSDs) oder die Speicherung in der Datenbank MySQL. Daher empfehlen wir die Implementation von Redis.

Shopware legt die Sessions standardmäßig in MySQL ab. Da diese Methode wesentlich langsamer ist als die beiden anderen Sessions-Speicher, würde die Integration von Redis für Onlineshops eine Steigerung der Performance bedeuten. Für Shopware lohnt sich also in jedem Fall eine Redis Integration. Sollte dies dennoch nicht gewünscht werden, empfehlen wir, für einzelne Webserver die Sessions von der Datenbank ins Dateisystem zu verlegen, um von unseren schnellen NVMe SSDs zu profitieren. Wie Redis in Shopware integriert wird, werden wir im nächsten Blogbeitrag dieser Blogserie ausführlich erklären.

Nur bei kleinen Magento Onlineshops hingegen, welche keine oder kaum parallele Zugriffe bzw. Conversion haben, lohnt sich die Integration von Redis nicht. Die schnellen NVMe SSDs, die auch zu unserer Architektur gehören, zeigten im Bereich Single Thread bei sequentiellen Zugriffszeiten eine höhere Leistung als Redis.

ShopsystemAuslieferungszustand des HerstellersUnsere Empfehlung für Sessions
Shopware - kleiner ShopMySQLRedis
Shopware - mittlerer bis großer ShopMySQLRedis
Magento 1 - kleiner ShopDateisystemNVMe SSDs
Magento 1 - mittlerer bis großer ShopDateisystemRedis
Magento 2 - kleiner ShopDateisystemNVMe SSDs
Magento 2 - mittlerer bis großer ShopDateisystemRedis

Weitere Beiträge dieser Blogserie

Titelbild: raspirator/istock.com


Zuletzt aktualisiert am 09.06.2021 | JH