1. 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
2. Agenda
Reverse Proxy
Ein- Probleme und
Caching
führung Optimierungen
mit Varnish
3. Agenda
Reverse Proxy
Ein- Probleme und
Caching
führung Optimierungen
mit Varnish
5. Two-Level Cache
Mehr Details:
http://www.fabrizio-branca.de/magento-caching-internals.html
6. Agenda
Reverse Proxy
Ein- Probleme und
Caching
führung Optimierungen
mit Varnish
7. 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
10. Alte Cache-Einträge entfernen
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
11. Problem: Tag-Basiertes Löschen
• 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
16. Weitere Probleme
• Fast cache wird immer neu geschrieben
auto_refresh_fast_cache = true
=> auto_refresh_fast_cache = false
• Kann inzwischen konfiguriert werden (default: false)
• Verzeichnistiefe des File Cache
hashed_directory_level = 1
=> hashed_directory_level = 3
• APC-Parameter (Größe, apc.stat, apc.ttl)
http://www.fabrizio-branca.de/wenn-der-apc-cache-
volllaeuft.html
17. Agenda
Reverse Proxy
Ein- Probleme und
Caching
führung Optimierungen
mit Varnish
22. Varnish
HTTP Caching Load Failover
Accelerator Reverse Proxy Balancer system
„Varnish makes websites fly“
23. Varnish
• 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/
24. Installation
• 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
30. Modul „Aoe_Static“
• 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
31. Ablauf cachebare Seiten
Browser Varnish Magento
Seite anfordern (HTTP Request)
Seite anfordern
Statische Seite wird ausgeliefert.
Statische Seite wird Platzhalter für dynamische Teile.
ausgeliefert Cache-Control Header
Seite wird
gerendert
Ajax Request fordert dynamische Inhalte an
und übermittelt gerade angesehenes Produkt
JSON Response mit dynamischen Inhalten
Platzhalter werden ersetzt
Session Cookie wird geschrieben
32. Ablauf nicht-cachebare Seiten
Browser Varnish Magento
Seite anfordern (HTTP Request)
Seite anfordern
Seite wird ausgeliefert
Seite wird
gerendert
33. 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);
}
34. 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);
}
35. 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);
}
36. 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)";
}
}