Performance durch Caching

743 views

Published on

May 18, 2011

Die Folien zum Vortrag "Performance durch Caching (Teil 2)" auf der Meet Magento #5 2011

Published in: Technology
  • Be the first to comment

Performance durch Caching

  1. 1. Performance durch CachingFabrizio BrancaSystem Developer bei AOE mediaMail: mail (at) fabrizio (minus) branca (dot) deTwitter: @fbrncBlog: http://www.fabrizio-branca.de
  2. 2. Ein-führungAgendaProbleme undOptimierungenReverse ProxyCachingmit Varnish
  3. 3. Ein-führungAgendaProbleme undOptimierungenReverse ProxyCachingmit Varnish
  4. 4. Funktionsweise CacheMage::app()->getCacheInstance()Mage_Core_Model_CacheMage::app()->getCache() oderMage::app()->getCacheInstance()->getFrontend()Varien_Cache_Core… extendsZend_Cache_Backend
  5. 5. Two-Level CacheMehr Details:http://www.fabrizio-branca.de/magento-caching-internals.html
  6. 6. Ein-führungAgendaProbleme undOptimierungenReverse ProxyCachingmit Varnish
  7. 7. Alte Cache-Einträge entfernen• Problem: Abgelaufene Cache-Einträge werdennicht gelöscht und sammeln sich an.• Je größer der Cache, desto langsamer derZugriff
  8. 8. • Lösung: Regelmäßig Cache aufräumenMage::app()->getCache()->clean(Zend_Cache::CLEANING_MODE_OLD);• Modul: Aoe_CacheCleanerhttp://www.fabrizio-branca.de/magento-automatic-cache-cleaner.html• Github:https://github.com/fbrnc/Aoe_CacheCleanerAlte Cache-Einträge entfernen
  9. 9. Alte Cache-Einträge entfernen
  10. 10. 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 dieTags „on delete“ löscht. In 0.8.27 wurde der Keywieder entfernt.• Patch:https://gist.github.com/971318Alte Cache-Einträge entfernen
  11. 11. • Wird innerhalb Magento sehr oft verwendet• Wird vom APC Backend nicht unterstützt• Kann extrem lange dauern, wenn das FileBackend verwendet wird.– Lösung: Cache-Commands abfangen, in eineQueue 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_AsyncCacheProblem: Tag-Basiertes Löschen
  12. 12. Bug: 1st-Level Cache Priorität
  13. 13. Bug: 1st-Level Cache Priorität
  14. 14. Bug: 1st-Level Cache Prioritätclass 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
  15. 15. Bug: 1st-Level Cache Priorität• Patch:https://gist.github.com/971320
  16. 16. • Fast cache wird immer neu geschriebenauto_refresh_fast_cache = true=> auto_refresh_fast_cache = false• Kann inzwischen konfiguriert werden (default: false)• Verzeichnistiefe des File Cachehashed_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.htmlWeitere Probleme
  17. 17. Ein-führungAgendaProbleme undOptimierungenReverse ProxyCachingmit Varnish
  18. 18. Reverse proxy cachingBrowser Magento(Apache + PHP + Mysql)RequestResponse
  19. 19. Reverse proxy cachingBrowser Magento(Apache + PHP + Mysql)Varnish
  20. 20. Reverse proxy cachingBrowser VarnishNginx Magento(Apache + PHP + Mysql)-Verschlüsselung /Entschlüsselung (SSL)-Kompression
  21. 21. Reverse proxy cachingBrowser VarnishNginx Magento(Apache + PHP + Mysql)
  22. 22. VarnishHTTPAcceleratorCachingReverse ProxyLoadBalancerFailoversystem„Varnish makes websites fly“
  23. 23. • Entwickelt von Poul-Henning Kamp• Varnish Configuration Language (VCL)– DSL, wird intern in C Code übersetzt unddann compiliert• Varnish überlässt die Thread- undSpeicherverwaltung dem Betriebssystem• Weitere Tools: varnishtop, varnishlog,…• Online-Dokumentation:http://www.varnish-cache.org/docs/2.1/Varnish
  24. 24. • 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 alsBackend• /etc/varnish/default.vclInstallation
  25. 25. Request Lifecycle (vereinfacht)Kompletter Workflow: http://www.varnish-cache.org/trac/wiki/VCLExampleDefault
  26. 26. • 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 angepasstwerden)Cachebare Seitenaller Page-Requests(geschätzt)
  27. 27. Dynamische(benutzerspezifische)Inhalte
  28. 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. 29. • Sendet HTTP Header um Varnish zusteuern.• Bindet JavaScript ein, das diedynamischen Inhalte holt und diePlatzhalter ersetzt.• Controller, der die dynamischen Inhalteausliefert.• https://github.com/fbrnc/Aoe_Static• https://github.com/fbrnc/Aoe_StaticDemoModul „Aoe_Static“
  30. 30. Ablauf cachebare SeitenSeite anfordern (HTTP Request)Statische Seite wirdausgeliefertSeite anfordernStatische Seite wird ausgeliefert.Platzhalter für dynamische Teile.Cache-Control HeaderAjax Request fordert dynamische Inhalte anund übermittelt gerade angesehenes ProduktJSON Response mit dynamischen InhaltenPlatzhalter werden ersetztSession Cookie wird geschriebenSeite wirdgerendertBrowser Varnish Magento
  31. 31. Ablauf nicht-cachebare SeitenSeite anfordern (HTTP Request)Seite wird ausgeliefertSeite anfordernSeite wirdgerendertBrowser Varnish Magento
  32. 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. 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. 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. 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. 36. Demo
  37. 37. BenchmarksMagentoohne Cache0,85Seiten/Sekunde2,4Seiten/Sekunde416,67Seiten/SekundeMagento mitAPC+File CacheMagentomit Varnish
  38. 38. • Anstatt AJAX:Edge Side Includes „ESI“ (W3C)<esi:include src="phone/call/getBlock/id/cart_sidebar" />– Nachteil: langsamer, aufwendiger• Caching dynamischer Inhalte unterBerücksichtigung der Session-Id– Nachteil: weniger Cache Hits• „Purge“ um geänderte Inhalte zuaktualisierenErweitert
  39. 39. • Varnish (inkl. Dokumentation)http://www.varnish-cache.org• Poul-Henning Kamp über Varnishhttp://vimeo.com/16676188• http://www.fabrizio-branca.de• https://github.com/fbrncWeitere Informationen
  40. 40. Fragen?Mail: mail (at) fabrizio (minus) branca (dot) deTwitter: @fbrncBlog: http://www.fabrizio-branca.de

×