Magento Performance Tuning – MySQL query_cache
Allgemein haben tolle Sachen meistens ihren Preis. Bei Magento ist dies nicht anders. Das zugegeben sehr flexible DB-system von Magento ist leider auch nicht das schnellste.
Wie man dem dicken Nilpferd namens Magento etwas auf die Sprünge helfen kann, möchte ich heute in diesem Blogeintrag zeigen.
DIE CACHES
Da ein Großteil von Magento über die Datenbank abgewickelt wird, soll dies unser erster Ansatzpunkt sein. Caches sind eines der besten Mittel um die Performance zu steigern. In der Regel wird sich dabei zu Nutze gemacht, dass häufig benötigte Daten im RAM vorgehalten werden.
Im Falle des MySQL query caches werden, wie der Name schon andeutet, die Ergebnisse von MySQL Abfragen zwischengespeichert, was die Antwortzeiten nachfolgender Anfragen deutlich erhöht.
AN DIE MYSQL-CONSOLE
Ran an den Speck bzw. die MySQL-Console. Zuerst überprüfen wir, ob query_cache support vorhanden ist:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
Support ist also vorhanden, aber ist der Cache auch tatsächlich aktiviert?
mysql> SHOW VARIABLES LIKE 'query_cache_size';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| query_cache_size | 0|
+------------------+-------+
Ein Wert von 0 bedeutet, dass der Cache deaktiviert ist. Der Cache muss mindestens eine Größe von 40kb haben, um aber Abfragen halten zu können, sollte mindestens 1mb zugewiesen werden:
mysql> SET GLOBAL query_cache_size = 1000000;
Query OK, 0 rows affected (0.03 sec)
mysql> SHOW VARIABLES LIKE 'query_cache_size';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| query_cache_size | 999424 |
+------------------+--------+
1 row in set (0.00 sec)
Jetzt gilt es nur noch den Typ des query caches festzulegen, um erste Resultate zu sehen:
mysql> SHOW VARIABLES LIKE 'query_cache_type';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| query_cache_type | ON |
+------------------+-------+
1 row in set (0.00 sec)
Die Variable kann 3 Werte haben:
0 oder OFF: Keine Anfragen cachen
1 oder ON: Alle Anfragen cachen, bis auf Anfragen die mit SELECT SQL_NO_CACHE beginnen
2 oder DEMAND: Keine Anfragen cachen, bis auf Anfragen die mit SELECT SQL_CACHE beginnen
Type ist also ON. Wenn sie jetzt ein SELECT ihrer Wahl zweimal ausführen, werden sie bei der 2. Anfrage eine deutliche kürzere response time sehen können.
MAXIMALE CACHEGRÖßE DEFINIEREN
Um zu verhindern, dass besonders große Anfragen den Cache “verstopfen”, kann mit query_cache_limit die maximale Größe von Anfragen definiert werden.
mysql> SHOW VARIABLES LIKE 'query_cache_limit';
+-------------------+---------+
| Variable_name | Value |
+-------------------+---------+
| query_cache_limit | 1048576 |
+-------------------+---------+
1 row in set (0.00 sec)
Ein Wert von 1mb ist in der Regel ausreichend, jedoch sollte zumindest in der Anfangszeit regelmäßig überprüft werden, ob eine Veränderung nach oben oder unten nötig ist.
mysql> show status like 'qc%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 1046213 |
| Qcache_hits | 1 |
| Qcache_inserts | 1 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 1 |
| Qcache_queries_in_cache | 1 |
| Qcache_total_blocks | 5 |
+-------------------------+----------+
Qcache_free_blocks zeigt die Fragmentation des Caches an. Ein hoher Wert kann durch ein FLUSH QUERY CACHE behoben werden. Dabei wird der Cache nicht gelöscht.
CACHE-AUSLASTUNG
Qcache_free_memory zeigt, wie viel Platz noch im Cache vorhanden ist. Falls über längere Zeit der Cache weniger als 25% ausgelastet ist, sollte man über eine Verkleinerung des Caches nachdenken. Natürlich gilt im anderen Fall das Gegenteil. Ist der Cache ständig auf 100%, sollte die Cachegröße erhöht werden. Dabei gilt jedoch zu beachten, dass größer nicht immer besser ist. Ab extremen Größen frisst die Verwaltung des riesigen Caches einen Großteil des Performancegewinns den man durch den Cache erhält.
Qcache_hits und Qcache_inserts zeigen die Anzahl der Anfragen, die durch den Cache bedient wurden bzw. die Anzahl von Anfragen, die gecached wurden. Ein niedriges Verhältnis von bedienten zu gespeicherten Anfragen deutet auf eine niedrige Effizienz des Caches hin. Abhilfe schafft hier ein Erhöhen des query_cache_limit.
Ein weiteres Indiz für eine niedrige Cache Effizienz kann an der Variable Qcache_lowmem_prunes abgelesen werden. Sie zeigt an, wie oft MySQL gespeicherte Anfragen aus dem Cache löschen musste, um Platz für neue ankommende Anfragen zu schaffen.
Qcache_not_cached schließlich stellt die Anzahl der Anfragen dar, die vom Cache nicht gespeichert wurden.
ZUM SCHLUSS
Auf feste Empfehlungen der Cache Einstellungen für einen Magento Shop möchte ich hier verzichten, sie sollten immer an die jeweiligen Anforderungen angepasst werden. Am besten beginnt man mit einer Cache Größe von 64mb und den Standardeinstellungen. Nach 24h überprüft man die Cache Statistiken und nimmt eventuelle Anpassungen vor.
Viel Spass beim ausprobieren!
Kommentare
Unsere neusten Blogartikel
- Casestudy Magento-Upgrade...
- 28.04.2011
- Mobile Media II -...
- 14.04.2011
- Mobile Media – der neue...
- 14.04.2011
- Magento Performance Tuning –...
- 30.03.2011
- Magento Checkliste
- 22.03.2011
- One step further: Facebook...
- 16.03.2011
- Das neue Workspace von Typo3...
- 16.02.2011
- Magento + Facebook Vol.2
- 02.02.2011
- Magento + Facebook
- 24.01.2011
- Navigation -...
- 17.01.2011
Neueste Kommentare
- 1000 Dank
- 23.01.2011 19:08
- Affiliate Netzwerke
- 16.11.2010 16:16
- Affiliate-Netzwerke
- 20.10.2010 11:39
- Literatur
- 17.08.2010 18:05

Kommentar verfassen