Im Zuge des Projekts „Accessible e-Commerce“ haben wir einen barrierefreien Webshop-Prototypen auf Basis von Magento und dem damit zur Verfügung gestelltem Demo-Shop entwickelt. In Kürze wollen wir diese Anpassungen mit Hilfe von Benutzertests durch Personen aus den Zielgruppen ältere Menschen sowie Personen mit Behinderungen evaluieren.
Letztens merkte meine Kollegin dazu an, dass sich die Testinstallation teilweise extrem langsam anfühlt. Das ist für Benutzertest natürlich nicht ideal und für den tatsächlichen Betrieb eine Webshops inakzeptabel. Es war also Zeit für etwas Magento Performance-Tuning.
Status quo
Da die gefühlte Geschwindigkeit einer Website meist nur auf einem Bauchgefühl beruht und schwer quantifizierbar ist, setzten wir ApacheBench (AB) ein um hier vergleichbare Zahlen zu erhalten. Ein erster Performance-Test der Grundinstallation ergab folgende, nicht allzu berauschende Werte:
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 |
Document Path: / Document Length: 25823 bytes Concurrency Level: 5 Time taken for tests: 43.639015 seconds Complete requests: 100 Failed requests: 0 Write errors: 0 Total transferred: 2628568 bytes HTML transferred: 2582300 bytes Requests per second: 2.29 [#/sec] (mean) Time per request: 2181.951 [ms] (mean) Time per request: 436.390 [ms] (mean, across all concurrent requests) Transfer rate: 58.80 [Kbytes/sec] received Percentage of the requests served within a certain time (ms) 50% 2035 66% 2392 75% 2513 80% 2668 90% 3083 95% 3975 98% 4032 99% 4048 100% 4048 (longest request) |
Hier ist ersichtlich, dass durchschnittlich etwas mehr als 2 Seiten pro Sekunden gerendert werden können. Bei verschiedenen Testdurchläufen wurden teilweise auch Ladezeiten von bis zu 10 Sekunden registriert. Wenn so etwas passiert hat man den Kunden in der Regel schon verloren.
Maßnahmen
Um die Performance einer Website – im speziellen von Magento – zu verbessern gibt es verschiedenste Maßnahmen. Das Magento Forum bietet hier eine Übersicht von möglichen Maßnahmen. Im Folgenden sind eine Auswahl der aus unserer Erfahrung sinnvolleren Maßnahmen dargestellt.
PHP Caching
Als eine der effektivsten Maßnahmen hat sich die Aktivierung des APC – Alternative PHP Cache herausgestellt.
Dazu findet man auch schnell passende Anleitungen, wie man APC für Magento aktiviert. Nur leider brachte diese Aktivierung keinerlei Performance-Gewinn und der Server lieferte weiterhin lediglich 2 Seiten pro Sekunde aus.
Nach einigen Nachforschungen und dem Austesten verschiedenster Setups kam ich zu folgendem Ergebnis: In den gefundenen Anleitungen fehlte durchgängig der Hinweis, dass APC in Kombination mit suPHP bzw. suexec+fcgid nicht funktioniert. Im Magento Forum hat sich zum Glück jemand die Mühe gemacht verschiedene Apache/APC Konfigurationen und deren Probleme aufzulisten.
Mit dieser Erkenntnis gewappnet, wurde folgende Konfiguration: apache2 prefork + mod_php + apc
umgesetzt. Kurz vorweg, die Performance konnte um etwa den Faktor 2 gesteigert werden. Genauere Informationen finden sich weiter unten.
Nachtrag: Wie sich im Laufe intensiver Tests herausstellte, funktioniert der Magento Connect Manager bei aktiviertem APC nicht vollständig. Erweiterungen können weder installiert, noch deinstalliert werden. Als einfacher Workaround kann APC für die problematischen Stellen deaktiviert werden. Im konkreten Fall hilft folgende Anweisung in der php.ini: apc.filters = "PEAR,Pear"
.
Reduktion der Datenmenge und der Zugriffe
Wie bei jeder Website ist es sinnvoll, sich die HTTP-Zugriffe und die übertragene Datenmenge einer typischen Seite genau anzuschauen. In der Regel können hier auch wesentliche Verbesserungen erreicht werden. Zur Analyse bietet Yahoo! mit der Firefox-Erweiterung YSlow ein einfach zu bedienendes Tool an, das bei der Magento-Standardinstallation die in der folgenden Abbildung dargestellten Ergebnisse liefert.
Wie man sieht, werden hier für eine einzelne Seite 51 HTTP Requests abgeschickt und fast 650kB an Daten übertragen. Um diese zu reduzieren gibt es zwei einfache Maßnahmen:
- CSS- und JS-Dateien zusammenfassen
- die Daten komprimiert übertragen
Das Zusammenführen von CSS und JS ist aus Sicht der Wartbarkeit und für die Entwicklung nicht zu empfehlen. Oft geht man daher den Weg, dass hier für den Produktionsserver spezielle Dateien teils manuell zusammengestellt werden. Zum Glück ersparen wir uns diese Mehrarbeit bei Magento.
Dank der Fooman Speedster Extension passieren die oben genannten Maßnahmen automatisch. Nachdem die Extension installiert und konfiguriert – hier ist auf die richtigen Zugriffsrechte zu achten – wurde, ergab sich folgendes Bild:
An Hand der beiden Screenshots ist gut zu erkennen, wie die zu übertragenden Daten um mehr als die Hälfte reduziert wurden. Auch die Anzahl der HTTP-Request wurde deutlich von 51 auf 35 verringert.
Expire Header
Eine weitere Maßnahme zur Steigerung der Performance ist das Setzen der HTTP Expire-Header bei bestimmten Dateiarten (i.d.R. JS, CSS, Grafiken, …). Damit wird der Browser veranlasst die Dateien zu cachen. Sie müssen damit nicht bei jeder Seite erneut geladen werden.
Um die Expire-Header automatisch zu setzen, muss lediglich folgende Zeile in die Datei <magento-root>/.htaccess
eingefügt werden:
1 |
ExpiresActive On |
Was hat’s gebracht
Nachdem die genannten Maßnahmen abgeschlossen waren, haben wir natürlich einen abschließenden Performance-Test mit folgendem – recht erfreulichem Ergebnis – durchgeführt:
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 |
Document Path: / Document Length: 24517 byte Concurrency Level: 5 Time taken for tests: 21.43962 seconds Complete requests: 100 Failed requests: 0 Write errors: 0 Total transferred: 2497600 bytes HTML transferred: 2451700 bytes Requests per second: 4.75 [#/sec] (mean) Time per request: 1052.198 [ms] (mean) Time per request: 210.440 [ms] (mean, across all concurrent requests) Transfer rate: 115.90 [Kbytes/sec] received Percentage of the requests served within a certain time (ms) 50% 998 66% 1109 75% 1220 80% 1243 90% 1448 95% 1902 98% 2618 99% 2740 100% 2740 (longest request) |
Der Benchmark zeigt sehr gut, dass die Anzahl der ausgelieferten Seiten um mehr als den Faktor 2 erhöht wurde. Die maximale Ladezeit wurde ebenfalls um mehr als 1 Sekunde verkürzt. Bei der Benutzung fühlt sich der Shop nun auch deutlich schneller an. Die eingangs beobachteten Ladezeiten von bis zu 10 Sekunden traten nicht mehr auf. Diese Verbesserungen sind maßgeblich auf den Cache zurückzuführen.
Das Setzen der Expire-Header sowie die Optimierungen durch die Speedster Extension wirkten sich auf den verwendeten Benchmark nicht aus, da hier nur die reine HTML-Seite ohne Grafiken, JS und CSS abgefragt wird. Für echte BenutzerInnen, vor allem jene mit langsamen Internet-Verbindungen, zeigen diese Anpassungen jedoch deutliche Auswirkungen, da die zu übertragende Datenmenge um mehr als die Hälfte und die Anzahl der HTTP-Zugriffe um etwa 35% reduziert werden.
Hi, ich habe eine Frage leicht OffTopic dazu.
Ich habe mir vor ca. einem Jahr einmal diesen Shop angeschaut, und nach sehr kurzer Zeit aufgrund der unheimlich vielen Barrieren als nicht benutzbar verworfen.
Gerade habe ich mir auch noch einmal den Demoshop dahingehend angeschaut, und sehe nach wie vor Unmengen an zur Bedienung notwendigem Javascript. (Bspw. allein für das Einbinden von Vorschaubildern via Javascript sollte man … ähem.)
Da Du hier von barrierefreien Templates schreibst, ist es denn möglich, diese Unsitten mittlerweile in den Templates zu korrigieren? (Wenn ich mich Recht entsinne, war das zum Zeitpunkt meines Tests nicht möglich)
Wirst Du Dein Template zur freien Benutzung zur Verfügung stellen? Wenn nein, kann man sich wenigstens Deinen Demo-shop einmal anschauen?
Hallo Mike,
Ja, die Standardinstallation von Magento hat einige Schwächen hinsichtlich der Barrierefreiheit, wobei hier JavaScript nicht das Hauptproblem darstellt.
Magento bietet eine Vielzahl von Anpassungsmöglichkeiten, weshalb wir uns auch für dieses Shopsystem entschieden haben. Unsere Anpassungen spielen sich jedoch nicht nur in den Templates ab. Bei einigen Punkten mussten wir in den „Core“ von Magento eingereifen. Wir stehen diesbezüglich mit Varien (dem Hersteller) in Kontakt und sind bestrebt, dass unsere Anpassungen von ihnen übernommen werden.
Eine Veröffentlichung als eigene Erweiterung wäre zwar denkbar, ist derzeit aber nicht vorgesehen.
Danke für die Aufklärung.
Hi Sascha, auch ich hätte nochmal eine Nachzügler-Nachfrage zum Thema Accessibility: Wir planen auch einen barrierearmen Shop und überlegen, Magento einzusetzen.
Was waren denn die Schwächen, aufgrund derer Anpassungen am Core notwendig waren? Und: Hat Varien darauf inzwischen reagiert?
Danke und Grüße, Tom
Hallo Tom,
Hier ein paar Dinge die wir im Core geändert haben:
* Erzeugung der Breadcrumbs: Hintergrundgrafiken anstatt von Trennzeichen ‚|‘.
* Navigation der Produktkategorien: Diese haben wir als fixe Sub-Navigation umgesetzt (ursprünglich ein Filter).
* Fehlende Statusnachrichten eingefügt (Löschen, Auf die Wunschliste, …).
* Kleinere Unschönheiten beim Registrierungsprozess ausgemerzt.
Varien hat auf unsere Anfragen leider nicht reagiert. Deren Interesse dürfte leider doch nicht so groß sein wie ursprünglich kommuniziert.
LG,
Sascha
Hey,
danke für die ausführliche Erläuterung. Ich (als Magento Neuling) hatte das Problem auch schon und wusste einfach nicht weiter. Nachdem ich mich durch zahlreiche Tutorials geschlagen hatte, habe ich das hier gefunden und bin begeistert. Vielen vielen Dank das du mir da helfen konntest.
Mach weiter so! :)