Your SlideShare is downloading. ×
Performance durch Caching
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Performance durch Caching

223
views

Published on

May 18, 2011 …

May 18, 2011

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

Published in: Technology

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
223
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
2
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. Ein-führungAgendaProbleme undOptimierungenReverse ProxyCachingmit Varnish
  • 3. Ein-führungAgendaProbleme undOptimierungenReverse ProxyCachingmit Varnish
  • 4. Funktionsweise CacheMage::app()->getCacheInstance()Mage_Core_Model_CacheMage::app()->getCache() oderMage::app()->getCacheInstance()->getFrontend()Varien_Cache_Core… extendsZend_Cache_Backend
  • 5. Two-Level CacheMehr Details:http://www.fabrizio-branca.de/magento-caching-internals.html
  • 6. Ein-führungAgendaProbleme undOptimierungenReverse ProxyCachingmit Varnish
  • 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. • 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. Alte Cache-Einträge entfernen
  • 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. • 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. Bug: 1st-Level Cache Priorität
  • 13. Bug: 1st-Level Cache Priorität
  • 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. Bug: 1st-Level Cache Priorität• Patch:https://gist.github.com/971320
  • 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. Ein-führungAgendaProbleme undOptimierungenReverse ProxyCachingmit Varnish
  • 18. Reverse proxy cachingBrowser Magento(Apache + PHP + Mysql)RequestResponse
  • 19. Reverse proxy cachingBrowser Magento(Apache + PHP + Mysql)Varnish
  • 20. Reverse proxy cachingBrowser VarnishNginx Magento(Apache + PHP + Mysql)-Verschlüsselung /Entschlüsselung (SSL)-Kompression
  • 21. Reverse proxy cachingBrowser VarnishNginx Magento(Apache + PHP + Mysql)
  • 22. VarnishHTTPAcceleratorCachingReverse ProxyLoadBalancerFailoversystem„Varnish makes websites fly“
  • 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. • 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. Request Lifecycle (vereinfacht)Kompletter Workflow: http://www.varnish-cache.org/trac/wiki/VCLExampleDefault
  • 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. 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. • 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. 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. Ablauf nicht-cachebare SeitenSeite anfordern (HTTP Request)Seite wird ausgeliefertSeite anfordernSeite wirdgerendertBrowser Varnish Magento
  • 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. BenchmarksMagentoohne Cache0,85Seiten/Sekunde2,4Seiten/Sekunde416,67Seiten/SekundeMagento mitAPC+File CacheMagentomit Varnish
  • 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. • 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. Fragen?Mail: mail (at) fabrizio (minus) branca (dot) deTwitter: @fbrncBlog: http://www.fabrizio-branca.de