En guide til async-profiler

1. Oversikt

Java Sampling Profilers er vanligvis designet med JVM Tool Interface (JVMTI) og samler stakkspor på et safepoint. Derfor kan disse prøvetakingsprofilerne lide av feilpunktet for safepoint.

For et helhetlig syn på applikasjonen, vi trenger en samplingsprofil som ikke krever at tråder skal være i safepoints og som når som helst kan samle stabelsporene for å unngå safepoint bias-problemet.

I denne opplæringen vil vi utforske asynk-profil sammen med ulike profileringsteknikker den tilbyr.

2. asynk-profil

async-profil er en samplingsprofil for enhver JDK basert på HotSpot JVM. Den har lav overhead og stoler ikke på JVMTI.

Det unngår safepoint bias problemet ved å bruke AsyncGetCallTrace API levert av HotSpot JVM for å profilere Java-kodestier og Linux perf_events for å profilere de opprinnelige kodestiene.

Med andre ord matcher profilen anropsstabler av både Java-kode og innfødte kodestier for å gi nøyaktige resultater.

3. Oppsett

3.1. Installasjon

Først laster vi ned den siste utgivelsen av async-profil basert på plattformen vår. Foreløpig støtter den bare Linux- og macOS-plattformer.

Når den er lastet ned, kan vi sjekke om den fungerer på plattformen vår:

$ ./profiler.sh --versjon
Async-profiler 1.7.1 bygget 14. mai 2020 Copyright 2016-2020 Andrei Pangin

Det er alltid en god ide å sjekke alle alternativene som er tilgjengelige med async-profil på forhånd:

$ ./profiler.sh
Bruk: ./profiler.sh [handling] [opsjoner] Handlinger: start start profilering og returner umiddelbart gjenoppta CV-profilering uten å tilbakestille innsamlede data stopp stopp profilering sjekk om den angitte profileringshendelsen er tilgjengelig målet JVM samler samleprofil for den angitte tidsperioden og stopper deretter (standardhandling) Alternativer: -e hendelsesprofileringshendelse: cpu | allokering | lås | cache-savner etc. -d varighet kjører profilering i sekunder -f filnavn dump utdata til -i intervall samplingsintervall i nanosekunder -j jstackdypth maksimum Java stack dybde -b bufsize rammebufferstørrelse -t profil forskjellige tråder separat -s enkle klassenavn i stedet for FQN -g utskriftsmetodesignaturer -en kommentar Java-metodenavn -o fmt-utgang format: sammendrag | spor | flat | skjult | svg | tre | jfr -Jeg inkluderer kun utgang stakkspor som inneholder det angitte mønsteret -X ekskluder ekskluder stakkspor med det angitte mønsteret -v, --versjonsskjerm rsion streng - tittel streng SVG tittel - bredde px SVG bredde - høyde px SVG ramme høyde - min. bredde px hoppe over rammer mindre enn px - omvendt generere stack-reversert FlameGraph / Call tree - all-kernel only include kernel- modushendelser - alle brukere inkluderer bare brukermodushendelser - cstack-modus hvordan man krysser C stack: fp | lbr | nei er en numerisk prosess-ID for mål-JVM eller 'jps' nøkkelord for å finne kjørende JVM automatisk

Mange av de viste alternativene vil være nyttige i de senere avsnittene.

3.2. Kjernekonfigurasjon

Når du bruker async-profil på Linux-plattformen, bør vi sørge for å konfigurere kjernen vår til å fange samtalestabler ved hjelp av perf_events av alle brukere:

Først setter vi inn perf_event_paranoid til 1, som gjør det mulig for profilen å samle ytelsesinformasjon:

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

Så setter vi inn kptr_restrict til 0 for å fjerne begrensningene for å utsette kjerneadresser:

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

Imidlertid, den asynk-profil vil fungere av seg selv på macOS-plattformen.

Nå som plattformen vår er klar, kan vi bygge profileringsprogrammet vårt og kjøre det ved hjelp av Java-kommandoen:

$ java -XX: + UnlockDiagnosticVMOptions -XX: + DebugNonSafepoints -jar path-to-jar-file

Her, Vi har startet profileringsappen vår med -XX: + UnlockDiagnosticVMOptions -XX: + DebugNonSafepoints JVM-flagg som anbefales for nøyaktige resultater.

Nå som vi er klare til å profilere applikasjonen vår, la oss utforske ulike typer profilering støttet av async-profil.

4. CPU-profilering

Async-profil samler eksempler på spor av Java-metoder, inkludert JVM-kode, native klasse og kjernefunksjoner, ved profilering av CPU.

La oss profilere applikasjonen vår ved hjelp av PID:

$ ./profiler.sh -e cpu -d 30 -o sammendrag 66959 Startet [cpu] profilering --- Utførelsesprofil --- Totale prøver: 28 Rammebufferbruk: 0,069%

Her har vi definert prosessor profilhendelse ved å bruke -e alternativ. Så brukte vi -d muligheten til å samle prøven i 30 sekunder.

Siste, de -o alternativet er nyttig for å definere utdataformatet som sammendrag, HTML, spor, SVG og tre.

La oss lage HTML-utdata mens CPU-profilering av applikasjonen vår:

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

Her kan vi se at HTML-utdataene lar oss utvide, kollapse og søke i prøvene.

I tillegg async-profil støtter flammegrafer utenom boksen.

La oss generere en flammediagram ved å bruke .svg filtype for CPU-profilen til applikasjonen vår:

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

Her viser den resulterende flammediagrammet Java-kodebaner i grønt, C ++ i gult og systemkodebaner i rødt.

5. Tildelingsprofilering

På samme måte kan vi samle prøver av minnetildeling uten å bruke en påtrengende teknikk som bytekodeinstrumentering.

asynk-profil bruker TLAB (Thread Local Allocation Buffer) -basert prøvetakingsteknikk for å samle prøvene på dyngetildelingen over gjennomsnittsstørrelsen på TLAB.

Ved å bruke tildele hendelse, kan vi gjøre det mulig for profilen å samle inn bunktildelinger av profileringsapplikasjonen vår:

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

Her kan vi se at objektkloning har tildelt en stor del av minnet, som ellers er vanskelig å oppfatte når man ser på koden.

6. Profilering av veggklokke

Også, async-profil kan prøve alle tråder uavhengig av status - som å løpe, sove eller blokkere - ved å bruke veggklokke-profilen.

Dette kan være nyttig når du feilsøker problemer i oppstartstiden for applikasjonen.

Ved å definere vegg hendelse, kan vi konfigurere profilen til å samle eksempler på alle tråder:

$ ./profiler.sh -e vegg -t -d 30 -f wall_clock_profile.svg 66959

Her har vi brukt veggklokke-profilen i per-tråd-modus ved å bruke -t alternativ, som anbefales på det sterkeste når du profilerer alle tråder.

I tillegg kan vi sjekke alle profilhendelser som støttes av vår JVM ved å bruke liste alternativ:

$ ./profiler.sh liste 66959
Grunnleggende hendelser: cpu alloc lock wall itimer Java method calls: ClassName.methodName

7. asynk-profil Med IntelliJ IDEA

IntelliJ IDEA har integrasjon med async-profil som et profileringsverktøy for Java.

7.1. Profiler konfigurasjoner

Vi kan konfigurere async-profil i IntelliJ IDEA ved å velge Java Profiler menyvalg på Innstillinger / preferanser> Bygg, gjennomføring, distribusjon:

For rask bruk kan vi også velge hvilken som helst forhåndsdefinert konfigurasjon, som CPU Profiler og Allocation Profiler som IntelliJ IDEA tilbyr.

På samme måte kan vi kopiere en profilermal og redigere Agentalternativer for spesifikke brukssaker.

7.2. Profilapplikasjon ved bruk av IntelliJ IDEA

Det er noen måter å analysere applikasjonen vår med en profil.

For eksempel kan vi velge applikasjonen og velge Løp med alternativ:

Eller vi kan klikke på verktøylinjen og velge Løp med alternativ:

Eller ved å velge Kjør med Profiler alternativet under Løpe menyen, og velg deretter <profilens konfigurasjonsnavn>:

I tillegg kan vi se muligheten til Fest profiler til prosess under Løpe Meny. Det åpner en dialog som lar oss velge prosessen vi vil legge ved:

Når applikasjonen vår er profilert, kan vi analysere profileringsresultatet ved hjelp av Profiler verktøylinjelinje nederst på IDE.

Profileringsresultatet av søknaden vår vil se ut:

Den viser trådvise resultater i forskjellige utdataformater som flammediagrammer, ringetrær og metodeliste.

Alternativt kan vi velge Profiler alternativet under Vis> Verktøy Windows menyen for å se resultatene:

8. Konklusjon

I denne artikkelen undersøkte vi asynk-profil, sammen med noen få profileringsteknikker.

Først har vi sett hvordan vi skal konfigurere kjernen når du bruker Linux-plattformen, og noen få anbefalte JVM-flagg for å begynne å profilere applikasjonen vår for å oppnå nøyaktige resultater.

Deretter undersøkte vi forskjellige typer profileringsteknikker som CPU, tildeling og veggklokke.

Sist, vi profilerte en søknad med async-profil ved hjelp av IntelliJ IDEA.


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