Et tråddump af en proces Builtin Profiling tools and their Implementation
Ud over disse er der forskellige indbyggede værktøjer til at lave profilering af JVM som Java VisualVM,Honest Profiler, Async Profiler og Java Mission Controller
Hvor vi går i dybden med disse profilere, bør vi kende begrebet “Safe point”. JVM tager sig internt af mange ting for os, f.eks. Garbage Collection og JIT Compilation. Så JVM har også brug for sin egen tid til at ordne nogle ting for sig selv, uden for programmet. Nogle af de ting, som JVM kan gøre, kan involvere et safepoint (herunder GC). Under et safepoint suspenderes alle tråde, der kører Java-kode, for at JVM kan udføre sit arbejde. Programmet går i stå i den tid, hvor JVM går til et safepoint, så nogle profilere lider under disse safepoint-problemer, hvor de giver en callback til de angivne tråde, og disse tråde skal være i et safepoint for at reagere på denne callback, hvilket påvirker ydeevnen.
På den anden side bruger nogle profilere et openJDK-internt API-kald AsyncGetCallTrace (ASGT) for at lette indsamling af stacktraces uden for safepoint. AsyncGetCallTrace er IKKE et officielt JVM API.For at bruge ASGT skal du først oprette en JVMTI-agent .Java Virtual Machine Tool Interface (JVMTI) er en programmeringsgrænseflade, der giver dig som softwareudvikler mulighed for at oprette softwareagenter, der kan overvåge og styre dine programmer i Java-programmeringssproget.Derefter skal du oprette en signalhåndtering, der udløser et signal med den ønskede prøvefrekvens.Dette signal vil blive rettet til den kørende JVM, og en af deres kørende tråde vil blive afbrudt og kalde tilbage til vores signalhandler.Sørg for, at den afbrudte tråd kører i din signalhandler og kald AGCT .Honest profiler bruger denne ASGT til at lave profilering .
The Honest profiler har to dele til det. En C++ JVMTI-agent, der skriver en fil, der indeholder alle profileringsoplysninger om den applikation, som jvmti-agenten var knyttet til.Den anden del er en Java-applikation, der gengiver en profil baseret på denne log, der tidligere blev genereret.
ASGT-metoden vil se sådan her ud. AsyncGetCallTrace(ASGCT_CallTrace *trace,jint depth,void* ucontext) .Vi skal videregive en pointer til ASGT call trace til denne metode.
Problemet med denne fremgangsmåde er, at man får lidt andre data end en typisk Java stack trace. Profileren skal behandle det og mappe det til linjerne i kildekoden for at være brugbar.
Async profiler er en low overhead sampling profiler, der fungerer ved at knytte en native Java agent til en kørende JVM-proces og indsamle stack trace samples ved hjælp af HotSpot-specifikke API’er. Async-profiler fungerer kun på GNU/Linux og MacOS, og på førstnævnte bruger den desuden perf_events til også at grave i indfødt kode .Den generelle fremgangsmåde er at modtage call stacks genereret af perf_events og matche dem med call stacks genereret af AsyncGetCallTrace, for at producere en præcis profil af både Java- og indfødt kode. Den bruger perf_events API’et til at konfigurere CPU-sampling til en hukommelsesbuffer og beder om et signal, der skal leveres, når en sample forekommer. Signalbehandleren kalder derefter AGCT og samler de to stakke sammen: Java-stakken, der er opfanget af AGCT, og den native + kernel-stakken, der er opfanget af perf_events. For ikke-Java-tråde bevares kun stakken perf_events.
Java Mission Controller(JMC) giver en detaljeret rapport om hver af de specifikke tråde i hver JVM og deres CPU-forbrugsprocent på en effektiv måde.Java Mission Control fungerer ved at interagere med en JMX-agent i JVM’en, som har en MBean-server, der integrerer med den indbyggede VM- og app-instrumentering, der kører i JVM’en. Det er en vigtig fordel, da det virkelig sænker værktøjets overheadomkostninger, da det bruger allerede eksisterende hooks. Oracle oplyser, at dette normalt er langt under 1 % overhead.Her er intet, som du skal installere eller tilknytte til din eksisterende VM for at få det til at fungere. Med Flight recorder er der et par flag, du skal aktivere, men der er intet at installere. Start en terminal gå til din JDK bin mappe og skriv bare jmc. jMC vil output en GUI der indeholder dine kørende JVM’er. vælg den JVM proces du skal profilere og start optagelse ved at angive tidsgrænsen.
Et JavaFlightRecorder dashboard Et andet populært alternativ er at bruge Linux perf, som ikke direkte understøtter Java, men som har god understøttelse for profilering af native kode, og som ikke har problemer med at se på kernel stacks også. Til JVM-understøttelse har vi brug for et perf-map, der mapper JIT-kompilerede adresser til funktionsnavne (som en konsekvens heraf understøttes kun kompilerede rammer; fortolkerrammer er usynlige)
Og en JIT-switch -XX:+PreserveFramePointer, der sørger for, at perf kan gå rundt i Java-stakken. Når du bruger denne form for tilgang, ender du med at miste fortolkerrammer.Du kan ikke profilere en ældre JVM, der ikke har PreserveFramePointer-flaget.Der kan være nogle forældede poster i dit perfmap, fordi JIT kan omkompilere koden.Da JIT smider noget kode væk, kan nogle funktionaliteter ende med at være med ukorrekt implementering.
Ud over disse har Java 2 Platform Standard Edition (J2SE) altid leveret et simpelt kommandolinjeprofileringsværktøj kaldet HPROF til heap- og cpu-profilering. HPROF er et værktøj, der er indbygget i JDK til profilering af CPU- og heap-forbruget i en JVM. HPROF er faktisk et JVM-bibliotek med native agent, som indlæses dynamisk via en kommandolinjeindstilling ved opstart af JVM’en og bliver en del af JVM-processen. Ved at angive HPROF-optioner ved opstart kan brugerne anmode HPROF om forskellige typer heap- og/eller cpu-profileringsfunktioner. De genererede data kan være i tekst- eller binært format og kan bruges til at opspore og isolere ydelsesproblemer, der involverer hukommelsesforbrug og ineffektiv kode. Filen i binært format fra HPROF kan bruges med værktøjer som HAT til at gennemse de allokerede objekter i heap.
Slutning
Vi konstaterer, at den ærlige profilering og Async-profilering har overvundet anomalien “Suffering from safepoints” ved et openJDK-internt API-kald AsyncGetCallTrace.De kan udføre profilering med langt færre overheads end standardprofileringsværktøjerne, men de kan ikke give en detaljeret profilering af de tråde, der er specifikke for JVM-processerne hver for sig. De kan kun udstede en logfil/GUI-grænseflade af hele tråddumps som en flok.På den anden side kan Java Mission Control profilere de tråde, der er specifikke for hver enkelt proces separat, hvor du kan overvåge de varme tråde med deres CPU-forbrug.JMC er således den bedste mulighed for at overvåge JVM-parametrene med stor granularitet.
Referencer.
Java Virtual Machine Process Status Tool Oracle Documentation.
https://docs.oracle.com/javase/7/docs/technotes/tools/share/jps.html
Oprettelse af en debugging- og profileringsagent med JVMTI
http://www.oracle.com/technetwork/articles/java/jvmti-136367.html
Fordele og ulemper ved AsyncGetCallTrace-profilere
http://psy-lob-saw.blogspot.com/2016/06/the-pros-and-cons-of-agct.html
En sampling JVM-profilere uden safepoint sample bias-Honest Profiler
https://github.com/jvm-profiling-tools/honest-profiler
Sampling CPU- og HEAP-profiler til Java med AsyncGetCallTrace + perf_events
https://github.com/jvm-profiling-tools/async-profiler