Sprievodca po async-profiler

1. Prehľad

Profily vzorkovania Java sa zvyčajne navrhujú pomocou rozhrania JVM Tool Interface (JVMTI) a zhromažďujú stopy zásobníka v bezpečnom bode. Preto tieto profily vzorkovania môžu trpieť problémom so zaujatosťou bodu bezpečného bodu.

Pre komplexný pohľad na aplikáciu potrebujeme profiler vzorkovania, ktorý nevyžaduje, aby boli vlákna v bodoch bezpečia, a môže kedykoľvek zhromaždiť stopy zásobníka, aby sa predišlo problémom so zaujatosťou bodu bezpečného bodu.

V tomto výučbe to preskúmame async-profiler spolu s rôznymi technikami profilovania, ktoré ponúka.

2. async-profiler

async-profiler je profiler vzorkovania pre akýkoľvek JDK založený na HotSpot JVM. Má nízku réžiu a nespolieha sa na JVMTI.

Vyhýba sa problémom so zaujatosťou k bodu bezpečného bodu použitím AsyncGetCallTrace API poskytované HotSpot JVM na profilovanie kódových ciest Java a Linux perf_events profilovať cesty natívneho kódu.

Inými slovami, profiler zodpovedá zhlukom hovorov tak kódu Java, ako aj ciest natívneho kódu, aby vytvoril presné výsledky.

3. Inštalácia

3.1. Inštalácia

Najskôr si stiahneme najnovšie vydanie servera async-profiler založené na našej platforme. V súčasnosti podporuje iba platformy Linux a macOS.

Po stiahnutí môžeme skontrolovať, či to funguje na našej platforme:

$ ./profiler.sh - verzia
Async-profiler 1.7.1 postavený 14. mája 2020 Copyright 2016-2020 Andrei Pangin

Vždy je dobré skontrolovať všetky dostupné možnosti async-profiler vopred:

$ ./profiler.sh
Použitie: ./profiler.sh [akcia] [možnosti] Akcie: spustiť spustenie profilovania a návrat okamžite pokračovať v obnovení profilovania bez vynulovania zhromaždených údajov zastaviť zastavenie profilovania skontrolovať skontrolovať, či je k dispozícii zadaná udalosť profilovania stav tlač profilovanie stavový zoznam zoznam profilovaných udalostí podporovaných programom cieľový JVM zhromažďuje zbierať profil pre zadané časové obdobie a potom sa zastaví (predvolená akcia) Možnosti: -e udalosť profilovania udalostí: CPU | alloc | zámok | cache-misses atď. -d trvanie spustenia profilovania na sekundy -f výstup výpisu súboru na -i interval vzorkovania v nanosekundách -j jstackdepth maximálna hĺbka Java stacku -b bufsize veľkosť medzipamäte rámu -t profil rôzne vlákna zvlášť -s jednoduché názvy tried namiesto FQN -g podpisy metódy tlače -a anotovať názvy metód Java -o výstup fmt formát: súhrn | stopy | ploché | zbalené | svg | strom | jfr -I zahrnúť výstup iba stopy zásobníka obsahujúci zadaný vzor -X vylúčiť vylúčiť stopy zásobníka so zadaným vzorom -v, --version zobraziť ve rsion string --title string SVG title --width px SVG width --heigh px SVG frame height --minwidth px skip frames smaller than px --reverse generate stack-reversed FlameGraph / Call tree --all-kernel only kernel- udalosti režimu - všetci používatelia zahŕňajú iba udalosti používateľského režimu - režim cstack ako prechádzať C stack: fp | lbr | no je ID číselného procesu cieľového JVM alebo kľúčové slovo „jps“ na automatické vyhľadanie bežiaceho JVM

Mnohé zo zobrazených možností budú v ďalších častiach užitočné.

3.2. Konfigurácia jadra

Pri použití async-profiler na platforme Linux by sme sa mali uistiť, že sme nakonfigurovali naše jadro na zachytávanie zásobníkov hovorov pomocou perf_events všetci používatelia:

Najskôr nastavíme perf_event_paranoid až 1, čo profilerovi umožní zhromažďovať informácie o výkonnosti:

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

Potom nastavíme kptr_restrict na 0, aby sa odstránili obmedzenia týkajúce sa vystavenia adries jadra:

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

Avšak async-profiler bude fungovať sama na platforme macOS.

Teraz, keď je naša platforma pripravená, môžeme vytvoriť našu profilovaciu aplikáciu a spustiť ju pomocou príkazu Java:

$ java -XX: + UnlockDiagnosticVMOptions -XX: + DebugNonSafepoints -jar cesta k súboru-jar

Tu, našu profilovaciu aplikáciu sme spustili pomocou -XX: + UnlockDiagnosticVMOptions -XX: + DebugNonSafepoints Príznaky JVM, ktoré sa veľmi odporúčajú na dosiahnutie presných výsledkov.

Teraz, keď sme pripravení profilovať našu aplikáciu, poďme preskúmať rôzne typy profilovania podporované async-profiler.

4. Profilovanie CPU

Async-profiler pri profilovaní procesora zhromažďuje ukážky zásobníkových stôp metód Java, vrátane kódu JVM, natívnej triedy a funkcií jadra.

Poďme profilovať našu aplikáciu pomocou jej PID:

$ ./profiler.sh -e cpu -d 30 -o súhrn 66959 Spustené profilovanie [cpu] --- profil spustenia --- celkový počet vzoriek: 28 využitie medzipamäte rámu: 0,069%

Tu sme definovali CPU profilovanie udalosti pomocou -e možnosť. Potom sme použili -d možnosť odobrať vzorku po dobu 30 sekúnd.

Posledný, the -o je užitočné definovať výstupný formát ako súhrn, HTML, stopy, SVG a strom.

Poďme vytvoriť výstup HTML, zatiaľ čo CPU bude profilovať našu aplikáciu:

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

Tu vidíme, ako nám výstup HTML umožňuje rozbaliť, zbaliť a vyhľadať vzorky.

Navyše, async-profiler podporuje plameňové grafy pripravené na použitie.

Vytvorme plameňový graf pomocou .svg prípona súboru pre profil CPU našej aplikácie:

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

Tu výsledný plameňový graf zobrazuje cesty kódu Java zelenou farbou, C ++ žltou farbou a cesty systémového kódu červenou farbou.

5. Profilovanie alokácie

Podobne môžeme zbierať vzorky alokácie pamäte bez toho, aby sme používali rušivú techniku, ako je prístrojový kód bytecode.

async-profiler používa techniku ​​vzorkovania založenú na TLAB (Thread Local Allocation Buffer) na zhromažďovanie vzoriek alokácie haldy nad priemernou veľkosťou TLAB.

Použitím alokacia udalosť, môžeme povoliť profilerovi zhromažďovať haldy pridelené našej profilovacej aplikácii:

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

Tu vidíme, že klonovaniu objektov bola pridelená veľká časť pamäte, ktorú je inak pri pohľade na kód ťažko vnímať.

6. Profilovanie nástenných hodín

Tiež async-profiler môže pomocou profilu nástenných hodín vyskúšať všetky vlákna bez ohľadu na ich stav - napríklad bežiace, spiace alebo blokované -.

To sa môže hodiť pri riešení problémov v čase spustenia aplikácie.

Definovaním stena udalosť môžeme nakonfigurovať profilovač na zhromažďovanie vzoriek všetkých vlákien:

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

Tu sme použili profilovač nástenných hodín v režime pre každé vlákno pomocou -t možnosť, ktorá sa veľmi odporúča pri profilovaní všetkých vlákien.

Ďalej môžeme skontrolovať všetky udalosti profilovania podporované našim JVM pomocou zoznam možnosť:

zoznam $ ./profiler.sh 66959
Základné udalosti: cpu alloc lock wall itimer Výzvy metódy Java: ClassName.methodName

7. async-profiler S IntelliJ IDEA

Integrácia funkcií IntelliJ IDEA s async-profiler ako profilovací nástroj pre Javu.

7.1. Konfigurácie profilov

Môžeme nakonfigurovať async-profiler v IntelliJ IDEA výberom Java Profiler možnosť ponuky na Nastavenia / Predvoľby> Zostavenie, spustenie, nasadenie:

Pre rýchle použitie si tiež môžeme zvoliť ľubovoľné preddefinovaná konfigurácia, ako napríklad CPU Profiler a Allocation Profiler, ktoré ponúka IntelliJ IDEA.

Podobne môžeme skopírovať šablónu profilovača a upraviť Možnosti agenta pre konkrétne prípady použitia.

7.2. Aplikácia profilu pomocou IntelliJ IDEA

Existuje niekoľko spôsobov, ako analyzovať našu aplikáciu pomocou profilovača.

Napríklad môžeme vybrať aplikáciu a zvoliť Beh s možnosť:

Alebo môžeme kliknúť na panel s nástrojmi a zvoliť ikonu Beh s možnosť:

Alebo výberom možnosti Bežte s Profilerom možnosť pod Bež potom vyberte ponuku <názov konfigurácie profilovača>:

Okrem toho vidíme možnosť Pripojte Profiler k procesu pod Bež Ponuka. Otvára dialógové okno, ktoré nám umožňuje zvoliť proces pripojenia:

Po profilovaní našej aplikácie môžeme analyzovať výsledok profilovania pomocou Profiler lišta okna nástroja v spodnej časti IDE.

Výsledok profilovania našej aplikácie bude vyzerať takto:

Ukazuje výsledky vlákien v rôznych výstupných formátoch, ako sú plameňové grafy, volacie stromy a zoznam metód.

Prípadne môžeme zvoliť Profiler možnosť pod Zobraziť> Okná nástrojov ponuka na zobrazenie výsledkov:

8. Záver

V tomto článku sme preskúmali async-profilerspolu s niekoľkými technikami profilovania.

Najprv sme videli, ako nakonfigurovať jadro pri použití platformy Linux, a niekoľko odporúčaných príznakov JVM, pomocou ktorých môžeme začať profilovať našu aplikáciu, aby sme dosiahli presné výsledky.

Potom sme preskúmali rôzne typy profilovacích techník, ako je CPU, alokácia a nástenné hodiny.

Napokon sme aplikáciu profilovali pomocou async-profiler pomocou IntelliJ IDEA.


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