Websphere Performance Tuning - Mirko Novakovic Hamburg, 19. 9. 2006

Die Seite wird erstellt Angelika Heim
 
WEITER LESEN
Websphere Performance Tuning

Mirko Novakovic
novakovic@codecentric.de

                               Hamburg, 19. 9. 2006
Agenda

   Performance Tuning Grundlagen
   Analyse und Tools
   Tuning Best Practises
Performance - Werte und Maßeinheiten

 Die Performance ist ein Maß für das Zeitverhalten eines
  Softwaresystems
 Performance ist definiert durch die Indikatoren Antwortzeit (response
  time) und Durchsatz (throughput)
 Bei Java SE Systemen ist die Antwortzeit der Kernindikator für die
  Performance – bei Java EE Systemen kann der Durchsatz
  entscheidend sein.
 Antwortzeit und Durchsatz können gegensätzliche Anforderungen
  sein.
Performance - Antwortzeit

 Die Antwortzeit ist die gemessen Zeit zwischen Absenden der
  Anfrage (request) und vollständigen Empfang der Antwort (response)
 Die Antwortzeit wird in Sekunden oder Millisekunden gemessen
 Die Antwortzeit bei Java EE Anwendungen ist die End-to-End
  Antwortzeit, die der Benutzer erfährt (t)
 Der Percentile Graph gibt die prozentuale Verteilung der
  Antwortzeiten an
Performance - Durchsatz

 Der Durchsatz ist definiert durch die Anzahl von Anfragen (requests),
  die ein System pro Zeiteinheit verarbeiten kann
 Bei webbasierten Systemen wird der Durchsatz den Einheiten
  Pageimpressions pro Sekunde oder Requests pro Sekunde gemessen
 Eine weitere Einheit kann die Anzahl der Transaktionen oder
  Datenbankabfragen pro Sekunde sein – insbesondere bei „Batch“
  Systemen
Zusammenhang – Antwortzeit und Durchsatz

 Antwortzeit gegen Durchsatz   Antwortzeit gegen Anzahl Benutzer
Tuning Bereiche Java SE und Java EE
 View Technologien
   – Swing, AWT, Applet, WebStart
   – JSP, JSTL, Taglibs
   – XML, XSL, FOP
 Web Frameworks (Struts, JSF, WebWork)
 Business Logik
   – EJB (Session, Entity, MessageDriven)
   – Leightweight Container (Spring, Picocontainer,
     Avalon)
   – OR Mapper (Hibernate, TopLink)
   – POJOS
 Backend Connections
   – JDBC
   – JMS
   – J2C
Beteiligte Systeme bei Java SE und Java EE

   Webserver (Apache, IIS, iPlanet)
   Applikationsserver (WebSphere, Weblogic, JBoss)
   Datenbanken (Oracle, DB2, MySQL)
   Legacy Systeme (IMS, CICS, SAP, Siebel)
   Externe Komponenten
    – Netzwerkkomponenten (Router, Switches, Firewalls, Latency)
    – Maschinen Resourcen (CPU, IO, Memory)
Komplexität führt zu Kommunikationsproblematik
Lösung: Application Performance Management
High Level - System Sicht
                                                                          24x7 Monitoring der Java Anwendung und
                                                                         Infrastruktur

                             Detect

                                                           Betrieb
                                                                          Frühzeitige Erkennung von Performance und
                                                                         Stabilitäts Problemen
                                                                          Problembereich eingrenzen können
                                                                          SLA Reporting

                                      Diagnose
                                                                          Diagnostizieren des Problems unter realen
                                                                         Bedingungen
                                                                          Geringer Overhead für Diagnose unter Last

                                                           Test
                                                                          JVM Übergreifende Metriken (AppServer, etc.)
                                                                          Eingrenzung des Problems auf Klassen oder
                                                                         Komponentenebene

                                                           Entwicklung
                                                 Resolve
                                                                         Beheben des Performance oder Stabilitäts
                                                                         Problems
                                                                          Profiling und Analyse des Problems bis auf
                                                                         Zeilen- bzw. Codeebene
                                                                         Finden von Memoryleaks oder Ressource
Detail - Source Code Sicht                                               Problemen
Diagnose und Profiling Informationen
 Performance Informationen der Anwendung – Blackbox Sicht
    – Antwortzeitverhalten,…
 Performance Informationen der Anwendung – Whitebox Sicht
    – Methoden Durchlaufzeiten, Heap Snapshot, Objekterzeugungen,…
 Applikationsserver Statistiken
    – Connection Pool, Thread Pool, EJB Statistiken, Servlet Statistiken,…
 JVM Statistiken
    – Heap Statistiken, GC Informationen,…
 System Informationen
    – CPU, Memory, IO, Netzwerk,…
 Datenbank/Legacy Informationen
    – Indizes, Caching, Zugriffoptimierungen, IMS Queues,…
Statistik: Performance Probleme von Java Anwendungen

1. Memory Leaks
2. Datenbank Anbindung
3. Garbage Collection
…
Ineffektiver Code
Netzwerk Problem
Analyse und Tools
Performance Tuning Prozess (1)

1.   Anforderungen an Performance und Verfügbarkeit definieren
2.   Performance und Verfügbarkeit messen (Benchmarking)
3.   Messung analysieren
4.   Tuningmaßnahmen und Hypothesen aufstellen und priorisieren
5.   Maßnahme mit höchster Priorität umsetzen
6.   Schritt 2-5 wiederholen bis Anforderungen erfüllt
Performance Tuning Prozess (2)

   Benchmark etablieren
    – Identifikation fachlicher Anwendungsfälle
         • Basis für die Verskriptung der Lasttests und das Profiling
         • Realistische Szenarien in Abstimmung mit der Fachabteilung
    – Identifikation kritischer Schnittstellen
         • Legacy Systeme
         • DB Zugriffe
         • Externe/Interne WebServices

   Optimal: Automatisierung (Ant, CruiseControl, Maven, etc.)
Lasttest Tools – JMeter (1)

 100% Java Lasttesttool von Apache
  – Sampler nicht nur für http -> Perl Skripte, RMI, IIOP,
    Datenbank Queries, SOAP, FTP,…
 OpenSource
  – Einfache Erweiterung für spezielle Umgebungen
 Ant Tasks für Steuerung und Reporting
 Alternativen: Mercury Loadrunner, Segue
  SilkPerformer, Grinder 3
Lasttest Tools – JMeter (2)

            Entwickelt Lasttest mit JMeter
            (Grafische Oberfläche)

                                             Erzeugt

                          Test-Skript
Lasttest Tools – JMeter (3)
 Die Darstellung der Auswertung erfolgt grafisch oder in
  Tabellenform
Problemfelder
 Memory Leaks – OutOfMemoryError
   – Anwendungsfehler durch Loitering Objects
   – Hoher Speicherbedarf der Anwendung
   – Fragmentierung des Heaps durch pinned Objects

 Cycling Objects/Garbage Collection
   – Anwendung erzeugt viele kurzlebige Objekte
   – Einstellungen der JVM

 Performance Engpässe
   – Ineffektiver Code oder Nutzung von APIs
   – Datenbankzugriffe
Commandline Tools (1)

 -verbose:gc Commandline Parameter
   – Erzeugt GC Informationen nach stdout
 -Xverbosegclog:
   – Erzeugt GC Informationen nach stdout
Commandline Tools (2)
  IBM Trace Funktionalität
      – -Dibm.dg.trc.print=st_verify
            • Analyse von Pinned Objects

GC(VFY-SUM): pinned=79(classes=2/freeclasses=0) dosed=85 movable=4609 free=1886
GC(VFY-SUM): freeblocks: max=37080 ave=184 (347384/1886)
GC(VFYAC-SUM): freeblocks: max=94504 ave=7389 (347328/47)

      – -Dibm.dg.trc.print=st_terse
            • Analyse der Objekte vor und nach GC
*DH(1)*   0x10063244   a   x0x50   java.util.HashMap$Entry[16]
*DH(1)*   0x10063294   a   x0x20   java.lang.String@10063298/100632A0
*DH(1)*   0x100632b4   a   x0x18   "float"
*DH(1)*   0x100632cc   a   x0x30   java.util.HashMap@100632D0/100632D8
*DH(1)*   0x100632fc   a   x0x10   java.lang.Object@10063300/10063308
IBM Garbage Analyser (1)

 IBM Pattern Modeling and Analysis Tool for GC
  – IBM alphaworks Produkt
  – Grafische Analyse der –verbose:gc Ausgaben
  – Ermitteln der prozentualen und absoluten Zeiten für
     • Marc
     • Sweep
     • Compact
     • GC
  – Ermitteln von Heap Statistiken
IBM Garbage Analyser (2)
IBM Heapdump (1)
 Erzeugen eines Heapdumps
   – Explizit (kill -3 oder WebSphere DrAdmin Utility)
   – JVM Triggered (OutOfMemoryError)
 Analyse der Objekte im Heap
   – Größe von Caches, Session, etc.
   – Analyse von Memory Leaks
 Steuerung über Environment Variablen
   –   IBM_HEAPDUMP=true
   –   IBM_HEAPDUMP_OUTOFMEMORY=true
   –   IBM_HEAPDUMPDIR=
   –   IBM_HEAPDUMP_TEXT=true
IBM Heapdump (2)

// Version: J2RE 1.4.1 IBM AIX build cadev-20030722

0x30270200    [388832] byte[]
0x302cf0e0    [304] class HeapConsume
0x302cf210    [50232] byte[]
0x302db648    [128] sun/misc/Launcher$AppClassLoader

...............(more data)................

// Breakdown - Classes: 321, Objects: 2624425, ObjectArrays: 486,
   PrimitiveArrays: 1447
// Meta-data - NullRefs: 2623863, Mark(m): 2626359, Alloc(a): 0, Dosed(d): 13,
   Pinned(p): 0, MultiPinned(P): 0
// EOF: Total ’Objects’,Refs(null) : 2626679,2629818(1797)
IBM Heap Analyser (1)

 IBM Heap Analyser
  – IBM alphaworks Produkt
  – Grafische Analyse der IBM Heapdumps
     • Binär
     • Text
  – Automatische Identifikation potentieller Memory Leaks
 Alternative: JProbe Memory Debugger
  – Einlesen von IBM Heapdumps im Textformat möglich
  – Mächtiges Analysewerkzeug
IBM Heap Analyser (2)
JProbe Überblick

 JProbe Suite
   –   JProbe Profiler (Laufzeitanalyse)

   –   JProbe Memory Debugger (Speicherverhalten)

   –   JProbe Coverage (Codeabdeckungsanalyse)

 Existiert schon lange, hoher Bekanntheitsgrad

 Alternativen: WSAD (Hyades), JProfiler, YourKit
JProbe Architektur
 JProbe Suite basiert auf einheitlicher Architektur
                                                              Java
                                                           Anwendung
   JProbe
   Console    Protocol over
                                 Connection     Analysis
                TCP / IP                                     JVM
                                  Manager        Engine
     JVM

 JProbe Console (jpprofiler, jpmemorydebugger, jpcoverage)
 JProbe Analysis Engine (jplauncher)
 JVMPI (JVMTI in Version 7)
JProbe Profiler

 JProbe Profiler
   – Callgraph
   – Hotspot Analyse
   – Bis auf Zeilenebene
JProbe Memory Debugger

 JProbe Memory
  Debugger
  –   Memory Leaks
  –   Cycling Objects
  –   GC
  –   Object Creation

 IBM Heapdump
  Import
Tivoli Performance Viewer (1)

 Seit WebSphere 6 in Admin Console integriert
Tivoli Performance Viewer (2)

 Application Statistics
   – Servlet Response Times
   – EJB Methoden Response Times

 WebSphere Runtime Statistics
   – Thread Pools
   – Database Connections Pools

 System Statistics
   – CPU Utilization
Tivoli Performance Viewer (3)

 Advisor
  – Hinweise zum Tuning des Systems auf Basis der TPV
    Statistiken
 Ergebnisberichte
  – Servlets
  – EJBs/EJB-Methoden
  – Verbindungs- und Threadpools
 Leistungsmodule
  – Charts- und Performance Daten zu CPU, Memory,
    WebSphere Ressourcen und Applikationen
PerformaSure Architektur
PerformaSure Tag&Follow
PerformaSure Überblick

 Bytecode Instrumentierung für wenig Overhead
  – 3%-10% je nach Details und Zeitintervall
 Agenten für Java, http-Server und System
 nexusctl – Commandline Utility
  – Starten und Stoppen von Messungen
  – Konfiguration der Messung mit identischer
    Funktionalität wie Workstation
 Alternativen: Wily Introscope, ITCAM
Tuning Best Practises
Allgemein (1)
 System und Entwicklung müssen zusammenarbeiten
    –   Oft unterschiedliche Umgebungen
    –   Verständnis für das System fehlt bei Entwicklern
    –   Anwendungsarchitektur hat Auswirkungen auf das Systemdesign
    –   Managebarkeit von Anwendungen einfordern!
 Performance/Memory als Architektur- und Designtreiber
    – Immer hohe Priorität, langsame oder instabile Anwendungen habe keine Akzeptanz
    – Fokus auf diese Treiber in einer frühen Phase
    – Definition von messbaren Zielen wichtig
 Die Applikation sollte korrekt funktionieren, bevor sie getuned wird
    – Bugfixing/Weiterentwicklung und Tuning stören sich gegenseitig
    – Konzentration auf Tuning, nicht auf Bugfixing
    – Inkrementelle Vorgehensweise in kurzen Intervallen mit ständigem Tunen trotzdem möglich
 Sauberes Design und intensive Verwendung von Schnittstellen vereinfacht das
  Tuning
    – Kapselung Methoden/Algorithmen/Zugriffe hinter definierten Schnittstellen
    – Macht die Implementierungen austauschbar, wenn diese Probleme verursachen
Allgemein (2)

 Tuning entspricht einem Refactoring
    – Automatisierte Testfälle vor dem Tunen zum Verifizieren der Funktionalität
    – Messung des Erfolgs der Maßnahme durch Profiler
 Verifikation der Performance-Zahlen durch ständige Lasttests
    – früh in der Entwicklungsphase (auch schon Prototypen)
    – Pre-Production und Production oft zu spät
    – Vermeintliche „Kleinigkeiten“ können unter Last zu Hotspots werden
 Fokus immer auf Hotspots, kein Verzetteln in Details
    – Oft hoher Aufwand in Detailtuning, was in keinem Verhältnis zum Gewinn steht
 Effektives Produktionsmonitoring für Performance/Memory
Skalierbarkeit (1)
 Ziele von Skalierung
    – Parallelisierung von Prozessen für höheren Durchsatz
    – Ausschalten des Single-Point-of-Failure für bessere Verfügbarkeit
 Horizontales Clustering
    – Mehrere JVM Instanzen (Application Server) auf mehreren physikalischen Servern
    – Skalierung für Failover und/oder Performance möglich
 Vertikales Clustering
    – Mehrere JVM Instanzen (Application Server) auf einem physikalischen Server
    – Bessere Auslastung der CPUs und optimale Heap Konfiguration
 Load-Balancing
    – Verteilung von Anfragen (JMX, RMI, HTTP) auf verschiedene Application- oder
      Webserver basiert aus IP, User, Content, Auslastung, etc.
    – Sticky Sessions für Load-Balancing ohne Failover für maximale Performance
Skalierbarkeit (2)

 WebSphere Edge Components
  – Load Balancer
  – Caching Proxy
Performance – Übergreifend Java SE / EE

 Logging
   –   Verwenden eines Logging-Frameworks
   –   Abfragen des Logging-Levels vor dem Erstellen der Log-Nachricht
   –   Minimales aber richtiges Logging in Produktionsumgebungen
   –   Kein System.out.println
 Verwenden von Frameworks
   – Oft schon gute Performance
   – Richtige Verwendung!
 JMX für Management und Monitoring nutzen
   – In WebSphere deklarativ über XML möglich
   – In zOS Umgebung bei mehreren Servants unumgänglich!
     (multicall)
Performance – Datenbank
 Minimierung der Anzahl an Zugriffen
   – DB oft auf anderen Rechnern
 Caching auf Resultset-Ebene (oder logische Anwendungsebene
  darüber)
   – aber nicht direkt JDBC-Resultsets (Offene Cursor)
 Nutzung von Prefetch-Möglichkeiten
 Verwendung von Frameworks an Stelle von eigenen JDBC-Zugriffen
   – Oft Caching-Möglichkeiten „umsonst“ dabei
   – Meistens schon sehr gute Performance
 Nutzung von Connection Pooling
   – WebSphere DataSource
   – Optimierung der Größe
 Optimieren der SQLs und Indizes
   – Analyse des Anwendungsverhaltens
   – DBA einschalten!
 Spezifische JDBC Treiber Optimierungen Nutzen
Performance – Java EE (1)
 HTML
  – Bilder/CSS/JavaScript/statisches HTML vom Webserver, nicht vom Application Server
  – Zippen am Webserver einstellen, wenn Leitungskapazität ein Problem ist
  – Auslagern von JavaScripts/Style-Informationen in Dateien um Caching der Browser zu
    nutzen, dynamisch erzeugte HTMLs klein halten
  – Edge Server Caching Proxy verwenden
 JSP
  – Caching teurer JSPs oder Teile davon mit WebSphere Dynamic Caching
      • WebSphere Dynamic Caching unterstützt auch Struts und Tiles
  – Zerlegung einer JSP, wenn Teilelement teuer und dieses gecached werden kann
  – Saubere Kapselung in Custom Tags vereinfacht oft das Performancetuning
 XSL
  – Template-Caching und -kompilierung bei Verwendung von Apache Xalan (XSLTC)
Performance – Java EE (2)
 EJB
   –   Nutzung von Tuningfähikgeiten des Applicationservers (Prefetch, Isolation Level, etc.)
   –   Caching der EJB-Homes
   –   Wenn Entity-Beans nur für Datenbank-Zugriff, dann Lightweight-OR-Mapper verwenden
   –   Minimierung der Remote-Aufrufe
 Servlets
   – Max. Anzahl Threads beachten (abhängig von Plattform)
   – Vermeiden von „synchronized“ in Servlets oder aus Servlets heraus
   – Wenn Webserver „Zippen“ der Ausgabe zur Minimierung der Leitungsbelastung nicht
     kann, dann zentral implementieren (z.B. durch Filter), Abwägen Leitung vs. Prozessor
   – Redirects sind langsamer als Forwards, da der Browser einen neuen Request auslöst
     (Verzweigen innerhalb der Webapplikation oder Kontext-übergreifend)
   – Bei Verwendung der WebSphere Command Framework API auch Command Caching
     möglich
Performance – Java EE (3)
 HTTP-Session
   – Keine großen Objektbäume in Session speichern, zu große Sessions verhindern
     Optionen zur Skalierbarkeit
   – Kapselung des Zugriffs an zentraler Stelle
   – Explizites Invalidieren der Session (nicht auf Timeout verlassen)
   – Session-Timeout-Intervall möglichst klein halten
   – Verwendung von „transient“ für reproduzierbare Daten bei serialisierbaren Sessions
Performance – Caching (1)
 Caching auf allen Ebenen möglich
   –   Edge Server Caching Proxy
   –   Servlet/JSP result caching (WebSphere Dynamic Caching)
   –   Command Caching (WebSphere Dynamic Caching)
   –   DB Zugriff (OSCache, JBoss Cache)
        • First Level: Caching im JDBC Treiber, auf ResultSet Eebene
        • Second Level: Caching ganzer Objektbäume für Abfragen (Hibernate)

 Replikation der Daten im Cluster bei WebSphere Dynamic Cache und
  JBoss Cache möglich

 Caching in Abhängigkeit der JVM prüfen!
Performance – Caching (2)
Memory – Tipps (1)

 Erst Memory-Leaks fixen, dann Performance tunen
 Wiederholbarer, definierter Use Case, am besten automatisiert
   – Unsystematisches „Rumklicken“ in der Anwendung nicht sinnvoll
   – Use Case durch Beobachten des Heaps/GCs verifizieren
   – Sicherstellen, dass Leak vorhanden ist
 Heap-Größe bei Untersuchung möglichst klein halten
   – Verringert die zu untersuchende Datenmenge
 Caches und Pools auf kleinen Wert beschränken
   – schlechtere Antwortzeiten durch kleine Caches/Pools sind hier egal
   – Caches werden oft fehlerhaft als Leak identifiziert
   – Nicht immer möglich, z.B. bei parallelen Zugriffen und fehlerhaften Abbruch bei
     „leerem“ Pool
Memory – Tipps (2)

 HTTP-Session
   – Use Case sollte so geschnitten sein, dass die HTTP-Session immer invalidiert wird
   – Falls dies nicht möglich, Session Timeout sehr gering wählen
   – Vor dem Debuggen sollte Session-Klasse bekannt sein
 Heap einer Anwendung dauernd überprüfen
   – Einsatz von Monitoring-Tools
 Änderungen an den GC-Einstellungen auch immer unter Last
  verifizieren
   – Was für einzelne Zugriffe gut ist, kann unter Last schlecht sein
 Auch eine Untersuchung von „Allocation“-Hotspots kann auf ein
  Memory Leak hindeuten
Memory – Tipps (3)

 Symmetrien bei Anlegen von Referenzen schaffen
   – Wenn eine Methode eine Referenz schafft, muß es eine geben, die diese wieder lösen
     kann
 Untersuchung des Speicherverhaltens an kritischen Punkten früh in
  der Entwicklung
   – Verifizierung von Hypothesen
 Dokumentation der Schnittstellen
   – Design by Contract : Was passiert mit übergebenen Objekten?
   – In einer Referenz-schaffenden Methode auf die Methode zum Löschen der Referenz
     verzweigen
 Eingesetzte „externe“ Frameworks müssen diesbzgl. verstanden
  werden
Sie können auch lesen