Donnerstag, 15. Januar 2009

Magento-Perfomanceoptimierung mit wenigen Mausklicks

Die Steigerung der Performance von Magento steht bei den meisten Magento-Entwicklern ganz oben auf der Liste. Denn je schneller Magento arbeitet, desto besser ist das für das Geschäft. Dabei lässt sich die Magento-Performance in wenigen Minuten und mit nur einigen Mausklicks enorm verbessern.

Eine der wichtigsten Verbesserungen, die man an seiner Magento-Installation vornehmen kann ist die richtige Konfiguration des MySQL-Datenbankservers. Um MySQL richtig zu konfigurieren, sollte man sich zu Beginn einige Informationen über seine Hardware und die Speicherkapazitäten (RAM) verschaffen.

Es gibt einen speziellen Parameter bei der Konfiguration von MySQL, der große Performance-Steigerungen erlaubt, aber nur wenig Vorkenntnisse für die Umsetzung erfordert: Query Caching.

Die wirkungsvollste Stellschraube zur Verbesserung der Performance von Magento heißt “Geld”. Die zweitwichtigste liegt in der Query-Konfiguration des MySQL-Cache.

Magento Commerce ist eine Datenbank-Anwendung, die viele Datenbankzugriffe und Leseoperationen erfordert. Magento startet aber auch immer wieder viele gleiche Anfragen, wenn eine Seite aufgerufen wird, ohne dass es zwischenzeitlich große Änderungen gegeben hätte.

Bei jedem Aufruf einer Magento-Seite werden etliche Datenbank-Abfragen gestartet, die der Datenbank-Server verarbeiten muss. Jede Abfrage wird erst geparst und dann ausgeführt. Dann müssen die Daten von der Festplatte oder einem anderen Speichermedium gelesen, sortiert, verarbeitet und schließlich an den Client zurückgegeben werden. Dadurch sinkt die Performance, unter anderem weil der Zugriff auf die Festplatte langsamer wird.

MySQL verfügt über einen Konfigurationsparameter, der sich query_cache_size nennt. Diese Konfigurationsanweisung sagt dem MySQL-Server, dass er die Abfrageergebnisse im Speicher ablegen soll. Dort sind sie viel schneller erreichbar als auf der Festplatte.

Die tatsächliche Größe dieses Caches und die Anzahl der darin befindlichen Abfrage-Ergebnisse hängt davon ab, wieviel Speicher ihrem MySQL-Datenbankserver zur Verfügung steht. In einer Hosting-Umgebung mit 1 GB RAM ist ein Query Cache von 64MB oder mehr möglich, abhängig von der weiteren Verwendung des Speichers z.B. durch andere Dienste, die auf dem Server laufen.

Damit können 64MB an Abfragen im sehr schnellen RAM oder Speicher der Hosting-Umgebung gespeichert werden. Man muss nicht bei jeder Anfrage oder beim Laden jeder einzelnen Seite auf die Festplatte zugreifen. Denn dabei sind riesige Datenmengen im Spiel.

Und das ist die richtige Gelegenheit, auf einen Bug im MySQL Query Cache hinzuweisen, der zeigt, dass größer nicht immer besser ist. Es kann eine ganze Weile dauern, bis man einen ausreichend großen Teil des Query Cache außer Kraft gesetzt hat. Bis es so weit ist, ist der Server eingefroren, und es können keine anderen Operationen mehr durchgeführt werden. Dieser Patch löst dieses Problem, indem er die Locks, die das Einfrieren verursachen, verschiebt und den Query Cache temporär deaktiviert, bis die Aktion abgeschlossen ist.

Man sollte die Größe für den Query Cache nicht zu hoch ansetzen. Je größer der Query Cache, desto größer die Auswirkungen der Datenvalidierung, die MySQL im Cache durchführt, wenn sich eine Tabelle verändert und der Datensatz im Cache nicht mehr gültig ist. Der Query Cache sollte also nicht größer als nötig sein.

Bei einer Magento-Installation mit mehr als 80.000 Produkten haben 64MB die Performance im Vergleich zu einem deaktivierten Query Cache um mehr als das 10-fache verbessert. Die tatsächliche Kapazität des Cache liegt unter 50%, so dass der Cache auf bis zu 64 MB wachsen kann.

Die Performance lässt sich durch diese eine Veränderung bei der Konfiguration um 100-1000% verbessern, je nach Abfrage und Festplatte.


Shared vs. Dedicated Server

Der MySQL Query Cache ist standardmäßig deaktiviert und sagt MySQL, wieviel RAM für diesen Cache verwendet werden soll und wie viele Anfragen gecached werden können. Der Cache wird immer gelöscht und mit jeder Abfrage neu aufgebaut, nachdem der MySQL-Server neu gestartet wurde.

In einer Produktdatenbank mit mehr als 80.000 Artikeln hat unser Test ohne Query Cache über 11 Sekunden gedauert.

Wurde der Query Cache verwendet, hat die gleiche Abfrage nur gut 1 Sekunde gedauert.

Das zeigt, wie wichtig eine dedizierte Hosting-Umgebung für E-Commerce-Seiten ist. Denn damit wird der MySQL-Datenbank-Dienst sehr viel stabiler. Und das ist nur einer der Vorteile gegenüber dem kostengünstigeren Shared Hosting. Mehr dazu gibt´s im übrigen in unsere Magento-Hosting-Übersicht.

Denn dort kann der Datenbankserver täglich oder manchmal sogar stündlich neu gestartet werden. Und bei jedem Start des MySQL-Servers verliert man den Query Cache, so dass man mit jeder neuen Anfrage immer länger warten muss, bis sich die Seite aufgebaut hat.

Wie stellt man fest, ob das Query Caching aktiviert ist?

Setzen Sie dazu folgenden Befehl aus ihrer MySQL-Kommandozeile ab:

mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+

Wenn sie ein Standard MySQL Binary verwenden, ist dieser Wert immer YES, auch wenn das Query Caching deaktiviert ist. Es wäre also zu früh, sich jetzt schon zu freuen.

Um festzustellen, ob der Query Cache auch tatsächlich arbeitet, müssen sie folgenden Befehl an den MySQL server schicken:

mysql> SHOW VARIABLES LIKE 'query_cache_size';
+------------------+----------+
| Variable_name | Value |
+------------------+----------+
| query_cache_size | 67108864 |
+------------------+----------+
1 row in set (0.00 sec)

Hier erkennt man, dass 64MB für den Query Cache zur Verfügung stehen, was ein guter Wert ist.

Folgende Antwort liefert ein Server, bei dem der MySQL Query Cache deaktiviert ist, weil der Wert auf 0 gesetzt wurde:

mysql> SHOW VARIABLES LIKE 'query_cache_size';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| query_cache_size | 0 |
+------------------+-------+
1 row in set (0.00 sec)

Wenn sie einen Root-Zugang besitzen, können sie dies leicht ändern. Fügen sie einfach folgende Zeilen in ihr my.conf file im [mysqld]-Bereich ein und starten sie den MySQL Server neu:

query_cache_size=32M

Query caching ist eine sehr wirkungsvolle und einfache Methode, um die Performance von Magento innerhalb weniger Minuten zu steigern. Beim Query Caching gibt es noch etliche andere Konfigurationsparameter, die auch berücksichtigt werden sollten, wenn der MySQL-Server konfiguriert wird, z.B.

query_cache_type
query_cache_min_res_unit
query_cache_limit

Prüfen sie dieses zusätzlichen Konfigurationsparameter, bevor sie die Query Cache Konfiguration implementieren.

Dadurch wird die Performance nicht nur noch weiter verbessert, sondern auch ihr Verständnis dafür, wie ihre MySQL-Konfiguration die Performance und Geschwindigkeit von Magento beeinflussen können.


Quelle: Crucial Web Hosting

1 Kommentare:

Dierk Landmann hat gesagt…

Sehr feine Anleitung. Es funktioniert wunderbar. Danke!

Für alle OS X User möchte ich folgendes hinzufügen. Wenn man MAMP verwendet findet man unter /Programme/MAMP/Library/share/mysql vier verschiedene vorbereitete my.cnf Dateien. OS X nutz aber immer die my.cnf im Verzeichnis /etc. Oft gibt es diese Datei nicht und MAMP verwendet die Standardeinstellungen. Ich verwende immer die my_huge.cnf aus dem MAMP-Verzeichnis (siehe oben). Diese muss nach /etc/my.cnf kopiert werden und angepasst werden. Der Wert für query_cache_size steht dort bereits auf 32MB. reicht oft schon aus - wer mehr benötigt editiert einfach die Datei mit

vi /etc/my.cnf (oder mit einem anderen Editor seiner Wahl)

Zum Testen einfach im Terminal mysql aufrufen. Da bei MAMP das mysql-Kommando nicht gefunden werden kann. muss man den kompletten Pfad eingeben.

/Applications/MAMP/Library/bin/mysql

und kann dann mit SHOW VARIABLE LIKE 'query_cache_size' der Wert überprüft werden.

Bitte nicht das Neustarten des Servers vergessen!

Cheers und viel Spaß