Redis Teil 2 - Anwendungscache Benchmark: Redis, NVMe SSDs und memcached

26.09.2019
extendedLogo

Welche Form von Anwendungscache führt im E-Commerce zu mehr Performance: die Nutzung von Redis, memcached oder NVMe SSDs? Wir haben dazu einen Benchmark durchgeführt und die Durchsätze der Schreib-, Lese- und Lösch-Operationen pro Sekunde gemessen.

Warum diese Redis Benchmarks?

In unserer täglichen Arbeit mit Onlineshops konnten wir immer wieder feststellen, dass der Einsatz von Redis zu einer Erhöhung der Performance geführt hat. Die Durchsätze der Schreib-, Lese- und Lösch-Operationen wurden durch Redis verbessert, was durch frühere Benchmarks von Redis-Entwickler Colin Mollenhour belegt wurde. Doch die Technik entwickelt sich weiter und so auch unsere eingesetzte Hardware: Als Datenspeicher nutzen wir auf unseren Clustern NVMe SSDs. Sie erreichen wesentlich höhere Datendurchsätze als SATA SSDs oder HDDs und führen deshalb im E-Commerce zu einer besseren Performance. Der Datenspeicher wird von den Shopsystemen Magento und Shopware standardmäßig als Cache Backend verwendet. Redis und memcached hingegen legen die Datenstrukturen im Arbeitsspeicher ab. Wir wollten mit diesem Benchmark herausfinden, welche Form der Datenspeicherung bei Anwendungscaches letztendlich zu mehr Performance für Onlineshops führt: Redis (Arbeitsspeicher), memcached oder NVMe SSDs (Dateisystem).

Dafür messen wir den Durchsatz an Lösch-, Schreib- und Lese-Operationen pro Sekunde und vergleichen diese.

Bei dem zweiten Benchmark, den wir im nächsten Blogbeitrag "Redis Teil 3" vorstellen, haben wir uns auf die Sessions konzentriert. Wir wollten herausfinden, welcher Sessions-Speicher beim Lesen, Schreiben und Ändern der Daten performanter ist: Redis, MySQL oder NVMe SSDs.

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.

Komponente Hardware
CPU Intel Xeon Gold 6254 @ 3.10GHz (4 aktivierte CPU Kerne)
SSD Samsung SSD PM1725b 3.2TB, PCIe 3.0 x8 NVMe SSD
RAM 32 GB DDR4 2933 MHz

Benchmark: Anwendungscaches unter Magento 1

Da Magento 1 ein komplexes Cache-System aufweist, haben wir uns dazu entschlossen, den Benchmark beispielhaft unter Magento 1 durchzuführen. Damit lassen sich die Auswirkungen von Cache-Backends auf komplexen Datenstrukturen demonstrieren. Der Benchmark für Anwendungscaches wurde unter der (zum Zeitpunkt des Tests) aktuellen Version Magento 1.9.4.1 durchgeführt.

Shopware und Magento Onlineshops legen die Daten standardmäßig im Datenspeicher (bei uns NVMe SSDs) ab. Redis legt die Daten dagegen im Arbeitsspeicher ab. Damit Redis von Magento 1 unterstützt wird, müssen bestimmte Plugins installiert werden. Magento 2 und Shopware unterstützen Redis bereits nativ.

Als Ausgangspunkt für unseren Test dienten die 2012 aufgestellten Benchmarks von Colin Mollenhour. Diesen Test haben wir auf unserer Hardware und dem aktuellen Magento 1 Shopsystem nachgebildet und verschiedene Backends getestet.

Backends für den Benchmark

Zend_Cache_Backend_File

Das Backend Zend_Cache_Backend_File kommt bei Magento 1 zum Einsatz, wenn kein spezielles anderes Backend über die lokal.xml oder ein Modul zum Einsatz kommt. Eine spezielle Konfiguration ist hier nicht notwendig.

Für unsere Tests haben wir den Benchmark auf den von uns verwendeten schnellen NVMe SSDs durchgeführt.

Cm_Cache_Backend_Redis

Hierbei handelt es sich um ein Modul von Collin Mollenhour, welches es erlaubt den Magento 1-Cache in Redis abzulegen. Für Magento 2 ist eine Implementierung auf gleicher Codebasis bereits im Shopsystem integriert. Auch Shopware erlaubt es, ohne weitere Module den Cache in Redis abzulegen.

memcached (Zend_Cache_Backend_TwoLevels) + Zend_Cache_Backend_File

Magento 1 erlaubt es den Cache in zwei Teile nach Fast- und Slow-Backend zu splitten. Dadurch kann ein Teil des Caches in ein schnelles Backend gelegt werden, welches keine Tags unterstützt. Der restliche Teil des Caches, welcher die Tags benötigt, wird in ein anderes, langsameres Backend gelegt. Ohne weitere Module ist es für diesen Fall möglich, die Key-Value-Datenbank memcached als Fast-Backend zu verwenden. Für diesen Test haben wir als Fast-Backend memcached verwendet und als Slow Backend das Dateisystem.

memcached (Zend_Cache_Backend_TwoLevels) + Cm_Cache_Backend_Redis

Als vierte Variante haben wir getestet, wie sich memcached und Redis kombiniert verhalten. Wir haben daher wieder das TwoLevels-Backend aktiviert, für diesen Fall allerdings Redis als Slow Cache eingetragen.

Nach der Konfiguration des Cache Benchmarks wurden anschließend Elemente für den Benchmark angelegt:


php -f shell/cache-benchmark.php --keys 200000

Anschließend wurde der eigentliche Benchmark durchgeführt und ausgewertet.


bash var/cachebench/default/run.sh

Wir verwenden im Test eine Cache-Größe von 200.000 Schlüsseln, welches unserer Erfahrung nach einem durchschnittlichen Magento Shop entspricht.

Ergebnisse

Lösch-Operationen pro Sekunde

Diagramm 1: Lösch-Operationen pro Sekunde für die ausgewählten Backends. (Umso mehr Operationen, desto besser ist der Durchsatz.)

Lese-Operationen pro Sekunde

Diagramm 2: Lese-Operationen pro Sekunde für das jeweilige Backend. (Umso mehr Operationen, desto besser ist der Durchsatz.)

Schreib-Operationen pro Sekunde

Diagramm 3: Schreib-Operationen pro Sekunde, pro Backend. (Umso mehr Operationen, desto besser ist der Durchsatz der Schreib-Operationen.)

Bei einer Schreib-Operation wird ein einzelnes Element im Cache abgelegt, bei einer Lese-Operation gelesen. Eine Lösch-Operation entfernt alle Elemente aus dem Cache, welche mit einem bestimmten Cache versehen sind.

Im Gegensatz zu den anderen Backends ist es durch die Unterstützung komplexer Datenstrukturen in Redis möglich, Elemente über Tags zu finden. Dazu legt das Cache Backend ein Set für jeden Tag an, in welchem alle zugehörigen Schlüssel gesichert werden. Zusätzlich gibt es ein Set, welches alle Tags enthält. Auf diese Weise ist es extrem effizient alle Schlüssel, welche zu einem Tag gehören, zu entfernen. Bei Dateisystem-basierten Backends oder auch bei memcached ist diese Methode nicht vorhanden, sodass die Anzahl an Lösch-Operationen bei jenen Backends wesentlich geringer ausfällt (siehe Diagramm 1). Aufgrund der ineffizienten Struktur des Standard Magento Anwendungscache (default Einstellung) ist der Durchsatz an Lösch-Operationen extrem gering.

Dies wirkt sich auf die Geschwindigkeit aus. Das Cm_Cache_Backend_Redis Modul erreicht eine wesentlich höhere Geschwindigkeit als die übrigen Backends, da Lösch-Operationen aufgrund der strukturierten Daten schnell über beliebige Tags ausgeführt werden können. Bei den Dateisystem-basierten Caches hingegen ist es wesentlich umständlicher alle Elemente des Caches, welche ein bestimmtes Tag haben, zu entfernen, da die entsprechenden Dateien nicht direkt über einen Tag gefunden werden können.

Im Diagramm 2 lässt sich die Anzahl an Lese-Operationen ablesen. Sie ist bei Dateisystem-basierten Cache-Backends am höchsten. Das hängt mit der sehr effizienten Dateisystemverwaltung von Linux zusammen, welche Dateien automatisch im Arbeitsspeicher vorhält, sofern freier Speicher vorhanden ist. In unserer Testumgebung haben wir einen sehr hohen Arbeitsspeicher von 32 GB zur Verfügung gestellt, damit für unseren Test immer ausreichend Speicherplatz vorhanden ist. Dies erlaubt es, Dateien extrem effizient zu lesen. In einer realen Situation mit begrenztem RAM ist dies nicht immer der Fall. In einem solchen Fall bietet Redis den Vorteil, dass sichergestellt wird, dass der Anwendungscache zu jedem Zeitpunkt im RAM liegt.

Diagramm 3 zeigt die Anzahl an Schreib-Operationen pro Sekunde. Die Unterschiede zwischen den einzelnen Backends fallen bei diesem Durchsatz Test am geringsten aus. Allerdings bietet Redis durch die einfachen Datenstrukturen den Vorteil, Daten schnell im RAM abzulegen.

Fazit: Ist Redis als Anwendungscache die beste Option?

Auf den ersten Blick ist zwar erkennbar, dass Redis im Bereich der Lese-Operationen aufgrund des geringeren Durchsatzes inperformanter ist. Allerdings verfügt Redis im Bereich der Schreib-Operationen über einen höheren Durchsatz sowie im Bereich der Lösch-Operationen über einen deutlich höheren Durchsatz.

Der große Vorteil von Redis zeigt sich beim Vergleich der Anzahl an Operationen pro Sekunde untereinander. Dabei ist die Relevanz der einzelnen Operationsarten zu beachten. Die Relevanz von Lösch-Operationen ist wesentlich höher als die der anderen Operationen. Das liegt daran, dass letztendlich bei jedem Kauf eines Produktes im Onlineshop Elemente aus dem Cache ihre Gültigkeit verlieren und daher gelöscht werden müssen. Anschließend müssen die vorher gelöschten Cache-Elemente neu geschrieben werden, also Schreib-Operationen. Auch dabei zeigt Redis eine höhere Performance. Denn der Durchsatz an Schreib-Operationen liegt beim Redis-Backend höher als bei den anderen Backends.

NVMe SSDs weisen als Anwendungscache im Bereich der Lese-Operationen die höchste Anzahl pro Sekunde auf. Für die Lösch- und Schreib-Operationen bieten NVMe SSDs einen geringeren Durchsatz. Diese Operationen haben allerdings auf einen Shop mit einer hohen Conversion mehr Einfluss als die Lese-Operationen. Insofern haben die Lösch- und Schreib-Operationen eine höhere Relevanz im E-Commerce. Für Onlineshop-Betreiber sind deshalb die Werte der Lösch- und Schreib-Operationen besonders wichtig, in welchen Redis laut unseren Messergebnissen, deutliche Vorteile bietet. Aus diesem Grund empfehlen wir die Implementation von Redis für Onlineshops. Insbesondere für mittlere und große Onlineshops.

Für die Key-Value-Datenbank memcached als Backend zeigen die Ergebnisse in beiden TwoLevel-Einsatzszenarien, dass memcached im Vergleich zu den anderen Backends kein besseres Gesamtergebnis aufweist. Lediglich bietet memcached einen höheren Durchsatz bei den Lese-Operationen. Da memcached in Einrichtung und Betrieb als Anwendungscache ein höheres Komplexitätslevel aufweist, können wir nach unseren Tests keine Empfehlung für memcached aussprechen, da sich hier kein großer Vorteil für Onlineshops bei diesem Einrichtungsaufwand ergibt.

Für Showpare, Magento 1 und Magento 2 Onlineshops empfehlen wir nach unserem Test die Nutzung von Redis zum effizienten Speichern von Anwendungscaches im Arbeitsspeicher. Für kleinere Shops führen bereits die NVMe SSDs zu einer ausreichend guten Performance. Die Kombination aus schnellen SSDs zum Laden von PHP-Dateien und statischen Inhalten sowie Redis als Anwendungscache stellt die beste Umgebung für einen performanten Betrieb von Onlineshops dar.

Tabellarische Empfehlung für die verschiedenen Shopsysteme und Shopgrößen

Shopsystem Auslieferungszustand des Herstellers Unsere Empfehlung für Anwendungscaches
Shopware - kleiner Shop Dateisystem Redis oder NVMe SSDs
Shopware - mittlerer bis großer Shop Dateisystem Redis
Magento 1 - kleiner Shop Dateisystem Redis oder NVMe SSDs
Magento 1 - mittlerer bis großer Shop Dateisystem Redis
Magento 2 - kleiner Shop Dateisystem Redis oder NVMe SSDs
Magento 2 - mittlerer bis großer Shop Dateisystem Redis

Weitere Beiträge dieser Blogserie

Titelbild: raspirator/ iStock.com


Zuletzt aktualisiert am 09.06.2021 | JH