Performance durch Caching

  • 3,649 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,649
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
19
Comments
0
Likes
3

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Performance durch CachingFabrizio BrancaSystem Developer bei AOE mediaMail: mail (at) fabrizio (minus) branca (dot) deTwitter: @fbrncBlog: http://www.fabrizio-branca.de
  • 2. Agenda Reverse Proxy Ein- Probleme und Cachingführung Optimierungen mit Varnish
  • 3. Agenda Reverse Proxy Ein- Probleme und Cachingführung Optimierungen mit Varnish
  • 4. Funktionsweise Cache Mage::app()->getCacheInstance() Mage_Core_Model_Cache Mage::app()->getCache() oder Mage::app()->getCacheInstance()->getFrontend() Varien_Cache_Core… extendsZend_Cache_Backend
  • 5. Two-Level Cache Mehr Details: http://www.fabrizio-branca.de/magento-caching-internals.html
  • 6. Agenda Reverse Proxy Ein- Probleme und Cachingfü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
  • 8. Alte Cache-Einträge entfernen• Lösung: Regelmäßig Cache aufräumen Mage::app()->getCache()->clean(Zend_Cache::CLEANING_MODE_OLD);• Modul: Aoe_CacheCleaner http://www.fabrizio-branca.de/magento-automatic-cache- cleaner.html• Github: https://github.com/fbrnc/Aoe_CacheCleaner
  • 9. Alte Cache-Einträge entfernen
  • 10. Alte Cache-Einträge entfernenProbleme 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
  • 12. Bug: 1st-Level Cache Priorität
  • 13. Bug: 1st-Level Cache Priorität
  • 14. Bug: 1st-Level Cache Priorität $priority = 10class 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; }}
  • 15. Bug: 1st-Level Cache Priorität• Patch: https://gist.github.com/971320
  • 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 Cachingführung Optimierungen mit Varnish
  • 18. Reverse proxy caching RequestBrowser Magento (Apache + PHP + Mysql) Response
  • 19. Reverse proxy cachingBrowser Varnish Magento (Apache + PHP + Mysql)
  • 20. Reverse proxy cachingBrowser Nginx Varnish Magento (Apache + PHP + Mysql) -Verschlüsselung / Entschlüsselung (SSL) -Kompression
  • 21. Reverse proxy cachingBrowser Nginx Varnish Magento (Apache + PHP + Mysql)
  • 22. Varnish HTTP Caching Load FailoverAccelerator 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 varnishsudo vi /etc/default/varnishSTART=yessudo /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
  • 25. Request Lifecycle (vereinfacht) Kompletter Workflow: http://www.varnish-cache.org/trac/wiki/VCLExampleDefault
  • 26. Cachebare Seiten• 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) aller Page-Requests (geschätzt)
  • 27. Dynamische(benutzerspezifische) Inhalte
  • 28. 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>
  • 29. 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
  • 30. 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
  • 31. Ablauf nicht-cachebare Seiten Browser Varnish Magento Seite anfordern (HTTP Request) Seite anfordern Seite wird ausgeliefert Seite wird gerendert
  • 32. VCLsub 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);}
  • 33. VCLsub 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);}
  • 34. VCLsub 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);}
  • 35. VCLsub 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)"; }}
  • 36. Demo
  • 37. Benchmarks 416,67 Seiten/Sekunde 0,85 2,4 Seiten/Sekunde Seiten/Sekunde Magento Magento mit Magento ohne Cache APC+File Cache mit Varnish
  • 38. Erweitert• 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
  • 39. Weitere Informationen• 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
  • 40. Fragen?Mail: mail (at) fabrizio (minus) branca (dot) deTwitter: @fbrncBlog: http://www.fabrizio-branca.de