Magento

Magento-Performance: Flaschenhälse

Magento-Performance: Flaschenhals Ladezeit

Magento-Performance steigern: Der Weg zur erfolgreichen Ladezeit-Optimierung

In diesem Artikel befassen wir uns mit den mit der Ladezeit-Optimierung von Magento Shopsystemen. Magento ist ein umfangreiches Shopsystem und ist in bestimmten Konfigurationen anfällig für Performance-Probleme. Die fünf größten Fehler mit teils massiven Auswirkungen auf die Magento-Performance haben wir hier für euch aufgelistet und erklären mögliche Lösungen.

Die 5 häufigsten Fehler bei der Ladezeit-Optimierung

1) Ladezeit-Optimierung durch Verwendung der richtigen Festplatte

Magento ist wie schon erwähnt ein umfangreiches System welches in der Ausführung „Community Edition“ mehr als 15.000 Dateien beinhaltet. Das auf PHP basierende Shopsystem arbeitet mit zahlreichen Funktionen, welche die Festplatte massiv beanspruchen. Dazu gehören das Schreiben in Logfiles (access, system, exception log), das Anfordern von Files (require, file_get_contents) und das Laden von Daten aus der Datenbank. Der Einsatz einer SSD anstelle einer HDD lohnt sich beim professionellen Einsatz von Magento umso mehr, da die Magento-Performance drastisch verbessert wird.

HDD vs SSD

Bildquelle: https://blog.amasty.com

2) Ladezeit-Optimierung durch Verwendung eines Caches

Magento benutzt wie die meisten großen System ein internes System zum Cachen von Daten, um die Ladezeit zu verkürzen. Es können verschiede Cache-Arten verwendet werden, welche nachfolgende Vorteile und Nachteile mit sich bringen. Wir werden dies anhand von 3 Beispielen kurz erläutern.

2.1) APC / Memcached

Diese beiden Cache-Arten benutzen den internen Speicher (RAM) des Servers zum Cachen der Daten von Magento. Der Nachteil dieser beiden Cache-Varianten ist, dass RAM zum Beispiel auf einem Shared Server nur in Maßen zur Verfügung steht und sparsam damit umgegangen werden muss. Der Vorteil ist dass diese Cache-Arten relativ schnell sind, da sie kleine Datenmengen aus dem RAM schnell ausliefern können.

2.2) Der Datenbankcache

Der Datenbankcache ist eine separate Cache-Art und kann unabhängig von den beiden anderen Cache-Arten benutzt werden. Dieser Cache ist zuständig für das Zwischenspeichern von öfter ausgeführten Queries die sich ansonsten mit minimalen Änderungen wiederholen würden. Magento speichert diese Art von Anfrage im RAM zwischen und führt diese dann aus ohne jedes mal erneut mehrere Datenbankabfragen an den Server zu stellen. Der Datenbankcache kann bei genügend vorhandenem RAM oder schnellem Festplattenspeicher zu einer signifikanten Optimierung der Ladezeit führen, da Magento mehrere Queries pro Seitenaufruf benötigt und diese eingespart werden können.

2.3) Der Filecache

Dieser Cache benutzt das interne Dateisystem zum Vorhalten der Daten. Die Vorzüge dieser Cache-Art ist, dass er in Kombination mit einer SSD sehr schnell ist und die üblichen RAM limits von APC / Memcache getrost ignorieren kann, da er lediglich ein wenig Festplattenkapazität voraussetzt. Der Nachteil jedoch ist, dass diese Art von Cache ohne eine SSD extrem langsam ist. Wie beim Datenbankcache wird der Filecache das gesamte System ohne eine SSD mehr ausbremsen als beschleunigen.

Seit der Version 5.5 von PHP wird Zends sogenannter OpCache (Opcode-Cache) mitgeliefert und standardmäßig installiert. Dieser Opcode-Cache ist schnell und kostengünstig in der RAM-Benutzung. Sollte PHP 5.5 oder höher auf dem Magento System installiert sein, empfiehlt es sich den von PHP mitgelieferten OpCache in Kombination mit dem Filecache zu benutzen, sofern eine SSD vorhanden ist.

3) SQL Statements

Ein nicht zu verachtender weiterer Punkt in der Liste der Performance-Flaschenhälse sind SQL Statements. Dabei geht es hier nicht um eine bestimmte Art von SQL Statements, sondern um deren Verwendung. Das folgende Beispiel ist ein Auszug aus einem Magento Modul welches 9 Produkte einer Kategorie per AJAX nachlädt und im späteren Verlauf verarbeitet und ausgibt.

foreach ($this->getProductIds() as $productId){
    $product = Mage::getModel('catalog/product')->load($productId);
    $this->processProduct($product);
}

Wie im Code zu sehen ist, werden bei jedem Aufruf des PHP-Skripts die Produkt-IDs geladen und dann in einer foreach Schleife das jeweilige Produktmodel geladen. Das Problem dabei ist, dass jedes Produktmodel einzeln geladen wird und für jedes dieser Produkte mehrere Queries verwendet werden. Bei einer Anzahl von 500 Produkten sind wir somit bei sage und schreibe ca 2500-5000 SQL-Queries, je nachdem wie viele Attribute die besagten Produkte besitzen. Der richtige Weg unter Berücksichtigung der Magento-Performance und Logik sieht wie folgt aus:

$collection = Mage:getResourceModel('catalog/product_collection')
    ->addFieldsToFilter('entity_id', array($this->getProductIds()))
    ->addAttributeToSelect(array('name'));

foreach ($collection as $product){
    $this->processProduct($product);
}

Hier wird die ganze Produktkollektion nur ein mal geladen. Nachdem die Filter hinzugefügt wurden, werden die Produkte dann mit einer Schleife über die $collection variable verarbeitet. In diesem Code werden maximal ein bis zwei Dutzend SQL queries verwendet, was sich spürbar auf die gesamte Ladezeit der Seite auswirkt.

Quelle Beispiel: http://labs.octivi.com/ (Bad SQL Queries)

4) Ladezeit-Optimierung durch Verwendung vorgerenderter Bilder

Magento wird in seiner Standard-Konfiguration mit zahlreichen Bilder ausgeliefert. Sobald ein Shopbetreiber seine Produkte und dazugehörige Bilder anlegt, ist man schnell bei ~20-30 Bildern pro Kategorieseite und noch mehr Bildern auf der Produktdetailseite angelangt. Je nach Berücksichtigung der durchschnittlichen Bildgröße, so um die ~0.5-2 Megabyte an Daten betragen dürfte. Auch Bilder welche in ihrer Dimension zu groß sind, sollten vor dem Verwenden verkleinert werden, um so wertvolle Bandbreite zu sparen und mobile Shopbesucher nicht mit größeren Datenvolumen zu belasten. Die richtige Größe der Bilder sowie deren Optimierung durch ein externes Werkzeug wie optipng bewirken eine schnellere Ladezeit der Seite durch weniger Datenvolumen und macht sich schnell auch im praktischen Testen bemerkbar.

Bettwäsche Bild unkomprimiert (112 kilobytes)

Bettwäsche Bild unkomprimiert (112 Kilobyte)
Bettwäsche Bild komprimiert via http://tinypng.org/ (42 kilobytes)

Bettwäsche Bild komprimiert via http://tinypng.org/ (42 Kilobyte)

5) Steigerung der Magento-Performance durch Verwendung der neuesten PHP Version.

PHP hat seit Version 5.5 einen enormen Geschwindigkeitszuwachs erhalten. Jetzt, mit Version 7.0, ist die Sprache auf der Magento sein Grundgerüst aufbaut sogar doppelt so schnell wie sein Vorgänger PHP 5.5 bzw 5.6 und somit um ein Vielfaches schneller als das immer noch weit verbreitete PHP 5.4. Deshalb ist es empfehlenswert bei einer Magento-Installation, mindestens PHP in der Version 5.5 bzw 5.6 auf dem Server installiert zu haben. Der eingebaute Zend OpCache ab Version 5.5 beschleunigt einen frisch installierten Magento Shop um bis zu ~40% ohne jegliche Änderungen an der Konfiguration oder der Hardware. PHP Version 7.0 steigert diesen Geschwindigkeitszuwachs noch einmal um satte 100% durch die effektivere Handhabung von Arrays und großen Objekten, von welchen Magento durchweg exzessiven Gebrauch macht. Eine Magento-Installation mit PHP 7.0 lädt im Vergleich zu einer Magento installation mit PHP 5.4 um bis zu 1.6 Sekunden schneller.

Magento Antwortzeit mit PHP 7.0

Bildquelle: https://www.mgt-commerce.com/blog/

Fazit

Durch Befolgen der genannten 5 Aspekte kann man ohne viel Aufwand bereits eine spürbare Steigerung der Magento-Performance erreichen. Natürlich gibt es weitere Punkte, welche die Geschwindigkeit einer Magento-Installation beschleunigen können. Wir haben uns hier jedoch auf die Punkte mit den prozentual größten Geschwindigkeitseinbußen bei Missachtung konzentriert.

One thought on “Magento-Performance: Flaschenhälse

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert