Nie mehr weltweites Warten
Transcription
Nie mehr weltweites Warten
22.04.2013 Nie mehr weltweites Warten Performancetuning für JSF-Anwendungen Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: www.oio.de [email protected] Ihr Sprecher Thomas Asel Trainer, Berater, Entwickler Schwerpunkte Frontend-Architektur, Entwicklung von Web-Anwendungen, Web-Performance-Optimierung http://blog.oio.de @Tom_Asel [email protected] © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 2 1 22.04.2013 Das war in der Schachtel … ArchitekturModell KomponentenModell Lifecycle Resource Handling ProgrammierModell © 2013 Orientation in Objects GmbH … viele, viele, Bibliotheken Nie mehr weltweites warten – JSF Performance-Tuning 3 Nie mehr weltweites warten – JSF Performance-Tuning 4 Fear, Uncertainty, Doubt JSF ist doch … oldschool schwerfällig schwierig langsam © 2013 Orientation in Objects GmbH 2 22.04.2013 Performance optimieren – Auf welcher Ebene? JVMEbene JSF-Ebene WebEbene © 2013 Orientation in Objects GmbH • Heap-Size • Garbage Collection • Lifecycle • Komponenten • Requests • Caching Nie mehr weltweites warten – JSF Performance-Tuning 5 Only 10%-20% of End-User Response-Time is spent donwloading the HTML document. Steve Souders - Web-Performance Guru, Yahoo © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 6 3 22.04.2013 Welt-Weites-Warten Servlet-Container Browser JSF-Lifecycle GET /index.jsf RestoreView "LATENZ" JSF Response Time Render Response GET stylesheet.css GET script.js Resource Loading © 2013 Orientation in Objects GmbH GET logo.png Nie mehr weltweites warten – JSF Performance-Tuning 7 Worauf haben wir Einfluss? • # Resource Requests • JSF-Response-Time • Peering-Point-Distanz • ISP • User-Bandwith-Speed © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 8 4 22.04.2013 Optimierungspunkte – Easy Winner Performance Optimierung WebSpezifisch JSF-Spezifisch Component Tree optimieren Lifecycle Duration reduzieren # Requests reduzieren © 2013 Orientation in Objects GmbH Größe in kb reduzieren Nie mehr weltweites warten – JSF Performance-Tuning 9 Welt-Weites-Warten Servlet-Container Browser JSF-Lifecycle GET /index.jsf RestoreView JSF Response Time Render Response GET stylesheet.css GET script.js GET logo.png © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 10 5 22.04.2013 JSF - Komponentenbaum UIViewRoot HtmlForm HtmlOutputText HtmlInputText HtmlOutcomeTargetLink © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 11 Apply Request Values Restore View Validation JSF Lifecycle Render Response Update Model Invoke Application © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 12 6 22.04.2013 JSF - Komponentenbaum • Wird im Lifecycle-Phase mehrfach traversiert Besonders aufwendig: • Phase1: – Erzeugung / Wiederherstellung • Client-Side State-Saving: Deserialisierung • Phase 6: – Rendering © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 13 Dauer der Lifecylce-Phasen - Vergleichsmessung 60 Duration [ms] 50 40 30 20 C=1000 10 C=500 C=250 0 1 2 C=100 3 C=10 4 5 6 Phase Quelle: http://bit.ly/myfaces-vs-mojarra © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 14 7 22.04.2013 Dauer der Lifecylce-Phasen – Anteilig 50 45 Render Response % of Lifecycle Duration 40 35 30 Restore View 25 20 Validation 15 10 Update Model Apply Request Values 5 Invoke Application 0 0 1 2 3 4 5 6 7 Lifecycle Phase © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 15 Anzahl Components / View • Beobachtet: – < 50 eher selten – Mittelwert ca. 200 – Ausnahmefälle bis 3000 • Ursache: – Falscher Gebrauch von Composite Components – "Dead Code": rendered="false" 54 Components! • Trotzdem Teil des Komponentenbaumes – Komplexität • z.B.: verschachtelte Tabbed Panes © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 16 8 22.04.2013 JSF – Wiederverwendbare Einheiten • Custom-Tags <my:spacer height="100" /> • Decorator <my:infoBox type="warning" > <h:message for="selection" /> </my:infoBox> • Includes <ui:include src="footer.xhtml" /> • Composite-Components <my:orderForm value="#{order}" showAll="true"> <f:validateRequired for="address" /> </my:orderForm> © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 17 Brauchen wir dafür JSF – Komponenten? <ol id="ordered_list" class="ui-datalist-data"> <li class="ui-datalist-item"> Chrysler, 1965 </li> ... <ol> © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 18 9 22.04.2013 JSF - Implementierungen • 2 Implementierungen: – Oracle Mojarra (Referenzimplementierung) – Apache MyFaces – Prinzipiell Austauschbar • Servlet-Container: – Implementierung typischerweise Teil der Anwendung → Freie Wahl der Implementierung • Java EE - Application-Server: "Full-Stack-Falle" – Implementierung zwingend Teil des Auslieferumfangs – Dadurch Festlegung auf – Implementierung – Version – Änderung der JSF-Implementierung möglich • Konfiguration notwendig • Ggf. Auswirkung auf Garantie/Support © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 19 Vergleich: MyFaces vs Mojarra 1000 900 800 700 [ms] 600 500 400 300 200 100 0 0 200 400 600 800 1000 1200 1400 # of Components in Tree © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 20 10 22.04.2013 Vergleich: MyFaces vs Mojarra 1000 900 800 700 [ms] 600 500 400 300 200 100 0 0 200 400 600 800 1000 1200 1400 # of Components in Tree © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 21 Fazit Vergleichsstudie • Die Anzahl der verwendeten JSF-Komponenten auf einer Seite hat direkte Auswirkungen auf die Performance der Anwendung. Dies äußert sich hinsichtlich der Abarbeitungsdauer des Lifecycle. • Apache MyFaces durchläuft den JSF-Lifecycle erheblich schneller als Oracle Mojarra. Insbesondere Anwendungen mit großen Komponentenbäumen würden somit von einem Umstieg von Mojarra auf MyFaces profitieren. • Apache MyFaces bietet unter Berücksichtigung aller untersuchten Aspekte ein gleichwertiges oder besseres Verhalten als die Referenzimplementierung Oracle Mojarra. • Durch den beobachteten linearen Anstieg der Abarbeitungsdauer des JSF-Lifecycles ermöglicht MyFaces eine verlässlichere Skalierung der zu erwartenden Laufzeiten. © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 22 11 22.04.2013 Fazit Vergleichsstudie • Die Anzahl der verwendeten JSF-Komponenten auf einer Seite hat direkte Auswirkungen auf die Performance der Anwendung. Dies äußert sich hinsichtlich der Abarbeitungsdauer des Lifecycle. • Apache MyFaces durchläuft den JSF-Lifecycle erheblich schneller als Oracle Mojarra. Insbesondere Anwendungen mit großen Komponentenbäumen würden somit von einem Umstieg von Mojarra auf MyFaces profitieren. • Apache MyFaces bietet unter Berücksichtigung aller untersuchten Aspekte ein gleichwertiges oder besseres Verhalten als die Referenzimplementierung Oracle Mojarra. • Durch den beobachteten linearen Anstieg der Abarbeitungsdauer des JSF-Lifecycles ermöglicht MyFaces eine verlässlichere Skalierung der zu erwartenden Laufzeiten. © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 23 bit.ly/myfaces-vs-mojarra © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 24 12 22.04.2013 Welt-Weites-Warten Servlet-Container Browser JSF-Lifecycle GET /index.jsf RestoreView Render Response GET stylesheet.css Resource Loading: Packing © 2013 Orientation in Objects GmbH GET script.js GET logo.png Nie mehr weltweites warten – JSF Performance-Tuning 25 JSF - Resource Handling • Organisation in WebContent/resources: • Rendering: • Deklaration: <h:head> <h:outputStylesheet library="css" name="styleB.css" /> <h:outputScript library="js" name="scriptC.js" target="head" /> </h:head> <link rel="stylesheet" href="/myapp/javax.faces.resource/styleB.css.jsf?ln=css"> <script src="/myapp/javax.faces.resource/scriptC.js.jsf?ln=js"> </script> © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 26 13 22.04.2013 Resource Packing Aggregation Resource Packing Minification © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 27 Resource-Packing: Massnahmen • Umsetzung: – Build-Prozess • Maven • Ant • … – Framework <link rel="stylesheet" href="/myapp/javax.faces.resource/styleA.css.jsf?ln=css"> <link rel="stylesheet" href="/myapp/javax.faces.resource/styleB.css.jsf?ln=css"> <script src="/myapp/javax.faces.resource/scriptA.js.jsf?ln=js"> </script> <script src="/myapp/javax.faces.resource/scriptB.js.jsf?ln=js"> </script> <script src="/myapp/javax.faces.resource/jquery1.9.1.min.js.jsf?ln=js"></script> • Jawr • Problem: Links im gerenderten Dokument müssen auf andere Quelle verweisen © 2013 Orientation in Objects GmbH <link rel="stylesheet" href="/myapp/resources/packed.css"> <script src="/myapp/resources/packed.js"></script> Nie mehr weltweites warten – JSF Performance-Tuning 28 14 22.04.2013 JSF - Resource Handler • Verantwortlich für De/Encoding von Resourcen • Liefert Ressource anhand Library und Resourcename • Behandelt Resource Requests © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 29 OmniFaces - CombinedResourceHandler faces-config.xml: <application> <resource-handler> org.omnifaces.resourcehandler.CombinedResourceHandler </resource-handler> </application> © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 30 15 22.04.2013 Resource Packing: Problem scriptA.js (<1kB) view1.xhtml jQuery.js (~91 kB) view2.xhtml scriptC.js (<1kB) © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 31 Nie mehr weltweites warten – JSF Performance-Tuning 32 Resource Packing: Problem Ungepackt: • Requests – 9 of 12 – 3 from Cache – 97,1 kB transferred © 2013 Orientation in Objects GmbH 16 22.04.2013 Resource Packing: Problem Ungepackt: • Requests – 9 of12 – 3 from Cache – 97,1 kB transferred © 2013 Orientation in Objects GmbH Gepackt: • Requests – 6 of 6 – 0 from Cache – 186,9 kB transferred Nie mehr weltweites warten – JSF Performance-Tuning 33 Resource Packing: Problem Lösung: Caching - Strategie © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 34 17 22.04.2013 Resource Packing – Caching Strategie [from Cache] jQuery.js view1.xhtml view2.xhtml a1.js a2.js b1.js b2.js © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 35 OmniFaces - CombinedResourceHandler Ressourcen vom Packing ausschliessen: view.xhtml: <!-- Packed Ressources --> <h:outputScript library="js" name="scriptB.js" target="head" /> <h:outputScript library="js" name="scriptC.js" target="head" /> <!-- Excluded from packing --> <h:outputScript library="js" name="jquery-1.9.1.min.js"/> © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 36 18 22.04.2013 OmniFaces: CombinedResourceHandler Ressourcen vom Packing ausschliessen: • web.xml: <context-param> <param-name> org.omnifaces.COMBINED_RESOURCE_HANDLER_EXCLUDED_RESOURCES </param-name> <param-value> javax.faces:jsf.js </param-value> </context-param> © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 37 OmniFaces: CombinedResourceHandler Ressourcen unterdrücken: • web.xml: <context-param> <param-name> org.omnifaces.COMBINED_RESOURCE_HANDLER_SUPPRESSED_RESOURCES </param-name> <param-value> primefaces:primefaces.css </param-value> </context-param> © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 38 19 22.04.2013 Welt-Weites-Warten Servlet-Container Browser JSF-Lifecycle GET /index.jsf RestoreView Render Response GET stylesheet.css Resource Loading: Caching © 2013 Orientation in Objects GmbH GET script.js GET logo.png Nie mehr weltweites warten – JSF Performance-Tuning 39 Caching- Response Header • Production-Stage: HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Expires: Thu, 11 Apr 2013 13:51:12 GMT Last-Modified: Wed, 03 Apr 2013 08:52:01 GMT Content-Type: application/javascript Content-Length: 176 Date: Thu, 04 Apr 2013 13:51:12 GMT © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 40 20 22.04.2013 JSF - Resource Handling • JSF Resourcehandling unterstützt Versionierung • Standardmässig wird Ressource mit höchster Versionsnummer ausgeliefert • Angabe von Version möglich, aber… <h:outputScript library="js" name="1_0/scriptA.js" target="head" /> – Mojarra: erlaubt – MyFaces: Warnung: Resource referenced by resourceName 1_0/scriptA.js and libraryName js not found in call to ResourceHandler.createResource. It will be silenty ignored. © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 41 Nie mehr weltweites warten – JSF Performance-Tuning 42 Response Header anpassen • Servlet-Filter – geht immer, unabhängig von JSF • JSF: © 2013 Orientation in Objects GmbH 21 22.04.2013 Welt-Weites-Warten Servlet-Container Browser JSF-Lifecycle GET /index.jsf RestoreView Render Response GET stylesheet.css Resource Loading: Auslagern © 2013 Orientation in Objects GmbH GET script.js GET logo.png Nie mehr weltweites warten – JSF Performance-Tuning 43 Statische Ressourcen auslagern http://www.oio.de http://static.oio.de Apache httpd © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 44 22 22.04.2013 CDN – Content Delivery Network © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 45 CDN - Vorteile • Transfer von statischen Ressourcen – schont • Application Server • Unternehmensnetzwerk – Erzeugt (vermutlich) geringere Kosten Beispiel • ab 0,12 $ / GB und $0,0090 / 10.000 Requests CDN übernimmt – Caching – Load-Balancing – Skalierung © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 46 23 22.04.2013 JSF und CDN • Deployment – Extra-Step • Maven • Ant • … • JSF <link rel="stylesheet" href="/myapp/javax.faces.resource/styleA.css.jsf?ln=css"> <link rel="stylesheet" href="http://mycdn.com/oio/myapp/styleA.css"> © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 47 Nie mehr weltweites warten – JSF Performance-Tuning 48 JSF Resource Handler © 2013 Orientation in Objects GmbH 24 22.04.2013 OmniFaces: CDNResourceHandler • faces-config.xml: <application> <resource-handler> org.omnifaces.resourcehandler.CDNResourceHandler </resource-handler> </application> • web.xml: <context-param> <param-name> org.omnifaces.CDN_RESOURCE_HANDLER_URLS </param-name> <param-value> js:jquery.js=http://code.jquery.com/jquery.js </param-value> </context-param> © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 49 Nie mehr weltweites warten – JSF Performance-Tuning 50 OmniFaces: CDNResourceHandler from CDN Packed © 2013 Orientation in Objects GmbH 25 22.04.2013 CDN und Caching • Response Header: Access-Control-Allow-Origin:* Content-Encoding:gzip Content-Length:32819 Content-Type:application/x-javascript; charset=utf-8 Date:Fri, 05 Apr 2013 14:02:24 GMT Cache-Control:max-age=2592000 Expires:Sun, 05 May 2013 14:02:24 GMT Last-Modified:Tue, 05 Feb 2013 00:56:40 GMT Vary:Accept-Encoding X-Cache:HIT Server:ECS (fcn/41B6) © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 51 Welt-Weites-Warten Servlet-Container Browser JSF-Lifecycle GET /index.jsf RestoreView Render Response GET stylesheet.css Resource Loading: GZip © 2013 Orientation in Objects GmbH GET script.js GET logo.png Nie mehr weltweites warten – JSF Performance-Tuning 52 26 22.04.2013 Konfiguration - Tomcat • Server.xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" compression="on" compressionMinSize="1024" compressableMimeType="text/css,application/javascript" /> © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 53 Welt-Weites-Warten Servlet-Container Browser JSF-Lifecycle GET /index.jsf RestoreView JSF Response Time Render Response GET stylesheet.css GET script.js Resource Loading © 2013 Orientation in Objects GmbH GET logo.png Nie mehr weltweites warten – JSF Performance-Tuning 54 27 22.04.2013 Fazit • Einfluss auf JSF-Performance: – Größe des Komponentenbaumes – Wahl der Implementierung • # Requests statischer Resourcen verringern: – Resource Packing – Resource Caching – Auslagern (CDN / dedicated Webserver) • Netzwerk-Latenz verringern: – GZip Kompression nutzen • Der Browser kann das schon lange … → Alle Massnahmen lassen sich mit JSF leicht umsetzen • Es existieren außerdem hilfreiche Bibliotheken © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 55 ? ? ? ? ? ? ? ? Fragen ? Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de [email protected] 28 22.04.2013 Folien zum Vortrag • Die Folien werden auf unserer Website veröffentlicht – http://oio.de/tiny/orientierungspunkt-archiv © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 57 Kommende Orientierungspunkte • JBoss 7 als Plattform für hochverfügbare Anwendungen – Freitag, 24. Mai 2013 - 17:00-18:00 Uhr • Über den Tellerrand: Überblick JSF-Bibliotheken und Tools für den praktischen Einsatz – Freitag, 28. Juni 2013 - 16:00-17:00 Uhr © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 29 22.04.2013 Vielen Dank für ihre Aufmerksamkeit ! Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de [email protected] 2.2 sec speedup auf Startseite: +15.4% mehr downloads (= 60 Mill. Downloads / Jahr) Mozilla 13-25% speedup (GZip): -50% Outbound traffic Netflix © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 60 30 22.04.2013 Expires Header "The Expires entity-header field gives the date/time after which the response is considered stale." RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1 • Wird von JSF automatisch gesetzt – Production-Stage: 7 Tage – Development-Stage: 0 • Probleme: – Zu kurzer Zeitraum: • Ressource wird redundant ausgeliefert – Zu langer Zeitraum • Client verpasst Update © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 61 JSF Resource Handling • Standardmässig wird Ressource mit höchster Versionsnummer ausgeliefert • Versionierung möglich, aber… <h:outputScript library="js" name="1_0/scriptA.js" target="head" /> – Mojarra: erlaubt – MyFaces: Warnung: Resource referenced by resourceName 1_0/scriptA.js and libraryName js not found in call to ResourceHandler.createResource. It will be silenty ignored. © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 62 31 22.04.2013 Performance-Studien • World-Wide-Wait, Devoxx 2011 – Todo • Vergleichsstudie der JSF-Implementierungen Oracle Mojarra und Apache MyFaces, OiO 2013 – Todo Vergleichsstudie der JSFImplementierungen Oracle Mojarra und Apache MyFaces © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 63 Optimierungspunkte – Easy Winner © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 64 32 22.04.2013 9,6 % © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 65 REST!!! 9,6 % © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 66 33 22.04.2013 Render Response Restore View Invoke Application Validation Apply Request Values © 2013 Orientation in Objects GmbH Update Model Nie mehr weltweites warten – JSF Performance-Tuning 67 Nie mehr weltweites warten – JSF Performance-Tuning 68 Resources Document © 2013 Orientation in Objects GmbH 34 22.04.2013 Resources © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning Response Time © 2013 Orientation in Objects GmbH 69 Network Latency Nie mehr weltweites warten – JSF Performance-Tuning 70 35 22.04.2013 Vergleich: MyFaces vs Mojarra 1000 900 800 700 [ms] 600 MyFaces Server Side 500 MyFaces Client Side Mojarra Server Side 400 Mojarra Client Side 300 200 100 0 0 200 400 600 800 1000 1200 1400 # of Components in Tree © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 71 36