Een gids voor async-profiler

1. Overzicht

Java-bemonsteringsprofilers worden meestal ontworpen met behulp van de JVM Tool Interface (JVMTI) en verzamelen stapelsporen op een veilig punt. Daarom kunnen deze bemonsteringsprofilers last hebben van het probleem van safepoint bias.

Voor een holistische kijk op de applicatie, we hebben een bemonsteringsprofiler nodig die geen threads nodig heeft om op safepoints te zijn en die de stack-traces op elk moment kan verzamelen om het safepoint-bias-probleem te vermijden.

In deze tutorial gaan we verkennen async-profiler samen met verschillende profileringstechnieken die het biedt.

2. async-profiler

async-profiler is een bemonsteringsprofiler voor elke JDK op basis van de HotSpot JVM. Het heeft een lage overhead en is niet afhankelijk van JVMTI.

Het vermijdt het safepoint bias-probleem door de AsyncGetCallTrace API geleverd door HotSpot JVM om de Java-codepaden en die van Linux te profileren perf_events om de native codepaden te profileren.

Met andere woorden, de profiler matcht aanroepstapels van zowel Java-code als native codepaden om nauwkeurige resultaten te produceren.

3. Installatie

3.1. Installatie

Eerst downloaden we de nieuwste release van async-profiler gebaseerd op ons platform. Momenteel ondersteunt het alleen Linux- en macOS-platforms.

Eenmaal gedownload, kunnen we controleren of het werkt op ons platform:

$ ./profiler.sh --version
Async-profiler 1.7.1 gebouwd op 14 mei 2020 Copyright 2016-2020 Andrei Pangin

Het is altijd een goed idee om alle beschikbare opties te bekijken met async-profiler vooraf:

$ ./profiler.sh
Gebruik: ./profiler.sh [actie] [opties] Acties: start profilering en keer onmiddellijk terug hervat profilering zonder opnieuw in te stellen verzamelde gegevens stop stop profilering controleer controleer of de gespecificeerde profilering beschikbaar is status print profilering statuslijst lijst profileringsgebeurtenissen ondersteund door het doel JVM verzamel verzamelprofiel voor de gespecificeerde tijdsperiode en stop dan (standaardactie) Opties: -e event profiling event: cpu | alloc | lock | cache-misses etc. -d duur profilering uitvoeren gedurende seconden -f bestandsnaam dump output naar -i interval bemonsteringsinterval in nanoseconden -j jstackdiepte maximale Java-stackdiepte -b bufsize framebuffergrootte -t ​​profiel verschillende threads afzonderlijk -s eenvoudige klassennamen in plaats van FQN -g afdrukmethode handtekeningen -a annoteer Java-methodenamen -o fmt-uitvoer format: summary | traces | flat | collapsed | svg | tree | jfr -Ik neem alleen uitvoer op stacktraces met het gespecificeerde patroon -X sluit stacktraces uit met het gespecificeerde patroon -v, --version display ve rsion string --title string SVG titel --breedte px SVG breedte --hoogte px SVG framehoogte --minwidth px frames overslaan kleiner dan px --reverse genereren stack-reversed FlameGraph / Call tree --all-kernel alleen kernel opnemen- modusgebeurtenissen --all-user bevatten alleen gebruikersmodusgebeurtenissen --cstack-modus hoe C stack te doorlopen: fp | lbr | no is een numerieke proces-ID van het doel-JVM of 'jps'-sleutelwoord om automatisch actieve JVM te vinden

Veel van de getoonde opties zullen handig zijn in de latere secties.

3.2. Kernel configuratie

Tijdens gebruik async-profiler op het Linux-platform moeten we ervoor zorgen dat we onze kernel configureren om call-stacks vast te leggen met behulp van de perf_events door alle gebruikers:

Eerst stellen we de perf_event_paranoid tot 1, waarmee de profiler prestatie-informatie kan verzamelen:

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

Vervolgens stellen we de kptr_restrict naar 0 om de beperkingen op het tonen van kerneladressen te verwijderen:

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

echter, de async-profiler werkt vanzelf op het macOS-platform.

Nu ons platform klaar is, kunnen we onze profileringstoepassing bouwen en deze uitvoeren met behulp van de Java-opdracht:

$ java -XX: + UnlockDiagnosticVMOptions -XX: + DebugNonSafepoints -jar pad-naar-jar-bestand

Hier, we zijn onze profilering-app gestart met behulp van de -XX: + UnlockDiagnosticVMOptions -XX: + DebugNonSafepoints JVM-vlaggen die sterk worden aanbevolen voor nauwkeurige resultaten.

Nu we klaar zijn om onze applicatie te profileren, gaan we verschillende soorten profilering onderzoeken die worden ondersteund door het async-profiler.

4. CPU-profilering

Async-profiler verzamelt voorbeeldstacksporen van Java-methoden, inclusief JVM-code, native class en kernelfuncties, bij het profileren van CPU.

Laten we onze applicatie profileren met behulp van zijn PID:

$ ./profiler.sh -e cpu -d 30 -o samenvatting 66959 Begonnen met [cpu] profilering --- Uitvoeringsprofiel --- Totaal aantal voorbeelden: 28 Framebuffergebruik: 0,069%

Hier hebben we de processor profileringsgebeurtenis met behulp van de -e keuze. Vervolgens hebben we de -d optie om het monster gedurende 30 seconden te verzamelen.

Laatste, de -O optie is handig om het uitvoerformaat zoals samenvatting, HTML, sporen, SVG en boomstructuur te definiëren.

Laten we de HTML-uitvoer maken terwijl de CPU onze applicatie profileert:

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

Hier kunnen we zien dat de HTML-uitvoer ons in staat stelt om de voorbeelden uit te vouwen, samen te vouwen en te doorzoeken.

Bovendien, async-profiler ondersteunt vlamgrafieken out-of-the-box.

Laten we een vlamgrafiek genereren door de .svg bestandsextensie voor het CPU-profiel van onze applicatie:

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

Hier toont de resulterende vlamgrafiek Java-codepaden in groen, C ++ in geel en systeemcodepaden in rood.

5. Toewijzingsprofilering

Evenzo kunnen we voorbeelden van geheugentoewijzing verzamelen zonder een opdringerige techniek zoals bytecode-instrumentatie te gebruiken.

async-profiler gebruikt de op TLAB (Thread Local Allocation Buffer) gebaseerde bemonsteringstechniek om de monsters te verzamelen van de heap-toewijzing boven de gemiddelde grootte van TLAB.

Door de alloc evenement, kunnen we de profiler inschakelen om heap-toewijzingen van onze profileringstoepassing te verzamelen:

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

Hier kunnen we zien dat het klonen van objecten een groot deel van het geheugen heeft toegewezen, wat anders moeilijk te zien is als we naar de code kijken.

6. Wandklokprofilering

Ook, async-profiler kan alle threads bekijken, ongeacht hun status - zoals hardlopen, slapen of geblokkeerd - door het wandklokprofiel te gebruiken.

Dit kan handig zijn bij het oplossen van problemen tijdens de opstarttijd van de applicatie.

Door de muur evenement, kunnen we de profiler configureren om voorbeelden van alle threads te verzamelen:

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

Hier hebben we de wandklok-profiler in de modus per thread gebruikt door de -t optie, die sterk wordt aanbevolen bij het profileren van alle threads.

Bovendien kunnen we alle profileringsgebeurtenissen die door onze JVM worden ondersteund, controleren met behulp van de lijst keuze:

$ ./profiler.sh lijst 66959
Basisgebeurtenissen: cpu alloc lock wall itimer Java-methode roept: ClassName.methodName

7. async-profiler Met IntelliJ IDEA

IntelliJ IDEA biedt integratie met async-profiler als profileringstool voor Java.

7.1. Profiler-configuraties

We kunnen configureren async-profiler in IntelliJ IDEA door de Java Profiler menuoptie op Instellingen / voorkeuren> Opbouw, uitvoering, implementatie:

Voor snel gebruik kunnen we er ook een kiezen vooraf gedefinieerde configuratie, zoals de CPU Profiler en de Allocation Profiler die IntelliJ IDEA biedt.

Op dezelfde manier kunnen we een profilersjabloon kopiëren en het Agent opties voor specifieke gebruikssituaties.

7.2. Profieltoepassing met IntelliJ IDEA

Er zijn een paar manieren om onze applicatie met een profiler te analyseren.

We kunnen bijvoorbeeld de applicatie selecteren en kiezen Rennen met keuze:

Of we kunnen op de werkbalk klikken en het Rennen met keuze:

Of door de Rennen met Profiler optie onder de Rennen menu en selecteer vervolgens het <profiler configuratienaam>:

Bovendien kunnen we de optie zien om Koppel Profiler aan Process onder de Rennen menu. Het opent een dialoogvenster waarin we het proces kunnen kiezen om toe te voegen:

Zodra onze applicatie is geprofileerd, kunnen we het profileringsresultaat analyseren met behulp van de Profiler werkbalk onderaan de IDE.

Het profileringsresultaat van onze applicatie ziet er als volgt uit:

Het toont de thread-wise resultaten in verschillende uitvoerformaten zoals vlamgrafieken, oproepbomen en methodelijst.

Als alternatief kunnen we de Profiler optie onder de Bekijk> Tool Windows menu om de resultaten te zien:

8. Conclusie

In dit artikel hebben we de async-profiler, samen met een paar profileringstechnieken.

Ten eerste hebben we gezien hoe de kernel moet worden geconfigureerd bij gebruik van het Linux-platform, en een paar aanbevolen JVM-vlaggen om te beginnen met het profileren van onze applicatie om nauwkeurige resultaten te verkrijgen.

Vervolgens hebben we verschillende soorten profileringstechnieken onderzocht, zoals CPU, toewijzing en wandklok.

Als laatste hebben we een applicatie geprofileerd met async-profiler met behulp van IntelliJ IDEA.