SlideShare ist ein Scribd-Unternehmen logo
1 von 41
Downloaden Sie, um offline zu lesen
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
Agenda


                          Reverse Proxy
  Ein-    Probleme und
                            Caching
führung   Optimierungen
                           mit Varnish
Agenda


                          Reverse Proxy
  Ein-    Probleme und
                            Caching
führung   Optimierungen
                           mit Varnish
Funktionsweise Cache

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


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




… extends
Zend_Cache_Backend
Two-Level Cache
        Mehr Details:
        http://www.fabrizio-branca.de/magento-caching-internals.html
Agenda


                          Reverse Proxy
  Ein-    Probleme und
                            Caching
führung   Optimierungen
                           mit Varnish
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
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
Alte Cache-Einträge entfernen
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
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
Bug: 1st-Level Cache Priorität
Bug: 1st-Level Cache Priorität
Bug: 1st-Level Cache Priorität
                                                            $priority = 10
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;
    }

}
Bug: 1st-Level Cache Priorität




• Patch:
 https://gist.github.com/971320
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
Agenda


                          Reverse Proxy
  Ein-    Probleme und
                            Caching
führung   Optimierungen
                           mit Varnish
Reverse proxy caching




              Request

Browser                  Magento
                         (Apache + PHP + Mysql)
              Response
Reverse proxy caching




Browser      Varnish    Magento
                        (Apache + PHP + Mysql)
Reverse proxy caching




Browser        Nginx              Varnish   Magento
                                            (Apache + PHP + Mysql)



          -Verschlüsselung /
          Entschlüsselung (SSL)
          -Kompression
Reverse proxy caching




Browser   Nginx   Varnish   Magento
                            (Apache + PHP + Mysql)
Varnish


   HTTP         Caching         Load     Failover
Accelerator   Reverse Proxy   Balancer   system




       „Varnish makes websites fly“
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/
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
Request Lifecycle (vereinfacht)




                Kompletter Workflow: http://www.varnish-cache.org/trac/wiki/VCLExampleDefault
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)
Dynamische
(benutzerspezifische)
      Inhalte
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>
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
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
Ablauf nicht-cachebare Seiten
 Browser                                    Varnish                     Magento

           Seite anfordern (HTTP Request)
                                                      Seite anfordern




               Seite wird ausgeliefert

      Seite wird
      gerendert
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);
}
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);
}
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);
}
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)";
    }
}
Demo
Benchmarks                                  416,67
                                           Seiten/Sekunde




          0,85                2,4
                          Seiten/Sekunde
       Seiten/Sekunde


        Magento          Magento mit        Magento
       ohne Cache       APC+File Cache     mit Varnish
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
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
Fragen?



Mail:      mail (at) fabrizio (minus) branca (dot) de
Twitter:   @fbrnc
Blog:      http://www.fabrizio-branca.de

Weitere ähnliche Inhalte

Was ist angesagt?

DOAG: NoSQL with MySQL
DOAG: NoSQL with MySQLDOAG: NoSQL with MySQL
DOAG: NoSQL with MySQL
FromDual GmbH
 

Was ist angesagt? (15)

Web-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishWeb-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnish
 
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
 
Webanwendungen mit Apache HBase entwickeln
Webanwendungen mit Apache HBase entwickelnWebanwendungen mit Apache HBase entwickeln
Webanwendungen mit Apache HBase entwickeln
 
Web-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishWeb-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnish
 
What is new in xen Server
What is new in xen ServerWhat is new in xen Server
What is new in xen Server
 
Tipps und Skripts aus dem Leben eines Connections Admins
Tipps und Skripts aus dem Leben eines Connections AdminsTipps und Skripts aus dem Leben eines Connections Admins
Tipps und Skripts aus dem Leben eines Connections Admins
 
Wordpress on steroids
Wordpress on steroidsWordpress on steroids
Wordpress on steroids
 
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling  am Beispiel von AngrybirdCloud Deployment und (Auto)Scaling  am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
 
JBoss AS / EAP Clustering
JBoss AS / EAP  ClusteringJBoss AS / EAP  Clustering
JBoss AS / EAP Clustering
 
JBoss EAP clustering
JBoss EAP clustering JBoss EAP clustering
JBoss EAP clustering
 
DOAG: NoSQL with MySQL
DOAG: NoSQL with MySQLDOAG: NoSQL with MySQL
DOAG: NoSQL with MySQL
 
Caching in Hibernate
Caching in HibernateCaching in Hibernate
Caching in Hibernate
 
Startups in „Die Höhle der Löwen“ - SEODAY 2016
Startups in „Die Höhle der Löwen“ - SEODAY 2016Startups in „Die Höhle der Löwen“ - SEODAY 2016
Startups in „Die Höhle der Löwen“ - SEODAY 2016
 
Caching - Hintergründe, Patterns und Best Practices
Caching - Hintergründe, Patterns und Best PracticesCaching - Hintergründe, Patterns und Best Practices
Caching - Hintergründe, Patterns und Best Practices
 
Exadata with VM as Consolidation Plattform
Exadata with VM as Consolidation PlattformExadata with VM as Consolidation Plattform
Exadata with VM as Consolidation Plattform
 

Ähnlich wie Performance durch Caching

High Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der CloudHigh Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der Cloud
AOE
 
Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13
Stephan Hochdörfer
 
HTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenHTML5 und node.js Grundlagen
HTML5 und node.js Grundlagen
Mayflower GmbH
 
Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012
Daniel Havlik
 

Ähnlich wie Performance durch Caching (20)

Performance durch Caching
Performance durch CachingPerformance durch Caching
Performance durch Caching
 
Performance durch Caching
Performance durch CachingPerformance durch Caching
Performance durch Caching
 
Typo3 und Varnish
Typo3 und VarnishTypo3 und Varnish
Typo3 und Varnish
 
SEO Day 2016: Perfekte Ladezeiten und SEO-Hosting für Speed-Freaks
SEO Day 2016: Perfekte Ladezeiten und SEO-Hosting für Speed-FreaksSEO Day 2016: Perfekte Ladezeiten und SEO-Hosting für Speed-Freaks
SEO Day 2016: Perfekte Ladezeiten und SEO-Hosting für Speed-Freaks
 
Frontend Performance
Frontend PerformanceFrontend Performance
Frontend Performance
 
Speedup your site mit Caching
Speedup your site mit CachingSpeedup your site mit Caching
Speedup your site mit Caching
 
Ladezeiten Verbessern - Css Und JavaScript Komprimieren
Ladezeiten Verbessern - Css Und JavaScript KomprimierenLadezeiten Verbessern - Css Und JavaScript Komprimieren
Ladezeiten Verbessern - Css Und JavaScript Komprimieren
 
HTML5 Storage
HTML5 StorageHTML5 Storage
HTML5 Storage
 
High Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der CloudHigh Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der Cloud
 
HTML5 im Überblick - semantisches HTML, Geolocation, Offline-Webanwendungen, ...
HTML5 im Überblick - semantisches HTML, Geolocation, Offline-Webanwendungen, ...HTML5 im Überblick - semantisches HTML, Geolocation, Offline-Webanwendungen, ...
HTML5 im Überblick - semantisches HTML, Geolocation, Offline-Webanwendungen, ...
 
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von AngrybirdCloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
 
Node.js
Node.jsNode.js
Node.js
 
Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13
 
HTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenHTML5 und node.js Grundlagen
HTML5 und node.js Grundlagen
 
Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
Caching in PHP - Status Quo
Caching in PHP - Status QuoCaching in PHP - Status Quo
Caching in PHP - Status Quo
 
Hdc2012 cordova-präsi
Hdc2012 cordova-präsiHdc2012 cordova-präsi
Hdc2012 cordova-präsi
 
Ajax hands on - Refactoring Google Suggest
Ajax hands on - Refactoring Google SuggestAjax hands on - Refactoring Google Suggest
Ajax hands on - Refactoring Google Suggest
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit Rust
 

Mehr von AOE

Magento Imagine 2013: Fabrizio Branca - Learning To Fly: How Angry Birds Reac...
Magento Imagine 2013: Fabrizio Branca - Learning To Fly: How Angry Birds Reac...Magento Imagine 2013: Fabrizio Branca - Learning To Fly: How Angry Birds Reac...
Magento Imagine 2013: Fabrizio Branca - Learning To Fly: How Angry Birds Reac...
AOE
 
Searchperience Indexierungspipeline
Searchperience   IndexierungspipelineSearchperience   Indexierungspipeline
Searchperience Indexierungspipeline
AOE
 
Selenium 2 for PHP(Unit)
Selenium 2 for PHP(Unit)Selenium 2 for PHP(Unit)
Selenium 2 for PHP(Unit)
AOE
 
T3DD12 Caching with Varnish
T3DD12 Caching with VarnishT3DD12 Caching with Varnish
T3DD12 Caching with Varnish
AOE
 
T3DD12 community extension
T3DD12  community extensionT3DD12  community extension
T3DD12 community extension
AOE
 
Performance measurement and tuning
Performance measurement and tuningPerformance measurement and tuning
Performance measurement and tuning
AOE
 

Mehr von AOE (20)

Multithreaded XML Import (San Francisco Magento Meetup)
Multithreaded XML Import (San Francisco Magento Meetup)Multithreaded XML Import (San Francisco Magento Meetup)
Multithreaded XML Import (San Francisco Magento Meetup)
 
rock-solid TYPO3 development with continuous integration and deployment
rock-solid TYPO3 development with continuous integration and deploymentrock-solid TYPO3 development with continuous integration and deployment
rock-solid TYPO3 development with continuous integration and deployment
 
Agile Management - Best Practice Day der Deutschen Bahn am 17.10.2013
Agile Management - Best Practice Day der Deutschen Bahn am 17.10.2013Agile Management - Best Practice Day der Deutschen Bahn am 17.10.2013
Agile Management - Best Practice Day der Deutschen Bahn am 17.10.2013
 
Continuous Quality Assurance using Selenium WebDriver
Continuous Quality Assurance using Selenium WebDriverContinuous Quality Assurance using Selenium WebDriver
Continuous Quality Assurance using Selenium WebDriver
 
Magento Imagine 2013: Fabrizio Branca - Learning To Fly: How Angry Birds Reac...
Magento Imagine 2013: Fabrizio Branca - Learning To Fly: How Angry Birds Reac...Magento Imagine 2013: Fabrizio Branca - Learning To Fly: How Angry Birds Reac...
Magento Imagine 2013: Fabrizio Branca - Learning To Fly: How Angry Birds Reac...
 
SONY on TYPO3 - Rapid Global CMS Deployment
SONY on TYPO3 - Rapid Global CMS DeploymentSONY on TYPO3 - Rapid Global CMS Deployment
SONY on TYPO3 - Rapid Global CMS Deployment
 
The typo3.org Relaunch Project
The typo3.org Relaunch ProjectThe typo3.org Relaunch Project
The typo3.org Relaunch Project
 
Searchperience Indexierungspipeline
Searchperience   IndexierungspipelineSearchperience   Indexierungspipeline
Searchperience Indexierungspipeline
 
Selenium 2 for PHP(Unit)
Selenium 2 for PHP(Unit)Selenium 2 for PHP(Unit)
Selenium 2 for PHP(Unit)
 
Angrybirds Magento Cloud Deployment
Angrybirds Magento Cloud DeploymentAngrybirds Magento Cloud Deployment
Angrybirds Magento Cloud Deployment
 
T3DD12 Caching with Varnish
T3DD12 Caching with VarnishT3DD12 Caching with Varnish
T3DD12 Caching with Varnish
 
T3DD12 community extension
T3DD12  community extensionT3DD12  community extension
T3DD12 community extension
 
Performance measurement and tuning
Performance measurement and tuningPerformance measurement and tuning
Performance measurement and tuning
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Debugging, Monitoring and Profiling in TYPO3
Debugging, Monitoring and Profiling in TYPO3Debugging, Monitoring and Profiling in TYPO3
Debugging, Monitoring and Profiling in TYPO3
 
Panasonic search
Panasonic searchPanasonic search
Panasonic search
 
Open Source CMS TYPO3 at Cisco WebEx
Open Source CMS TYPO3 at Cisco WebExOpen Source CMS TYPO3 at Cisco WebEx
Open Source CMS TYPO3 at Cisco WebEx
 
Case Study NDD Distribution on TYPO3
Case Study NDD Distribution on TYPO3Case Study NDD Distribution on TYPO3
Case Study NDD Distribution on TYPO3
 
Monier Enterprise Web CMS Global Relaunch
Monier Enterprise Web CMS Global RelaunchMonier Enterprise Web CMS Global Relaunch
Monier Enterprise Web CMS Global Relaunch
 
Hankook Tire Europe TYPO3 Implementation
Hankook Tire Europe TYPO3 ImplementationHankook Tire Europe TYPO3 Implementation
Hankook Tire Europe TYPO3 Implementation
 

Performance durch Caching

  • 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
  • 4. Funktionsweise Cache Mage::app()->getCacheInstance() Mage_Core_Model_Cache Mage::app()->getCache() oder Mage::app()->getCacheInstance()->getFrontend() Varien_Cache_Core … extends Zend_Cache_Backend
  • 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
  • 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
  • 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
  • 12. Bug: 1st-Level Cache Priorität
  • 13. Bug: 1st-Level Cache Priorität
  • 14. Bug: 1st-Level Cache Priorität $priority = 10 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; } }
  • 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 Caching führung Optimierungen mit Varnish
  • 18. Reverse proxy caching Request Browser Magento (Apache + PHP + Mysql) Response
  • 19. Reverse proxy caching Browser Varnish Magento (Apache + PHP + Mysql)
  • 20. Reverse proxy caching Browser Nginx Varnish Magento (Apache + PHP + Mysql) -Verschlüsselung / Entschlüsselung (SSL) -Kompression
  • 21. Reverse proxy caching Browser Nginx Varnish Magento (Apache + PHP + Mysql)
  • 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
  • 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.
  • 29. 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>
  • 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)"; } }
  • 37. Demo
  • 38. Benchmarks 416,67 Seiten/Sekunde 0,85 2,4 Seiten/Sekunde Seiten/Sekunde Magento Magento mit Magento ohne Cache APC+File Cache mit Varnish
  • 39. 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
  • 40. 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
  • 41. Fragen? Mail: mail (at) fabrizio (minus) branca (dot) de Twitter: @fbrnc Blog: http://www.fabrizio-branca.de