Wie gut ist die Performance in Magento 2?
Für Magento 2 wurden bereits vor dem Major Release im Dezember 2015 große Performance-Vorteile gegenüber Magento 1.x versprochen. Beeindruckende Balkendiagramme schürten die Erwartungen auf ein endlich schnelles System. Inzwischen ist bereits Magento 2.1 erschienen – und nach nunmehr drei Quartalen, in denen das vollständig überarbeitete System intensiv getestet werden konnte, ist es Zeit, noch einmal nachzuhaken: Wie ist es wirklich um die Performance in Magento 2 bestellt? Wir fassen die wichtigsten Erfahrungswerte zusammen. – Und wer keine Lust auf Text und Lesen hat, kann sich auch einfach Carsten Stechs Vortrag zu diesem Thema ansehen.
Aufschlussreiche Vergleichstests
1. Test: Magento 1 vs. Magento 2 (Amasty)
Bereits im Dezember 2015 beschrieb Andrey Tataranovich in seinem (Anfang 2016 noch einmal aktualisierten) Beitrag für den Amasty Blog einen Vergleichstest von Magento 1.9.2.2 und Magento 2.0.0 mit den jeweiligen Beispieldaten auf identischer Hardware, wobei jeweils ein Apache Webserver zum Einsatz kam. Während die Magento 2 Instanz mit Varnish aufgesetzt wurde, kam für Magento 1.9 der Amasty Full Page Cache zum Einsatz. Die Tests wurden jeweils sowohl mit als auch ohne Cache durchgeführt. Um ein realistisches Szenario zu erhalten, wurden bei fünf gleichzeitig aktiven Testnutzern in jedem Testzyklus automatisiert 100 mal typische Abläufe im Shop ausgeführt (Startseite aufrufen, Kategorieseite aufrufen, Kategorie nach Farbe filtern, Kategorie nach weiterem Attribut filtern, Suche nach ‘shirt’ ausführen, eine Produktseite aufrufen, Produkt in den Warenkorb legen). So war es schließlich möglich, für die einzelnen Schritte repräsentative Durchschnittswerte für die jeweiligen Ladezeiten im Browser zu errechnen.
Im Ergebnis stand Magento 2 im Vergleich zu Magento 1 derart schlecht da, dass Magento sich direkt an Amasty wandte, um einige Anpassungen des Testszenarios vorzuschlagen. Es wurden erneut Tests durchgeführt und schließlich vor allem drei Ergebnisse festgehalten:
- Magento 2 ohne Full-Page-Cache einzusetzen, ist absolut nicht zu empfehlen. Dafür erzielte der out-of-the-box integrierte FPC sehr gute Werte, die Varnish in den Vergleichstests nur minimal übertreffen konnte. Hierzu allerdings wurde angemerkt, dass diese Differenz bei höherer Last auf dem Server – also bei mehr als den fünf simulierten Besuchern – deutlicher ausfallen würde. Eine FPC-Engine ist bei der Arbeit mit Magento 2 also generell unbedingt erforderlich, während der Einsatz des Varnish Cache gegenüber dem Magento FPC erst bei Shops mit viel Traffic noch einmal nennenswerte Verbesserungen der Performance bringt.
- Der Developer Mode von Magento 2 ist extrem langsam. Im Production Mode läuft das System vergleichsweise schnell.
- Da Magento 2 keine Suchergebnisse im Cache vorhält, ist der Einsatz einer schnellen Suchengine, die nicht auf MySQL basiert, sehr zu empfehlen. Bislang ist Solr für die Katalogsuche allerdings den Nutzern von Magento Enterprise Edition vorbehalten.
2. Test: Magento 1 vs. Magento 2 (MageCore)
Auch im Vorfeld eines Anfang des Jahres von MageCore durchgeführten Vergleichstests, dessen Ergebnisse Dima Soroka im Februar in seinem Blog-Beitrag rekapituliert hat, gab es enge Abstimmungen mit dem Technik-Team von Magento. Auch bei diesem Test liefen Magento 2.0 und Magento 1.9 auf identischer Hardware gegeneinander. Während in Magento 2 der vorinstallierte Varnish Cache eingesetzt wurde, erhielt die Magento 1.9 Instanz durch die Extension Phoenix_VarnishCache ihren FPC. In beide Systeme wurden Datenbanken mit vorbereiteten, identisch zusammengesetzten CMS-Inhalten und Produktkatalogen eingespielt. In automatisierten Tests wurde dann die jeweilige Antwortzeit des Servers bei realistischen Aktionen von Testnutzern (Startseite aufrufen, zufällige Kategorie aufrufen, zufällige Kategorie mit Layer-Filter aufrufen, Suchergebnis öffnen, nächste Suchergebnisseite aufrufen, zufälliges einfaches Produkt aufrufen, zufälliges einfaches Produkt zum Warenkorb hinzufügen, zufälliges Gruppenprodukt aufrufen, zufälliges Gruppenprodukt zum Warenkorb hinzufügen, zufälliges konfigurierbares Produkt aufrufen, zufälliges konfigurierbares Produkt zum Warenkorb hinzufügen, Warenkorb öffnen, als Bestandskunde zur Kasse gehen, als neuer Kunde zur Kasse gehen, als Gast zur Kasse gehen) gemessen.
Auch in diesem Test wurde mehr als deutlich, dass Magento 2 im Vergleich mit Magento 1 weitaus schlechter abschneidet, wenn man die Systeme auf gleicher Hardware und in identischen Szenarien testet. So kommt MageCore zu dem Schluss, dass Magento 2 nur auf sehr leistungsfähigen Systemen eingesetzt werden sollte. Immerhin war die Performance von Magento 1.9 auf einem Server mit schmalen 4 CPU-Kernen und gerade einmal 8 GB RAM beim Einsatz von Magento 2 erst auf einem System mit großzügigen 36 CPU-Kernen und satten 60 GB RAM ungefähr in gleicher Qualität zu erreichen. Als besondere Schwachstellen fielen die Ladezeiten bei bestimmten Aktionen wie dem Aufrufen eines konfigurierbaren Produkts oder beim Aufgeben der Bestellung in Magento 2 auf.
3. Test: Magento 1 vs. Magento 2 mit PHP 7 (MageCore)
In seinem Blogbeitrag vom April 2016 fasst Dima Soroka die Ergebnisse eines weiteren aufschlussreichen Tests von MageCore zusammen. Wieder ging es um den direkten Vergleich von Magento 1.9 und Magento 2.0 – diesmal jedoch mit einer entscheidenden Veränderung in der Serverumgebung: anstelle von PHP 5 wurde nun PHP 7 eingesetzt (genauer: anstelle von PHP 5.5.30 war in diesem zweiten Testszenario PHP 7.0.3 im Einsatz). Als Hardware diente diesmal das leistungsfähigere System aus dem ersten Test (36 CPU-Kerne und 60 GB RAM). Lediglich am Rande der Performance-Analyse wurde noch einmal auf kleinerer Hardware schrittweise ausgetestet, wie sich die Antwortzeiten auf unterschiedlich zugeschnittenen Servern verändern.
Im Ergebnis blieb auch in diesem Test die Performance von Magento 2 noch signifikant hinter derjenigen von Magento 1 zurück. Allerdings schmolz der mit PHP 5 noch eklatante Unterschied zwischen den Systemen auf ein weit geringeres Maß zusammen. Unterm Strich lässt sich festhalten, dass Magento 2 auch beim Einsatz von PHP 7 noch weitaus mehr CPU-Ressourcen in Anspruch nimmt als seine Vorgängerversionen, während die Antwortzeiten weiterhin merklich länger ausfallen. Es bleibt also ein nicht nur im Labor messbarer, sondern auch in der User-Experience spürbarer Unterschied zwischen Magento 1 und Magento 2. MageCore weist aber – wie schon im Zusammenhang mit dem ersten Vergleichstest aus dem Dezember – darauf hin, dass von Magento 2 nach den grundlegenden Änderungen in der Systemarchitektur in den folgenden Releases noch deutliche Verbesserungen in Sachen Performance zu erwarten sind. Immerhin haben die Magento 1.xer Versionen ja auch einige Jahre gebraucht, bis die Performance das aktuelle Niveau erreicht hatte.
Und wie sieht es in der Praxis aus?
Die Ergebnisse der Tests haben wir mit unseren eigenen praktischen Erfahrungen, die wir in den vergangenen Monaten mit Magento 2 gesammelt haben, konfrontiert. Grundsätzlich konnten wir die Schlussfolgerungen aus den Messergebnissen auch im Blick auf die Praxis bestätigen. Allerdings kommen wir dabei zu einer zweigeteilten Einschätzung.
Einerseits ergibt der Blick in die durch Tests bestätigte Theorie ein ziemlich klares Bild: Die Softwarearchitektur von Magento 2 ist deutlich komplexer und dadurch von vornherein langsamer als diejenige von Magento 1. Daher sollte Magento 2 immer auf leistungsfähiger Hardware mit viel CPU-Power laufen. Hinzu kommt, dass der Developer Mode von Magento 2 derart langsam ist, dass das System nach Möglichkeit stets im Production Mode laufen sollte. Auch die mitgelieferte Unterstützung für Full-Page-Caching sollte in Magento 2 in jedem Fall eingesetzt werden, für Shops mit größerer Last auch in Kombination mit Varnish. Und außer Frage steht: Der Einsatz von PHP 7 verbessert die Performance von Magento 2 noch einmal signifikant.
Andererseits ist es mit der Umsetzung dieser Empfehlungen in der Praxis nicht immer gar so einfach. Denn erstens funktioniert der Production Mode in Kombination mit Drittanbieter-Extensions teilweise nicht zuverlässig, so dass man von Fall zu Fall doch notgedrungen den langsamen Developer Mode nutzen muss. Zweitens verhält es sich mit dem Full-Page-Cache analog: Auch hier bereiten einigen Extensions von Drittanbietern Probleme. Und schließlich kann auch die Beschleunigung der Ausführung mit PHP 7 an einigen neuen Extensions scheitern, da diese nur ältere PHP-Versionen unterstützen.
Wie bekommt man Magento 2 schnell?
Leider ist Magento 2 nicht so schnell wie versprochen. Die Verbesserungen in der Systemarchitektur bringen zwar mehr Stabilität und Sicherheit, aber das neue System verschlingt dafür deutlich mehr Ressourcen als die Vorgängerversionen. Die integrierten Tools für die Performance-Optimierung in Magento 2 werden – wie oben beschrieben – immer wieder durch Extensions ausgebremst. Die Spielräume im Rahmen des Systems selbst sind derzeit also noch außerordentlich eng. Daher ist das Hosting in den Fokus unserer Überlegungen und Bemühungen für schnelle Magento 2 Shops gerückt. Wie bereits erwähnt, ist der Einsatz leistungsfähiger Hardware für Magento 2 unabdingbar. Aber geht es wirklich nur mit brutalster Rechenpower? Nicht unbedingt.
Wir setzen lieber auf eine ausgewogene Kombination aus schneller, aber bezahlbarer Hardware und einer fein austarierten Software-Umgebung auf dem Server. Ein vorgeschalteter Varnish Cache, das von uns bereits im vergangenen Jahr näher beleuchtete Google Pagespeed Modul, HHVM und eine Suchengine wie Elasticsearch sind die Bausteine, mit denen sich auch für Magento 2 Onlineshops die perfekte Umgebung für kurze Antwort- und Ladezeiten sowie extrem schnell ladende Suchergebnisse und damit eine hervorragende User Experience im Shop schaffen lässt.
Fazit
Am Ende lässt sich also festhalten, dass Magento 2 für gute Performance sehr fein abgestimmtes Hosting mit einer intelligenten Softwareumgebung auf leistungsfähiger Hardware benötigt, da die out-of-the-box in das System integrierten Komponenten zur Performance-Optimierung aktuell noch häufig mit Drittanbieter-Extensions kollidieren.
Caching:
Alan Kent hat hier schön beleuchtet, wie das Caching bei Magento 2 generell aufgebaut ist: https://alankent.me/2014/12/09/magento-2-caching-overview/
Insbesondere der Hinweis auf ESI zur Ausklammerung von dynamischen Inhalten vom Caching (mit oder ohne Varnish) ist wichtig, denn durch massiven Einsatz von ESI kann ein Shop mit Varnish Caching sogar langsamer werden als ohne Varnish. In Magento 1 kapseln wir daher die dynamischen Inhalte mit Javascript und arbeiten ohne ESI (siehe auch http://fbrnc.net/blog/2011/05/magento-varnish-ajax-vs-esi). Dafür entstehen natürlich immer Programmieraufwände – aber der Shop soll ja schnell sein…. Magento 2 arbeitet mit ESI und Javascript (Ajax) zugleich und ist damit ab Installation bereits gut für den Einsatz von Varnish Full Page Caching justiert.
Production Mode:
Magento 2 ist komplexer als Magento 1 und daher braucht man auf jeden Fall Caching für schnelle Shops.
Man kann Magento 2 daher nur im Produktionsmodus betreiben. Bei der Auswahl von Extensions muß immer zunächst ausgetestet werden, ob diese mit dem Produktionsmodus kompatibel sind. Zur Not sollte man dann lieber auf eine Extension verzichten – der Betrieb des Shops im Entwicklungsmodus wäre einfach zu langsam.
PHP Laufzeit:
In Magento 1 beschleunigen wir die Ausführung von PHP durch HHVM von Facebook (http://hhvm.com/). Der PHP Code wird dann kompiliert und direkt ausgeführt. Mit Magento 2 kann man abwarten, bis Magento 2 mit PHP 7 kompatibel ist, denn das bringt die Kompilierung bereits mit.
Beim gestrigen Vortrag auf dem Magento Stammtisch Hamburg (http://www.magento-stammtisch-hamburg.de/) hatte Sebastian (vielen Dank an @sebasti1405) für Magento 1 auf die Extension von Inchoo hingewiesen https://github.com/Inchoo/Inchoo_PHP7 – mit der man Magento 1 auch mit PHP 7 ausführen kann. Wessen Shop mit HHVM nicht lauffähig ist, kann somit auch diesen Weg zu einem schnellen Shop wählen.
Die Extension funktioniert leider erst ab Magento 1.9.2.2 – für ältere Shops bleibt es somit bei HHVM.