JVM Monitoring - Tobias Frech
JVM Monitoring - Tobias Frech
JVM Monitoring - Tobias Frech
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)