JVM Monitoring Verfügbarkeit und Performance aus Sicht der Java Virtual Machine Tobias Frech
Warum Monitoring? primäres Interesse: Verfügbarkeit der Anwendung Minimierung von Ausfallzeiten schnelles Alarming rasche Fehlersuche und -abhilfe potentielle Fehlerquellen frühzeitig erkennen Schlechte Perfomance auf Grund von Resourcen-Engpässen erkennen
Was monitoren? Anwendungssystem als Stack, JVM ist Teil dieses Stacks Abhängigkeiten: Ausfall einer unteren Schicht beeinflußt Verfügbarkeit der darüberliegenden Schicht Verfügbarkeit der unteren Schicht garantiert nicht die Verfügbarkeit der darüberliegenden Schicht Monitoring aller Schichten, um Fehler schneller zu finden und Ressourcenengpässe frühzeitig zu erkennen.
Anwendung betriebswirtschaftliche Prozesse App-Server / Framework Session-Verwaltung, Connection Pools, Transaktionsmanager JVM Speichermanagement, Speichermanagement Thread-Management, Code-Kompilierung (JIT) OS RAM, Festplattenspeicher, Prozessmanagement, File handles, TCP-Sockets
Garbage Collection aus http://java.sun.com/docs/hotspot/gc5./gc_tuning_5.html
Werkzeuge Logs JConsole / JMX / JSR-16 JDK Tools SNMP
Log-Dateien Garbage Collection (GC) -verbose:gc / -XX:+PrintGC / -Xloggc:datei -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution GCViewer Kompilierung (http://www.tagtraum.com/gcviewer.html) -XX:+PrintCompilation -XX:-DontCompileHugeMethods
JConsole / JMX JMX: MBeans / MBeanServer JConsole als JMX-Agent Lokal aktivieren: JDK 5: -Dcom.sun.management.jmxremote JDK 6: nix, dank Attach API Seit JDK 6 Plugin API vorhanden: com.sun.tools.jconsole
JDK Monitoring Tools jps jstat
jps listet die lvmid aller für den ausführenden Benutzer monitorbaren JVMs auf -l für vollen Package-Namen -v für JVM-Argumente -m für Argumente an die main-methode
jstat liefert zur lvmid Informationen zu Classloading, Compiler und Speichermanagement zyklische Anzeige möglich, einstellbare Frequenz limitierte Anzahl möglich
jstat -class Loaded 237 2512 2928 3146 3616 444 4194 4289 448 4844 597 5132 517 523 5224 Bytes Unloaded 2523,7 279, 3299,8 3494,9 4121,5 469,1 4871, 4995,2 5213,1 5729, 625,9 667,2 614,3 6143,1 5 6162,9 5 Bytes,,,,,,,,,,,,, 11,1 11,1 Time,69,78,9,98 1,17 1,35 1,71 1,75 1,82 2,76 3,7 3,9 3,1 3,11 3,11
jstat -compiler Compiled Failed Invalid 341 386 442 478 514 55 55 551 551 551 553 564 Time FailedType FailedMethod 5,79 6,84 7,72 9,72 1,3 11,34 11,34 11,4 11,4 11,4 11,42 12,18
jstat -gc SC 64, 128, 128, 128, 128, 192, 192, 192, S1C 64, 128, 128, 128, 128, 192, 192, 192, PC 12288, 12288, 12288, 12288, 12288, 12288, 12288, 12288, PU 18,5 18,5 18,5 18,5 18,5 18,5 18,5 18,5 SU, 128, 94,8,,,,, S1U 47,,, 7,3 75,1, 9,9 113,4 YGC 449 516 568 621 675 722 761 799 EC 96, 128, 128, 128, 128, 1792, 1792, 1792, YGCT FGC,352 6,45 7,458 7,57 7,557 7,63 8,655 8,7 8 EU 681,4,,,,, 373,5 37,4 OC 12912, 1788, 1788, 1788, 1788, 25892, 25892, 25892, FGCT,36,396,396,396,396,542,542,542 GCT,657,81,853,93,953 1,145 1,196 1,242 OU 1493,7 1766, 13257,1 1483,1 16427, 15533,8 18214,1 19589,
jstat, weitere Optionen gccapacity: zeigt min, max und current der Generations gccause: zeigt Grund der momentanen GC (Allocation Failure, System.gc(),...) gcnew: Parameter der Promotion von Young nach Tenured, ähnlich -XX: +PrintTenuringDistribution gcnewcapacity, gcold, gcoldcapacity, gcpermcapacity, gcutil
JDK Troubleshooting Tools Fehlersuche: jinfo (JVM-Parameter und -Environment) jstack (Stack / Thread incl. Locks) jmap (Speicheranalyse und -dumps) jhat (Speicherdump- Browser )
Remote Werkzeuge jstatd JMX Remote API: JSR 16 JConsole MC4J (2. alpha 1, 18. Juni 26) SNMP
jstatd Erlaubt den Zugriff von jps und jstat von einem entfernten System aus keine Sicherungsmechanismen benötigt jedoch policy-datei: jstatd -J-Djava.security.policy=jstatd.all.policy jps servername jstat -gc lvmid@servername Achtung: RMI, dies hat seine Tücken!
JConsole Remote JMX (JSR 16) für remote-zugriffe öffnen: -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
SNMPv2c Agent Simple Network Management Protocol Agent kann in der JVM aktiviert werden: -Dcom.sun.management.snmp.port=portNum Abgesichert über ACL-Datei: -Dcom.sun.management.snmp.acl.file=ACLFilePath oder deaktiveren: -Dcom.sun.management.snmp.acl=false MIB enthält: statische OS und JVM Informationen, dynamisch: Threads, Memory/GC
MBeanServer integrieren für JBoss: -Djavax.management.builder.initial= org.jboss.system.server.jmx.mbeanserverbuilderimpl -Djboss.platform.mbeanserver ermöglicht vielfältige Monitormöglichkeiten über die JVM hinaus
Beispiel JBoss (I) Server jboss.system:type=serverinfo GC / Free Memory java.lang:name=copy,type=garbagecollector CollectionCount (δ), CollectionTime (δ) java.lang:name=marksweepcompact,type=garbagecollec tor TotalMemory, ActiveThreadCount CollectionCount (δ), CollectionTime (δ) Operating System java.lang:type=operatingsystem SystemLoadAverage, OpenFileDescriptorCount, FreePhysicalMemorySize
Beispiel JBoss (II) HTTP-Connector: jboss.web:type=threadpool,name=http-...-88 jboss.web:type=globalrequestprocessor,name=http...-88 requestcount (δ), maxtime Webanwendung: jboss.web:type=manager,path=/,host=localhost currentthreadsbusy, currentthreadcount activesessions, maxactive Transaktions-Manager: jboss:service=transactionmanager RollbackCount (δ), CommitCount (δ)
Beispiel JBoss (III) JMS: jboss.mq.destination:service=queue,name=dlq Datasource: jboss.jca:service=managedconnectionpool,name=myds AvailableConnectionCount Frameworks, z.b. Hibernate: Hibernate:type=statistics QueueDepth, SubscribersCount, ReceiversCount SuccessfulTransactionCount (δ), OptimisticFailureCount (δ), TransactionCount (δ) MBeans der Anwendung
Sinnvolles Monitoring Wenn möglich SLAs erfassen, regelmäßiges Feedback zum Nutzer über SLA-Berichte Erfasst alle Schichten und Lastquellen bzgl. JVM: PermGenSpace überwachen FreeMemory nicht sinnvoll Frequenz und Dauer der Garbage Collection (insb. Tenured Generation) sinnvoller
Vielen Dank an die Photographen (in order of appearance :-) ) Áron Balogh (cctv) Fantmen (BSOD, GPL) Daniel Wildman (lego) Sanja Gjenero (tools, why?) Marcelo Terraza (helmet)