Nie mehr weltweites Warten
Transcription
Nie mehr weltweites Warten
26.04.2013 Nie mehr weltweites Warten Performancetuning für JSF-Anwendungen Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: www.oio.de info@oio.de Ihr Sprecher Thomas Asel Trainer, Berater, Entwickler Schwerpunkte Frontend-Architektur, Entwicklung von Web-Anwendungen, Web-Performance-Optimierung http://blog.oio.de @Tom_Asel thomas.asel@oio.de © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 2 1 26.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 26.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 26.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 Optimierungsmassnahmen - Anforderungen • Postiver Effekt auf – JSF Response Time – Resource Loading – Netzwerk Latenzen • Geringe Auswirkungen auf – Anwendungs-Architektur – Programmiermodell – Deployment • Tooling: – Integration in bestehenden Toolstack – (JSF) – Bordmittel © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 8 4 26.04.2013 Optimierungsmassnahmen – Easy Winner Servlet-Container Browser JSF-Lifecycle GET /index.jsf • JSF Response Time RestoreView – Kompontenbaum – Implementierungsunterschiede Render Response GET stylesheet.css • Resource-Loading – – – – Combined Resources Caching Ressourcen auslagern Komprimierung © 2013 Orientation in Objects GmbH GET script.js GET logo.png Nie mehr weltweites warten – JSF Performance-Tuning 9 Gliederung Servlet-Container Browser JSF-Lifecycle GET /index.jsf • JSF Response Time RestoreView – Kompontenbaum – Implementierungsunterschiede Render Response GET stylesheet.css • Resource-Loading – – – – Combined Resources Caching Ressourcen auslagern Komprimierung © 2013 Orientation in Objects GmbH GET script.js GET logo.png Nie mehr weltweites warten – JSF Performance-Tuning 10 5 26.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 26.04.2013 JSF - Komponentenbaum • Wird im Lifecycle 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 26.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. 250 – Ausnahmefälle > 3000 • Ursache: – Unnötiger Gebrauch von JSF-Komponenten • Falscher Gebrauch von Composite Components 54 Components! – "Dead Code": rendered="false" • 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 26.04.2013 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 17 Lösung: Es müssen nicht immer Composites sein … • 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 18 9 26.04.2013 Gliederung Servlet-Container Browser JSF-Lifecycle GET /index.jsf • JSF Response Time RestoreView – Kompontenbaum – Implementierungsunterschiede Render Response GET stylesheet.css • Resource-Loading – – – – Combined Resources Caching Ressourcen auslagern Komprimierung © 2013 Orientation in Objects GmbH GET script.js GET logo.png Nie mehr weltweites warten – JSF Performance-Tuning 19 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 20 10 26.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 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 22 11 26.04.2013 Fazit Vergleichsstudie 1. Größe des Komponentenbaum hat direkten Einfluss auf Performance 2. MyFaces durchläuft den Lifecycle schneller als Mojarra 3. Anwendungen mit großen Komponentenbäumen profitieren von einem Umstieg auf MyFaces bit.ly/myfaces-vs-mojarra © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 23 Gliederung Servlet-Container Browser JSF-Lifecycle GET /index.jsf • JSF Response Time RestoreView – Kompontenbaum – Implementierungsunterschiede Render Response GET stylesheet.css • Resource-Loading – – – – Combined Resources Caching Ressourcen auslagern Komprimierung © 2013 Orientation in Objects GmbH GET script.js GET logo.png Nie mehr weltweites warten – JSF Performance-Tuning 24 12 26.04.2013 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 25 Nie mehr weltweites warten – JSF Performance-Tuning 26 Combined Resources © 2013 Orientation in Objects GmbH 13 26.04.2013 Combined Resources: Anforderungen • Umsetzungsvarianten − Build-Prozess/Deployment • Maven • Ant • Jawr – JSF • Eigenimplementierung / Erweiterung • Bibliothek • Programmiermodell: – Ressourcen zur Entwicklungszeit nicht kombinieren Staging-Konzept berücksichtigen • Rendering: – Nur ein Verweis pro Typ – Gerenderte Links müssen kombinierte Ressource referenzieren © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 27 Combined Resources: Rendering <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> <link rel="stylesheet" href="/myapp/resources/packed.css"> <script src="/myapp/resources/packed.js"></script> © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 28 14 26.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 26.04.2013 Combined Resources: 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 Combined Resources: Problem Ungepackt: • Requests – 9 of 12 – 3 from Cache – 97,1 kB transferred © 2013 Orientation in Objects GmbH 16 26.04.2013 Combined Resources : 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 Combined Resources : Problem Lösung: Caching - Strategie © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 34 17 26.04.2013 Combined Resources – Ausnahmen [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 Ausschluß seitenweise konfigurieren: 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 26.04.2013 OmniFaces: CombinedResourceHandler Ausschluß global konfigurieren: • 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 Auslieferung vollständig 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 26.04.2013 Combined Resources - Bibliotheken Omnifaces "Combined ResourceHandler" ICEfaces 3.3 "Resource Coalescing" RichFaces 4 "Resource Optimization" © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 39 Gliederung Servlet-Container Browser JSF-Lifecycle GET /index.jsf • JSF Response Time RestoreView – Kompontenbaum – Implementierungsunterschiede Render Response GET stylesheet.css • Resource-Loading – – – – Combined Resources Caching Ressourcen auslagern Komprimierung © 2013 Orientation in Objects GmbH GET script.js GET logo.png Nie mehr weltweites warten – JSF Performance-Tuning 40 20 26.04.2013 Standardverhalten: 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 41 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 42 21 26.04.2013 Idee: Expires: Fri, 01 Jan 2100 12:00:00 GMT • JSF Resourcehandling unterstützt Versionierung • Version mit jedem Deployment erhöhen • JSF verwendet standardmässig höchste Version • Angabe von niedriger 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 43 Response Header anpassen • Servlet-Filter – geht immer, unabhängig von JSF – Nachteil: Kein Zugriff auf FacesContext, Scopes, etc… • JSF: © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 44 22 26.04.2013 Gliederung Servlet-Container Browser JSF-Lifecycle GET /index.jsf • JSF Response Time RestoreView – Kompontenbaum – Implementierungsunterschiede Render Response GET stylesheet.css • Resource-Loading – – – – Combined Resources Caching Ressourcen auslagern Komprimierung © 2013 Orientation in Objects GmbH GET script.js GET logo.png Nie mehr weltweites warten – JSF Performance-Tuning 45 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 46 23 26.04.2013 CDN – Content Delivery Network © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 47 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 – Auslieferung – Load-Balancing – Skalierung © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 48 24 26.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 49 Nie mehr weltweites warten – JSF Performance-Tuning 50 JSF Resource Handler © 2013 Orientation in Objects GmbH 25 26.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 51 Nie mehr weltweites warten – JSF Performance-Tuning 52 OmniFaces: CDNResourceHandler from CDN Packed © 2013 Orientation in Objects GmbH 26 26.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 53 Gliederung Servlet-Container Browser JSF-Lifecycle GET /index.jsf • JSF Response Time RestoreView – Kompontenbaum – Implementierungsunterschiede Render Response GET stylesheet.css • Resource-Loading – – – – Combined Resources Caching Ressourcen auslagern Komprimierung © 2013 Orientation in Objects GmbH GET script.js GET logo.png Nie mehr weltweites warten – JSF Performance-Tuning 54 27 26.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 55 Zusammenfassung Servlet-Container Browser JSF-Lifecycle GET /index.jsf • JSF Response Time RestoreView – Kompontenbaum – Implementierungsunterschiede Render Response GET stylesheet.css • Resource-Loading – – – – Combined Resources Caching Ressourcen auslagern Komprimierung © 2013 Orientation in Objects GmbH GET script.js GET logo.png Nie mehr weltweites warten – JSF Performance-Tuning 56 28 26.04.2013 Fazit • Einfluss auf JSF-Performance: – Größe des Komponentenbaumes – Wahl der Implementierung • # Requests statischer Resourcen verringern: – Combined Resources – Resource Caching – Auslagern (CDN / dedicated Webserver) • Netzwerk-Latenz verringern: – GZip Kompression nutzen • Der Browser kann das schon lange … Alle vorgestellten Massnahmen lassen sich mit JSF umsetzen • Es existieren außerdem hilfreiche Bibliotheken © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 57 Mehr von OIO zum Thema… • Schulung: JavaServer Faces – http://www.oio.de/java-server-faces.htm • Schulung: JSF Komponenten selbst entwickeln – http://www.oio.de/seminar/java/kurs-jsf-schulung-komponenten-javaserver-faces-seminar-entwicklung-components.htm • Vergleichsstudie der Implementierungen Oracle Mojarra und Apache MyFaces – http://www.oio.de/public/java/studie-jsf-mojarra-myfaces-performancevergleich.htm • Artikel: JSF Best Practices (englischer Artikel) – http://www.oio.de/public/java/jsf-best-practices-javaserver-facessession-tips.htm © 2013 Orientation in Objects GmbH Nie mehr weltweites warten – JSF Performance-Tuning 58 29 26.04.2013 ? ? ? ? ? ? ? ? Fragen ? Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de info@oio.de Vielen Dank für ihre Aufmerksamkeit ! Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de info@oio.de 30