Vodič za async-profiler

1. Pregled

Java Sampling Profilers obično se dizajniraju pomoću sučelja alata JVM (JVMTI) i prikupljaju tragove stoga na sigurnoj točki. Stoga ovi profilatori uzorkovanja mogu patiti od problema pristranosti sigurne točke.

Za cjelovit prikaz aplikacije, potreban nam je profil za uzorkovanje koji ne zahtijeva da niti budu na sigurnim točkama i može prikupiti tragove stoga u bilo kojem trenutku kako bi se izbjegao problem pristranosti sigurne točke.

U ovom uputstvu istražit ćemo async-profiler zajedno s raznim tehnikama profiliranja koje nudi.

2. async-profiler

async-profiler je profil za uzorkovanje za bilo koji JDK zasnovan na HotSpot JVM-u. Ima malo dodatnih troškova i ne oslanja se na JVMTI.

Izbjegava problem pristranosti sigurne točke korištenjem AsyncGetCallTrace API koji nudi HotSpot JVM za profiliranje staza Java koda i Linuxa perf_događaji za profiliranje staza izvornih kodova.

Drugim riječima, profiler podudara snopove poziva i Java koda i staze izvornog koda kako bi proizveo točne rezultate.

3. Postavljanje

3.1. Montaža

Prvo ćemo preuzeti najnovije izdanje async-profiler na temelju naše platforme. Trenutno podržava samo Linux i macOS platforme.

Nakon preuzimanja možemo provjeriti radi li na našoj platformi:

$ ./profiler.sh --verzija
Async-profiler 1.7.1 izrađen 14. svibnja 2020. Copyright 2016-2020 Andrei Pangin

Uvijek je dobra ideja provjeriti sve dostupne opcije async-profiler unaprijed:

$ ./profiler.sh
Upotreba: ./profiler.sh [akcija] [opcije] Akcije: započnite pokretanje profiliranja i vratite se odmah nastavite nastavljati profilisanje bez poništavanja prikupljenih podataka zaustaviti zaustavljanje provjere provjere je li dostupan navedeni profil profiliranja popis stanja profiliranja popis profila koji podržavaju ciljni JVM prikupiti profil sakupljanja za određeno vremensko razdoblje, a zatim zaustaviti (zadana radnja) Opcije: -e događaj profiliranja događaja: cpu | alloc | lock | predmemorija-promašaji itd. -d trajanje pokretanje profiliranje u sekundama -f naziv datoteke dump output do -i interval uzorkovanja u nanosekundama -j jstackdepth maksimalna dubina Java steka -b proširivanje veličine međuspremnika okvira -t profil različite niti zasebno -s jednostavna imena klasa umjesto FQN -g potpisi metode ispisa -a označavanje naziva Java metode -o fmt izlaz format: sažetak | tragovi | ravno | sažeto | svg | stablo | jfr -Uključujem samo izlazne tragove steka koji sadrže navedeni uzorak -X izuzeti izuzeti tragove stoga s navedenim uzorkom -v, - prikaz verzije rsion niz - niz naslova SVG naslov - širina px Širina SVG - visina px SVG visina okvira - širina px preskakanje okvira manjih od px - obrnuto generiranje obrnutog steka FlameGraph / stablo poziva - svi jezgri uključuju samo kernel - modni događaji - svi korisnici uključuju samo korisničke modne događaje --cstack način kako preći C stog: fp | lbr | no je numerički ID ciljnog JVM-a ili 'jps' ključne riječi za automatsko pronalaženje pokretanja JVM-a

Mnoge od prikazanih opcija dobro će doći u kasnijim odjeljcima.

3.2. Konfiguracija jezgre

Prilikom korištenja async-profiler na Linux platformi, trebali bismo biti sigurni da smo konfigurirali svoj kernel za hvatanje skupova poziva pomoću perf_događaji od svih korisnika:

Prvo ćemo postaviti perf_event_paranoid do 1, što će omogućiti profileru da prikuplja podatke o izvedbi:

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

Zatim ćemo postaviti kptr_restrict do 0 za uklanjanje ograničenja izlaganja adresa jezgre:

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

Međutim async-profiler radit će sam od sebe na macOS platformi.

Sada kada je naša platforma spremna, možemo napraviti našu aplikaciju za profiliranje i pokrenuti je pomoću naredbe Java:

$ java -XX: + UnlockDiagnosticVMOptions -XX: + DebugNonSafepoints -jar put-do-jar-datoteke

Ovdje, pokrenuli smo našu aplikaciju za profiliranje pomoću -XX: + OtključajDijagnostičkeVMOpcije -XX: + DebugNonSafepoints JVM zastave koje se toplo preporučuju za točne rezultate.

Sad kad smo spremni za profil naše aplikacije, istražimo razne vrste profiliranja podržane od async-profiler.

4. Profiliranje CPU-a

Async-profiler prikuplja tragove steka uzoraka Java metoda, uključujući JVM kôd, matičnu klasu i funkcije jezgre, prilikom profiliranja CPU-a.

Idemo profilirati našu aplikaciju pomoću njenog PID-a:

$ ./profiler.sh -e cpu -d 30 -o sažetak 66959 Započeto [cpu] profiliranje --- Izvršni profil --- Ukupno uzoraka: 28 Korištenje međuspremnika: 0,069%

Ovdje smo definirali procesor događaj profiliranja pomoću -e opcija. Zatim smo koristili -d mogućnost prikupljanja uzorka 30 sekundi.

Posljednji, the -o Opcija je korisna za definiranje izlaznog formata kao što su sažetak, HTML, tragovi, SVG i stablo.

Stvorimo HTML izlaz dok CPU profilira našu aplikaciju:

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

Ovdje možemo vidjeti da HTML izlaz omogućuje širenje, sažimanje i pretraživanje uzoraka.

Dodatno, async-profiler podržava plamene grafikone odmah iz kutije.

Izradimo graf plamena pomoću .svg ekstenzija datoteke za CPU profil naše aplikacije:

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

Ovdje rezultirajući plamenski grafikon prikazuje putove Java koda zelenom bojom, C ++ žutom bojom, a staze sistemskih kodova crvenom bojom.

5. Profiliranje alokacije

Slično tome, možemo prikupljati uzorke dodjele memorije bez upotrebe nametljive tehnike poput instrumentacije bajt koda.

async-profiler koristi tehniku ​​uzorkovanja zasnovanu na TLAB-u (Thread Local Allocation Buffer) za prikupljanje uzoraka raspodjele hrpe iznad prosječne veličine TLAB-a.

Korištenjem alok događaja, možemo omogućiti profileru da prikuplja raspodjelu hrpe naše aplikacije za profiliranje:

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

Ovdje možemo vidjeti da je kloniranje predmeta dodijelilo velik dio memorije, što je inače teško uočljivo kada se gleda kod.

6. Profilisanje zidnih satova

Također, async-profiler može uzorkovati sve niti bez obzira na njihov status - poput trčanja, spavanja ili blokiranja - pomoću profila zidnog sata.

To se može pokazati korisnim pri rješavanju problema u vrijeme pokretanja aplikacije.

Definiranjem zid događaja, možemo konfigurirati profiler za prikupljanje uzoraka svih niti:

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

Ovdje smo koristili profiler zidnog sata u načinu rada po niti pomoću alata -t opcija, koja se toplo preporučuje prilikom profiliranja svih niti.

Uz to, možemo provjeriti sve događaje profiliranja koje podržava naš JVM pomoću popis opcija:

$ ./profiler.sh popis 66959
Osnovni događaji: cpu alloc lock it itimer itimer Java metoda poziva: ClassName.methodName

7. async-profiler Uz IntelliJ IDEA

IntelliJ IDEA ima integraciju s async-profiler kao alat za profiliranje za Javu.

7.1. Konfiguracije profila

Možemo konfigurirati async-profiler u IntelliJ IDEA odabirom Java Profiler opcija izbornika na Postavke / Postavke> Izgradnja, izvršenje, implementacija:

Također, za brzo korištenje možemo odabrati bilo koji unaprijed definirane konfiguracije, poput CPU Profilera i Allocation Profilera koje nudi IntelliJ IDEA.

Slično tome, možemo kopirati predložak profila i urediti Opcije agenta za posebne slučajeve upotrebe.

7.2. Profilna aplikacija koja koristi IntelliJ IDEA

Postoji nekoliko načina za analizu naše aplikacije s profilom.

Na primjer, možemo odabrati aplikaciju i odabrati Trči sa opcija:

Ili možemo kliknuti na alatnu traku i odabrati Trči sa opcija:

Ili odabirom Pokrenite s Profilerom opcija pod Trčanje izbornik, a zatim odaberite <naziv konfiguracije profila>:

Uz to, možemo vidjeti i mogućnost da Pričvrstite Profiler za obradu ispod Trčanje izbornik. Otvara dijaloški okvir koji nam omogućuje odabir postupka koji ćemo priložiti:

Nakon što se naša aplikacija profilira, možemo analizirati rezultat profiliranja pomoću Profiler traka s alatima na dnu IDE-a.

Rezultat profiliranja naše aplikacije izgledat će ovako:

Prikazuje rezultate mudrih niti u različitim izlaznim formatima poput grafikona plamena, stabala poziva i popisa metoda.

Alternativno, možemo odabrati Profiler opcija pod Pogled> Alat Windows izbornik za prikaz rezultata:

8. Zaključak

U ovom smo članku istražili async-profiler, zajedno s nekoliko tehnika profiliranja.

Prvo, vidjeli smo kako konfigurirati jezgru pri korištenju Linux platforme i nekoliko preporučenih JVM zastavica za početak profiliranja naše aplikacije kako bismo dobili točne rezultate.

Zatim smo ispitali razne vrste tehnika profiliranja poput CPU-a, alokacije i zidnog sata.

Na kraju, prijavu smo profilirali async-profiler koristeći IntelliJ IDEA.


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