41
Performance durch Caching Fabrizio Branca System Developer bei AOE media Mail: mail (at) fabrizio (minus) branca (dot) de Twitter: @fbrnc Blog: http://www.fabrizio-branca.de

Performance durch Caching

  • Upload
    aoe

  • View
    4.101

  • Download
    0

Embed Size (px)

DESCRIPTION

Die Folien zum Vortrag "Performance durch Caching (Teil 2)" von Fabrizio Branca auf der Meet Magento #5 2011 in Leipzig

Citation preview

Page 1: Performance durch Caching

Performance durch Caching

Fabrizio BrancaSystem Developer bei AOE media

Mail: mail (at) fabrizio (minus) branca (dot) de

Twitter: @fbrnc

Blog: http://www.fabrizio-branca.de

Page 2: Performance durch Caching

Ein-führung

Agenda

Probleme und Optimierungen

Reverse Proxy Caching

mit Varnish

Page 3: Performance durch Caching

Ein-führung

Agenda

Probleme und Optimierungen

Reverse Proxy Caching

mit Varnish

Page 4: Performance durch Caching

Funktionsweise Cache

Mage::app()->getCacheInstance()Mage_Core_Model_Cache

Mage::app()->getCache() oderMage::app()->getCacheInstance()->getFrontend()Varien_Cache_Core

… extendsZend_Cache_Backend

Page 6: Performance durch Caching

Ein-führung

Agenda

Probleme und Optimierungen

Reverse Proxy Caching

mit Varnish

Page 7: Performance durch Caching

Alte Cache-Einträge entfernen

• Problem: Abgelaufene Cache-Einträge werden

nicht gelöscht und sammeln sich an.

• Je größer der Cache, desto langsamer der

Zugriff

Page 9: Performance durch Caching

Alte Cache-Einträge entfernen

Page 10: Performance durch Caching

Probleme im Database Cache Backend:

• Fehlerhaftes SQL– Einige „?“ fehlen

• Tags werden nicht gelöscht– In 0.8.22 wurde ein Foreign-Key eingefügt, der die

Tags „on delete“ löscht. In 0.8.27 wurde der Key

wieder entfernt.

• Patch:https://gist.github.com/971318

Alte Cache-Einträge entfernen

Page 11: Performance durch Caching

• Wird innerhalb Magento sehr oft verwendet

• Wird vom APC Backend nicht unterstützt

• Kann extrem lange dauern, wenn das File Backend verwendet wird.

– Lösung: Cache-Commands abfangen, in eine Queue schreiben und asynchron abarbeiten.

– Beschleunigt außerdem auch den Import-Vorgang

– http://www.fabrizio-branca.de/magento-asynchronous-cache.html

– https://github.com/fbrnc/Aoe_AsyncCache

Problem: Tag-Basiertes Löschen

Page 12: Performance durch Caching

Bug: 1st-Level Cache Priorität

Page 13: Performance durch Caching

Bug: 1st-Level Cache Priorität

Page 14: Performance durch Caching

Bug: 1st-Level Cache Priorität

class Varien_Cache_Core extends Zend_Cache_Core {[…]public function save($data, $id = null, $tags = array(), $specificLifetime = false, $priority = 8) {

$tags = $this->_tags($tags);return parent::save($data, $id, $tags, $specificLifetime, $priority);

}[…]

}

class Zend_Cache_Backend_TwoLevels […] {

private function _getFastLifetime($lifetime, $priority, $maxLifetime = null) {[…]$fastLifetime = (int) ($lifetime / (11 - $priority));[…]return $fastLifetime;

}

}

$priority = 10

Page 15: Performance durch Caching

Bug: 1st-Level Cache Priorität

• Patch:https://gist.github.com/971320

Page 17: Performance durch Caching

Ein-führung

Agenda

Probleme und Optimierungen

Reverse Proxy Caching

mit Varnish

Page 18: Performance durch Caching

Reverse proxy caching

Browser Magento(Apache + PHP + Mysql)

Request

Response

Page 19: Performance durch Caching

Reverse proxy caching

Browser Magento(Apache + PHP + Mysql)

Varnish

Page 20: Performance durch Caching

Reverse proxy caching

Browser VarnishNginx Magento(Apache + PHP + Mysql)

-Verschlüsselung / Entschlüsselung (SSL)-Kompression

Page 21: Performance durch Caching

Reverse proxy caching

Browser VarnishNginx Magento(Apache + PHP + Mysql)

Page 22: Performance durch Caching

Varnish

HTTP Accelerator

Caching Reverse Proxy

LoadBalancer

Failover system

„Varnish makes websites fly“

Page 23: Performance durch Caching

• Entwickelt von Poul-Henning Kamp

• Varnish Configuration Language (VCL)

– DSL, wird intern in C Code übersetzt und

dann compiliert

• Varnish überlässt die Thread- und

Speicherverwaltung dem Betriebssystem

• Weitere Tools: varnishtop, varnishlog,…

• Online-Dokumentation:

http://www.varnish-cache.org/docs/2.1/

Varnish

Page 24: Performance durch Caching

• In Ubuntu:sudo apt-get install varnish

sudo vi /etc/default/varnish

START=yes

sudo /etc/init.d varnish start

• Wird in Zukunft automatisch gestartet

• Läuft per default auf Port 6081

• Verwendet per default 127.0.0.1:8080 als Backend

• /etc/varnish/default.vcl

Installation

Page 26: Performance durch Caching

• cms_index_index (Startseite)

• cms_page_view (CMS Seiten)

• catalog_product_view (Produkt-Singleviews)

• catalog_category_view (Produkt-Listen)(Muss ggf. an die Anforderungen und Besonderheiten des Shops angepasst

werden)

Cachebare Seiten

aller Page-Requests(geschätzt)

Page 27: Performance durch Caching
Page 28: Performance durch Caching

Dynamische (benutzerspezifische)

Inhalte

Page 29: Performance durch Caching

Platzhalter für dynamische Teile

<layout><default>

<reference name="right">

<block type="core/text" name="ph_cart" before="-"><action method="setText"><param><![CDATA[

<div id="cart_sidebar" class="placeholder" rel="cart_sidebar">Placeholder Cart</div>

]]></param></action></block>

<action method="unsetChild"><param>cart_sidebar</param></action>

</reference></default>

</layout>

Page 30: Performance durch Caching

• Sendet HTTP Header um Varnish zu

steuern.

• Bindet JavaScript ein, das die

dynamischen Inhalte holt und die

Platzhalter ersetzt.

• Controller, der die dynamischen Inhalte

ausliefert.

• https://github.com/fbrnc/Aoe_Static

• https://github.com/fbrnc/Aoe_StaticDemo

Modul „Aoe_Static“

Page 31: Performance durch Caching

Ablauf cachebare Seiten

Seite anfordern (HTTP Request)

Statische Seite wird ausgeliefert

Seite anfordern

Statische Seite wird ausgeliefert.Platzhalter für dynamische Teile.

Cache-Control Header

Ajax Request fordert dynamische Inhalte anund übermittelt gerade angesehenes Produkt

JSON Response mit dynamischen Inhalten

Platzhalter werden ersetztSession Cookie wird geschrieben

Seite wird gerendert

Browser Varnish Magento

Page 32: Performance durch Caching

Ablauf nicht-cachebare Seiten

Seite anfordern (HTTP Request)

Seite wird ausgeliefert

Seite anfordern

Seite wird gerendert

Browser Varnish Magento

Page 33: Performance durch Caching

VCL

sub vcl_recv {if (req.http.x-forwarded-for) {

set req.http.X-Forwarded-For =req.http.X-Forwarded-For ", " client.ip;

} else {set req.http.X-Forwarded-For = client.ip;

}if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT"

&& req.request != "POST" && req.request != "TRACE" && req.request != "OPTIONS" && req.request != "DELETE") {/* Non-RFC2616 or CONNECT which is weird. */return (pipe);

}if (req.request != "GET" && req.request != "HEAD") {

/* We only deal with GET and HEAD by default */return (pass);

}if (req.http.Authorization || req.http.Cookie) {

/* Not cacheable by default */return (pass);

}return (lookup);

}

Page 34: Performance durch Caching

VCL

sub vcl_hash {set req.hash += req.url;if (req.http.host) {

set req.hash += req.http.host;} else {

set req.hash += server.ip;}return (hash);

}

Page 35: Performance durch Caching

VCL

sub vcl_fetch {if (beresp.status == 302 || beresp.status == 301 || beresp.status == 418) {

return (pass);}

if (beresp.http.aoestatic == "cache") {remove beresp.http.Set-Cookie;remove beresp.http.X-Cache;remove beresp.http.Server;remove beresp.http.Age;set beresp.grace = 2m;set beresp.http.X_AOESTATIC_FETCH = "Removed cookie in vcl_fetch";

}

if (!beresp.cacheable) {return (pass);

}

return (deliver);}

Page 36: Performance durch Caching

VCL

sub vcl_deliver {if (obj.hits > 0) {

set resp.http.X-Cache = "HIT";set resp.http.Server = "Varnish (HIT)";

} else {set resp.http.X-Cache = "MISS";set resp.http.Server = "Varnish (MISS)";

}}

Page 37: Performance durch Caching

Demo

Page 38: Performance durch Caching

Benchmarks

Magentoohne Cache

0,85 Seiten/Sekunde

2,4 Seiten/Sekunde

416,67 Seiten/Sekunde

Magento mit APC+File Cache

Magentomit Varnish

Page 39: Performance durch Caching

• Anstatt AJAX: Edge Side Includes „ESI“ (W3C)<esi:include src="phone/call/getBlock/id/cart_sidebar" />

– Nachteil: langsamer, aufwendiger

• Caching dynamischer Inhalte unter Berücksichtigung der Session-Id

– Nachteil: weniger Cache Hits

• „Purge“ um geänderte Inhalte zu aktualisieren

Erweitert

Page 40: Performance durch Caching

• Varnish (inkl. Dokumentation)

http://www.varnish-cache.org

• Poul-Henning Kamp über Varnish

http://vimeo.com/16676188

• http://www.fabrizio-branca.de

• https://github.com/fbrnc

Weitere Informationen

Page 41: Performance durch Caching

Fragen?

Mail: mail (at) fabrizio (minus) branca (dot) de

Twitter: @fbrnc

Blog: http://www.fabrizio-branca.de