28.12.2012 Aufrufe

JVM Monitoring - Tobias Frech

JVM Monitoring - Tobias Frech

JVM Monitoring - Tobias Frech

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>JVM</strong> <strong>Monitoring</strong><br />

Verfügbarkeit und Performance aus<br />

Sicht der Java Virtual Machine<br />

<strong>Tobias</strong> <strong>Frech</strong>


Warum <strong>Monitoring</strong>?<br />

● primäres Interesse:<br />

Verfügbarkeit der Anwendung<br />

● Minimierung von Ausfallzeiten<br />

– schnelles Alarming<br />

– rasche Fehlersuche und -abhilfe<br />

– potentielle Fehlerquellen frühzeitig erkennen<br />

● Schlechte Perfomance auf Grund von<br />

Resourcen-Engpässen erkennen


Was monitoren?<br />

● Anwendungssystem als „Stack“, <strong>JVM</strong> ist Teil<br />

dieses Stacks<br />

● Abhängigkeiten:<br />

– Ausfall einer unteren Schicht beeinflußt<br />

Verfügbarkeit der darüberliegenden Schicht<br />

– Verfügbarkeit der unteren Schicht garantiert<br />

nicht die Verfügbarkeit der darüberliegenden<br />

Schicht<br />

● <strong>Monitoring</strong> aller Schichten, um Fehler schneller<br />

zu finden und Ressourcenengpässe frühzeitig zu<br />

erkennen.


Anwendung<br />

App-Server /<br />

Framework<br />

<strong>JVM</strong><br />

OS<br />

betriebswirtschaftliche<br />

Prozesse<br />

Session-Verwaltung,<br />

Connection Pools,<br />

Transaktionsmanager<br />

Speichermanagement,<br />

Speichermanagement<br />

Thread-Management,<br />

Code-Kompilierung (JIT)<br />

RAM, Festplattenspeicher,<br />

Prozessmanagement, File<br />

handles, TCP-Sockets


Garbage Collection<br />

aus http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html


● Logs<br />

Werkzeuge<br />

● JConsole / JMX / JSR-160<br />

● JDK Tools<br />

● SNMP


Log-Dateien<br />

● Garbage Collection (GC)<br />

– -verbose:gc / -XX:+PrintGC / -Xloggc:datei<br />

– -XX:+PrintGCDetails<br />

– -XX:+PrintGCTimeStamps<br />

– -XX:+PrintTenuringDistribution<br />

● GCViewer (http://www.tagtraum.com/gcviewer.html)<br />

● Kompilierung<br />

– -XX:+PrintCompilation<br />

– -XX:-DontCompileHugeMethods


JConsole / JMX<br />

● JMX: MBeans / MBeanServer<br />

● JConsole als JMX-Agent<br />

● Lokal aktivieren:<br />

– JDK 5: -Dcom.sun.management.jmxremote<br />

– JDK 6: nix, dank Attach API<br />

● Seit JDK 6 Plugin API vorhanden:<br />

com.sun.tools.jconsole


● jps<br />

● jstat<br />

JDK <strong>Monitoring</strong> Tools


jps<br />

● listet die lvmid aller für den ausführenden<br />

Benutzer monitorbaren <strong>JVM</strong>s auf<br />

● -l für vollen Package-Namen<br />

● -v für <strong>JVM</strong>-Argumente<br />

● -m für Argumente an die main-Methode


jstat<br />

● liefert zur lvmid Informationen zu<br />

Classloading, Compiler und<br />

Speichermanagement<br />

● zyklische Anzeige möglich, einstellbare<br />

Frequenz<br />

● limitierte Anzahl möglich


jstat -class<br />

Loaded Bytes Unloaded Bytes Time<br />

2307 2523,7 0 0,0 0,69<br />

2512 2790,0 0 0,0 0,78<br />

2928 3299,8 0 0,0 0,90<br />

3146 3494,9 0 0,0 0,98<br />

3616 4121,5 0 0,0 1,17<br />

4044 4690,1 0 0,0 1,35<br />

4194 4871,0 0 0,0 1,71<br />

4289 4995,2 0 0,0 1,75<br />

4480 5213,1 0 0,0 1,82<br />

4844 5729,0 0 0,0 2,76<br />

5097 6025,9 0 0,0 3,07<br />

5132 6067,2 0 0,0 3,09<br />

5170 6104,3 0 0,0 3,10<br />

5203 6143,1 5 11,1 3,11<br />

5224 6162,9 5 11,1 3,11


jstat -compiler<br />

Compiled Failed Invalid Time FailedType FailedMethod<br />

341 0 0 5,79 0<br />

386 0 0 6,84 0<br />

442 0 0 7,72 0<br />

478 0 0 9,72 0<br />

514 0 0 10,03 0<br />

550 0 0 11,34 0<br />

550 0 0 11,34 0<br />

551 0 0 11,40 0<br />

551 0 0 11,40 0<br />

551 0 0 11,40 0<br />

553 0 0 11,42 0<br />

564 0 0 12,18 0


jstat -gc<br />

S0C S1C S0U S1U EC EU OC OU<br />

64,0 64,0 0,0 47,0 960,0 681,4 12912,0 10493,7<br />

128,0 128,0 128,0 0,0 1280,0 0,0 17808,0 10766,0<br />

128,0 128,0 94,8 0,0 1280,0 0,0 17808,0 13257,1<br />

128,0 128,0 0,0 70,3 1280,0 0,0 17808,0 14803,1<br />

128,0 128,0 0,0 75,1 1280,0 0,0 17808,0 16427,0<br />

192,0 192,0 0,0 0,0 1792,0 0,0 25892,0 15533,8<br />

192,0 192,0 0,0 90,9 1792,0 373,5 25892,0 18214,1<br />

192,0 192,0 0,0 113,4 1792,0 37,4 25892,0 19589,0<br />

PC PU YGC YGCT FGC FGCT GCT<br />

12288,0 18,5 449 0,352 6 0,306 0,657<br />

12288,0 18,5 516 0,405 7 0,396 0,801<br />

12288,0 18,5 568 0,458 7 0,396 0,853<br />

12288,0 18,5 621 0,507 7 0,396 0,903<br />

12288,0 18,5 675 0,557 7 0,396 0,953<br />

12288,0 18,5 722 0,603 8 0,542 1,145<br />

12288,0 18,5 761 0,655 8 0,542 1,196<br />

12288,0 18,5 799 0,700 8 0,542 1,242


jstat, weitere Optionen<br />

● gccapacity: zeigt min, max und current<br />

der Generations<br />

● gccause: zeigt Grund der momentanen<br />

GC (Allocation Failure, System.gc(),...)<br />

● gcnew: Parameter der „Promotion“ von<br />

Young nach Tenured, ähnlich -XX:<br />

+PrintTenuringDistribution<br />

● gcnewcapacity, gcold, gcoldcapacity,<br />

gcpermcapacity, gcutil


JDK Troubleshooting Tools<br />

● Fehlersuche:<br />

– jinfo (<strong>JVM</strong>-Parameter und -Environment)<br />

– jstack (Stack / Thread incl. Locks)<br />

– jmap (Speicheranalyse und -dumps)<br />

– jhat (Speicherdump-“Browser“)


● jstatd<br />

Remote Werkzeuge<br />

● JMX Remote API: JSR 160<br />

– JConsole<br />

– MC4J (2.0 alpha 1, 18. Juni 2006)<br />

● SNMP


jstatd<br />

● Erlaubt den Zugriff von jps und jstat von<br />

einem entfernten System aus<br />

● keine Sicherungsmechanismen<br />

● benötigt jedoch policy-Datei:<br />

– jstatd -J-Djava.security.policy=jstatd.all.policy<br />

● jps servername<br />

● jstat -gc lvmid@servername<br />

● Achtung: RMI, dies hat seine Tücken!


JConsole Remote<br />

JMX (JSR 160) für remote-Zugriffe öffnen:<br />

-Dcom.sun.management.jmxremote.port=12345<br />

-Dcom.sun.management.jmxremote.authenticate=false<br />

-Dcom.sun.management.jmxremote.ssl=false


SNMPv2c Agent<br />

● Simple Network Management Protocol<br />

● Agent kann in der <strong>JVM</strong> aktiviert werden:<br />

-Dcom.sun.management.snmp.port=portNum<br />

● Abgesichert über ACL-Datei:<br />

-Dcom.sun.management.snmp.acl.file=ACLFilePath<br />

oder deaktiveren:<br />

-Dcom.sun.management.snmp.acl=false<br />

● MIB enthält: statische OS und <strong>JVM</strong><br />

Informationen, dynamisch: Threads,<br />

Memory/GC


MBeanServer integrieren<br />

● für JBoss:<br />

● -Djavax.management.builder.initial=<br />

org.jboss.system.server.jmx.MBeanServerBuilderImpl<br />

● -Djboss.platform.mbeanserver<br />

● ermöglicht vielfältige Monitormöglichkeiten<br />

über die <strong>JVM</strong> hinaus


● Server<br />

Beispiel JBoss (I)<br />

– jboss.system:type=ServerInfo<br />

• TotalMemory, ActiveThreadCount<br />

● GC / „Free Memory“<br />

– java.lang:name=Copy,type=GarbageCollector<br />

• CollectionCount (δ), CollectionTime (δ)<br />

– java.lang:name=MarkSweepCompact,type=GarbageCollec<br />

tor<br />

• CollectionCount (δ), CollectionTime (δ)<br />

● Operating System<br />

– java.lang:type=OperatingSystem<br />

• SystemLoadAverage, OpenFileDescriptorCount,<br />

FreePhysicalMemorySize


● HTTP-Connector:<br />

Beispiel JBoss (II)<br />

– jboss.web:type=ThreadPool,name=http-0.0.0.0-8080<br />

• currentThreadsBusy, currentThreadCount<br />

– jboss.web:type=GlobalRequestProcessor,name=http-<br />

0.0.0.0-8080<br />

• requestCount (δ), maxTime<br />

● Webanwendung:<br />

– jboss.web:type=Manager,path=/,host=localhost<br />

• activeSessions, maxActive<br />

● Transaktions-Manager:<br />

– jboss:service=TransactionManager<br />

• RollbackCount (δ), CommitCount (δ)


● JMS:<br />

Beispiel JBoss (III)<br />

– jboss.mq.destination:service=Queue,name=DLQ<br />

• QueueDepth, SubscribersCount, ReceiversCount<br />

● Datasource:<br />

– jboss.jca:service=ManagedConnectionPool,name=myDS<br />

• AvailableConnectionCount<br />

● Frameworks, z.B. Hibernate:<br />

– Hibernate:type=statistics<br />

• SuccessfulTransactionCount (δ), OptimisticFailureCount<br />

(δ), TransactionCount (δ)<br />

● MBeans der Anwendung


Sinnvolles <strong>Monitoring</strong><br />

● Wenn möglich SLAs erfassen,<br />

regelmäßiges Feedback zum Nutzer über<br />

SLA-Berichte<br />

● Erfasst alle Schichten und Lastquellen<br />

● bzgl. <strong>JVM</strong>:<br />

– PermGenSpace überwachen<br />

– FreeMemory nicht sinnvoll<br />

– Frequenz und Dauer der Garbage Collection<br />

(insb. Tenured Generation) sinnvoller


Vielen Dank an die Photographen<br />

(in order of appearance :-) )<br />

Áron Balogh (cctv)<br />

Fant0men (BSOD, GPL)<br />

Daniel Wildman (lego)<br />

Sanja Gjenero (tools, why?)<br />

Marcelo Terraza (helmet)

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!