En guide til async-profiler

1. Oversigt

Java Sampling Profiler er normalt designet ved hjælp af JVM Tool Interface (JVMTI) og indsamler stakspor på et safepoint. Derfor kan disse prøveudtagningsprofiler lide af problemet med safepoint-bias.

For et helhedsbillede af applikationen, vi har brug for en samplingprofil, der ikke kræver, at tråde skal være ved safepoints og kan til enhver tid indsamle stackspor for at undgå safepoint-bias-problemet.

I denne vejledning udforsker vi async-profil sammen med forskellige profileringsteknikker, den tilbyder.

2. async-profil

async-profil er en samplingprofil til enhver JDK baseret på HotSpot JVM. Den har lav overhead og stoler ikke på JVMTI.

Det undgår problemet med safepoint-bias ved at bruge AsyncGetCallTrace API leveret af HotSpot JVM til profilering af Java-kodestier og Linux perf_events for at profilere de oprindelige kodestier.

Med andre ord matcher profilen opkaldsstabler med både Java-kode og native kodestier for at producere nøjagtige resultater.

3. Opsætning

3.1. Installation

Først downloader vi den seneste udgave af async-profil baseret på vores platform. I øjeblikket understøtter det kun Linux- og macOS-platforme.

Når det er downloadet, kan vi kontrollere, om det fungerer på vores platform:

$ ./profiler.sh --version
Async-profiler 1.7.1 bygget den 14. maj 2020 Copyright 2016-2020 Andrei Pangin

Det er altid en god ide at kontrollere alle de tilgængelige muligheder med async-profil på forhånd:

$ ./profiler.sh
Anvendelse: ./profiler.sh [handling] [optioner] Handlinger: start start profilering og returner straks genoptag CV-profilering uden at nulstille indsamlede data stop stop profilering Kontroller om den angivne profilhændelse er tilgængelig status print profilering profil liste liste profilhændelser understøttet af målet JVM indsamle samleprofil i den angivne tidsperiode og stop derefter (standardhandling) Valgmuligheder: -e begivenhedsprofilering begivenhed: cpu | allokering | lås | cache-savner osv. -d varighed kør profilering i sekunder -f filnavn dump output til -i interval prøveudtagningsinterval i nanosekunder -j jstackdypth maksimum Java stack dybde -b bufsize rammebufferstørrelse -t profil forskellige tråde separat -s enkle klasse navne i stedet for FQN -g udskrivningsmetode underskrifter -a kommentere Java-metodenavne -o fmt output format: oversigt | spor | fladt | skjult | svg | træ | jfr -Jeg inkluderer kun output stak spor, der indeholder det angivne mønster -X ekskluder ekskluder stak spor med det specificerede mønster -v, - rsion streng - titelstreng SVG-titel - bredde px SVG bredde - højde px SVG rammehøjde - min. bredde px springer rammer mindre end px - omvendt genererer stakomvendt FlameGraph / Opkaldstræ - alle kerner inkluderer kun kerne- tilstandshændelser - alle brugere inkluderer kun brugertilstandshændelser - cstack-tilstand hvordan man krydser C stack: fp | lbr | nej er et numerisk proces-id for mål-JVM eller 'jps' nøgleord for at finde kørende JVM automatisk

Mange af de viste indstillinger vil være nyttige i de senere sektioner.

3.2. Kernekonfiguration

Ved brug async-profil på Linux-platformen, skal vi sørge for at konfigurere vores kerne til at fange opkaldsstakke ved hjælp af perf_events af alle brugere:

Først indstiller vi perf_event_paranoid til 1, som gør det muligt for profilen at indsamle ydeevneoplysninger:

$ sudo sh -c 'echo 1> / proc / sys / kernel / perf_event_paranoid'

Derefter indstiller vi kptr_restrict til 0 for at fjerne begrænsningerne for udsættelse af kerneadresser:

$ sudo sh -c 'echo 0> / proc / sys / kernel / kptr_restrict'

Men den async-profil fungerer i sig selv på macOS-platformen.

Nu hvor vores platform er klar, kan vi opbygge vores profileringsapplikation og køre den ved hjælp af Java-kommandoen:

$ java -XX: + UnlockDiagnosticVMOptions -XX: + DebugNonSafepoints -jar sti-til-jar-fil

Her, vi har startet vores profileringsapp ved hjælp af -XX: + UnlockDiagnosticVMOptions -XX: + DebugNonSafepoints JVM-flag, der anbefales til nøjagtige resultater.

Nu hvor vi er klar til at profilere vores applikation, lad os undersøge forskellige typer profilering understøttet af async-profil.

4. CPU-profilering

Async-profil indsamler eksempler på staksspor af Java-metoder, herunder JVM-kode, native klasse og kernefunktioner, ved profilering af CPU.

Lad os profilere vores applikation ved hjælp af dens PID:

$ ./profiler.sh -e cpu -d 30 -o resumé 66959 Startet [cpu] profilering --- Udførelsesprofil --- Samlede prøver: 28 Rammebufferbrug: 0,069%

Her har vi defineret cpu profilering begivenhed ved hjælp af -e mulighed. Derefter brugte vi -d mulighed for at indsamle prøven i 30 sekunder.

Sidst, det -o option er nyttig til at definere outputformatet som resume, HTML, spor, SVG og træ.

Lad os oprette HTML-output, mens CPU-profilering af vores applikation:

$ ./profiler.sh -e cpu -d 30 -f cpu_profile.html 66959

Her kan vi se, at HTML-output giver os mulighed for at udvide, skjule og søge i prøverne.

Derudover async-profil understøtter flammegrafer out-of-the-box.

Lad os generere en flammegraf ved hjælp af .svg filtypenavn til CPU-profilen i vores applikation:

$ ./profiler.sh -e cpu -d 30 -f cpu_profile.svg 66959

Her viser den resulterende flammegraf Java-kodestier i grønt, C ++ i gult og systemkodestier i rødt.

5. Tildelingsprofilering

På samme måde kan vi indsamle prøver af hukommelsestildeling uden at bruge en påtrængende teknik som bytecode-instrumentering.

async-profil bruger den TLAB-baserede prøveudtagningsteknik (Thread Local Allocation Buffer) til at indsamle prøverne fra bunktildelingen over den gennemsnitlige størrelse af TLAB.

Ved hjælp af tildele begivenhed, kan vi sætte profilen i stand til at indsamle bunktildelinger af vores profilapplikation:

$ ./profiler.sh -e alloc -d 30 -f alloc_profile.svg 66255

Her kan vi se, at objektkloning har tildelt en stor del af hukommelsen, som ellers er svær at opfatte, når man ser på koden.

6. Vægursprofilering

Også, async-profil kan prøve alle tråde uanset deres status - som at løbe, sove eller blokere - ved hjælp af vægurprofilen.

Dette kan vise sig praktisk, når du foretager fejlfinding af problemer i applikationens opstartstid.

Ved at definere væg begivenhed, kan vi konfigurere profilen til at indsamle prøver af alle tråde:

$ ./profiler.sh -e væg -t -d 30 -f wall_clock_profile.svg 66959

Her har vi brugt vægurprofileren i per-thread-tilstand ved hjælp af -t option, som anbefales, når du profilerer alle tråde.

Derudover kan vi kontrollere alle profileringsbegivenheder, der understøttes af vores JVM ved hjælp af liste mulighed:

$ ./profiler.sh liste 66959
Grundlæggende begivenheder: CPU tildel lås væg itimer Java-metode kald: ClassName.methodName

7. async-profil Med IntelliJ IDEA

IntelliJ IDEA har integration med async-profil som et profilværktøj til Java.

7.1. Profiler konfigurationer

Vi kan konfigurere async-profil i IntelliJ IDEA ved at vælge Java Profiler menupunkt ved Indstillinger / præferencer> Byg, udførelse, implementering:

For hurtig brug kan vi også vælge enhver foruddefineret konfiguration, som CPU-profilen og den allokeringsprofil, som IntelliJ IDEA tilbyder.

På samme måde kan vi kopiere en profilskabelon og redigere Agentmuligheder til specifikke brugssager.

7.2. Profilansøgning ved hjælp af IntelliJ IDEA

Der er et par måder at analysere vores applikation med en profil.

For eksempel kan vi vælge applikationen og vælge Kør med mulighed:

Eller vi kan klikke på værktøjslinjen og vælge Kør med mulighed:

Eller ved at vælge Kør med Profiler indstilling under Løb menu, og vælg derefter <profilkonfigurationsnavn>:

Derudover kan vi se muligheden for at Vedhæft profiler til proces under Løb menu. Det åbner en dialog, der lader os vælge den proces, der skal vedhæftes:

Når vores applikation er profileret, kan vi analysere profilresultatet ved hjælp af Profiler værktøjsbjælke nederst på IDE.

Profileringsresultatet af vores ansøgning vil se ud:

Det viser trådvise resultater i forskellige outputformater som flammegrafer, opkaldstræer og metodeliste.

Alternativt kan vi vælge Profiler indstilling under Se> Windows-værktøj menu for at se resultaterne:

8. Konklusion

I denne artikel undersøgte vi async-profilsammen med et par profileringsteknikker.

For det første har vi set, hvordan vi konfigurerer kernen, når vi bruger Linux-platformen, og et par anbefalede JVM-flag, som vi kan starte med at profilere vores applikation for at opnå nøjagtige resultater.

Derefter undersøgte vi forskellige typer profileringsteknikker som CPU, allokering og vægur.

Til sidst profilerede vi en ansøgning med async-profil ved hjælp af IntelliJ IDEA.


$config[zx-auto] not found$config[zx-overlay] not found