Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Mission Control und Flight Recorder

Fabian Lange
November 05, 2013

Mission Control und Flight Recorder

Vortrag von der W-JAX 2013 über Mission Control und Flight Recorder. Die in den Folien wiedergespiegelte Meinung ist meine Eigene.

Fabian Lange

November 05, 2013
Tweet

More Decks by Fabian Lange

Other Decks in Programming

Transcript

  1. Gemeinsamkeiten • Verbindet sich zu VMs via JMX • Dashboards

    – Speicherverbrauch – JVM Umgebungsvariablen • Pluginunterstützung – JMX MBean Überwachung
  2. Permanentes Profiling • JVMTI Profiler – JProfiler – Yourkit –

    weitere • Teure Datensammlung • Teure Datenhaltung Vereinfachte Darstellung
  3. APM Tools • Javaagent Profiler – AppDynamics – Dynatrace –

    New Relic • Transaktionsbasierte Datensammlung • Geringerer Overhead • Weniger Details als Profiler Vereinfachte Darstellung
  4. Oracle != Sun • Sun bot offene Interfaces für Drittanbieter

    an – JVMPI/JVMTI – Javaagent – JSR 163 • HProf war eine "Beispielimplementierung" • Viel Wettbewerb auf dem Markt von Profilern und Monitoring Tools • Flight Recorder ist proprietär
  5. Neue Technik • In HotSpot integriert • +UnlockCommercialFeatures • +UseFlightRecorder

    • Geringer Overhead • Keine Threadkooperation via Safepoints notwendig
  6. Keine Safepoints • JVMTI bietet Safepoint Profiling • Threads müssen

    stoppen / kooperieren • Höherer Overhead • Versatz
  7. Java 6u25 CPU SAMPLES BEGIN (total = 4473) Tue Oct

    29 08:30:35 2013 rank self accum count trace method 1 85.38% 85.38% 3819 300036 java.util.ArrayList.add 2 4.58% 89.96% 205 300035 java.util.ArrayList.ensureCapacity 3 4.56% 94.52% 204 300136 java.lang.AbstractStringBuilder.<init> 4 3.40% 97.92% 152 300137 java.util.Arrays.copyOfRange 5 1.25% 99.17% 56 300148 java.lang.Integer.getChars 6 0.11% 99.28% 5 300037 de.cc.training.cpu.finder.PrimeFinder1.isPrime 7 0.11% 99.40% 5 300140 java.lang.Integer.toString 8 0.11% 99.51% 5 300033 de.cc.training.cpu.finder.PrimeFinder1.findPrimes 9 0.09% 99.60% 4 300144 de.cc.training.cpu.consumer.PrimeConsumer1.consumePrimes 10 0.07% 99.66% 3 300145 java.lang.Integer.intValue 11 0.07% 99.73% 3 300141 java.lang.System.arraycopy 12 0.04% 99.78% 2 300146 de.cc.training.cpu.consumer.PrimeConsumer1.consumePrimes 13 0.02% 99.80% 1 300149 java.lang.Long.valueOf 14 0.02% 99.82% 1 300069 java.io.WinNTFileSystem.canonicalize0 15 0.02% 99.84% 1 300142 java.lang.Integer.toString CPU SAMPLES END
  8. Java 7u40 CPU SAMPLES BEGIN (total = 387) Tue Oct

    29 08:29:38 2013 rank self accum count trace method 1 35.92% 35.92% 139 300137 java.lang.AbstractStringBuilder.<init> 2 22.48% 58.40% 87 300144 de.cc.training.cpu.consumer.PrimeConsumer1.consumePrimes 3 17.57% 75.97% 68 300145 java.lang.Integer.getChars 4 11.89% 87.86% 46 300133 java.util.Arrays.copyOfRange 5 3.62% 91.47% 14 300136 java.lang.System.arraycopy 6 1.81% 93.28% 7 300052 java.util.ArrayList.grow 7 1.29% 94.57% 5 300050 de.cc.training.cpu.finder.PrimeFinder1.findPrimes 8 1.29% 95.87% 5 300141 de.cc.training.cpu.consumer.PrimeConsumer1.consumePrimes 9 0.78% 96.64% 3 300138 java.lang.Integer.toString 10 0.52% 97.16% 2 300140 de.cc.training.cpu.consumer.PrimeConsumer1.consumePrimes 11 0.52% 97.67% 2 300143 de.cc.training.cpu.consumer.PrimeConsumer1.consumePrimes 12 0.26% 97.93% 1 300142 de.cc.training.cpu.consumer.PrimeConsumer1.consumePrimes 13 0.26% 98.19% 1 300139 java.lang.StringBuilder.<init> 14 0.26% 98.45% 1 300053 java.lang.Integer.valueOf 15 0.26% 98.71% 1 300134 java.lang.System.arraycopy CPU SAMPLES END
  9. @EventDefinition(path = "primes/found", name = "Prime Found", description = "",

    stacktrace = true, thread = true) public class PrimeFoundEvent extends InstantEvent { @ValueDefinition(name = "Prime", description = "", contentType = ContentType.None) private int prime; public PrimeFoundEvent(EventToken eventToken) { super(eventToken); } public int getPrime() { return prime; } public void setPrime(int prime) { this.prime = prime; } }
  10. public class FlightRecorderEventHelper { private final static String PRODUCER_URI =

    "http://www.codecentric.de/"; private static final Producer PRODUCER; private static final EventToken EVENT_TOKEN; static { PRODUCER = createProducer(); EVENT_TOKEN = createToken(); PRODUCER.register(); } private static Producer createProducer() { return new Producer("Prime Found Producer", "", PRODUCER_URI); } private static EventToken createToken() { return PRODUCER.addEvent(PrimeFoundEvent.class); } private static PrimeFoundEvent event = new PrimeFoundEvent(EVENT_TOKEN); public static void createEvent(int prime) { event.reset(); event.setPrime(prime); event.commit(); }
  11. Her damit! • -XX:+UnlockCommercialFeatures • Eine "Lizenz" pro Produktionssystem. –

    Pro Prozessor. 5k USD / 15k USD – Intel: Halber Preis • Für Entwicklung und Test gratis • Im Vergleich: – JProfiler pro Entwickler < 500 USD – AppDynamics pro JVM < 3000 USD
  12. Was ist Flight Recorder • Kein APM Tool – Keine

    zentrale Datenspeicherung – Keine Alarmierung • Kein Profiler – Profiler Lizenz pro Developer
  13. Fazit • Das Tool ist gut • Das Tool ist

    teuer • Die API nicht zu öffnen ist böse