Útmutató az async-profilerhez
1. Áttekintés
A Java mintavételi profilokat általában a JVM Tool Interface (JVMTI) használatával tervezik, és a verem nyomait egy biztonságos helyen gyűjtik össze. Ezért ezek a mintavételi profilozók szenvedhetnek a biztonságos pontok elfogultságának problémájától.
Az alkalmazás holisztikus megtekintéséhez szükségünk van egy mintavételi profilozóra, amely nem igényli, hogy a szálak a biztonsági pontokon legyenek, és bármikor összegyűjtheti a verem nyomait, hogy elkerülje a biztonsági pontok torzítási problémáját.
Ebben az oktatóanyagban felfedezzük async-profiler különféle profilalkotási technikákkal együtt.
2. async-profiler
async-profiler egy mintavételi profilozó minden JDK-hoz a HotSpot JVM alapján. Alacsony rezsi van, és nem támaszkodik a JVMTI-re.
A. Használatával elkerüli a biztonsági pontok elfogultságának problémáját AsyncGetCallTrace A HotSpot JVM által biztosított API a Java kódútvonalak és a Linux profiljához perf_events a natív kódútvonalak profilozásához.
Más szavakkal, a profilozó egyezik mind a Java kód, mind a natív kód elérési útjainak híváskötegével, hogy pontos eredményeket hozzon létre.
3. Beállítás
3.1. Telepítés
Először letöltjük a legújabb verziót async-profiler platformunk alapján. Jelenleg csak a Linux és a macOS platformokat támogatja.
A letöltés után ellenőrizhetjük, hogy működik-e a platformunkon:
$ ./profiler.sh --verzió
Az Async-profiler 1.7.1, 2020. május 14-én készült. Copyright 2016-2020 Andrei Pangin
Mindig jó ötlet ellenőrizni az összes elérhető lehetőséget async-profiler előzetesen:
$ ./profiler.sh
Használat: ./profiler.sh [action] [options] Műveletek: indítsa el a profilalkotást, és azonnal térjen vissza a profilalkotás folytatásához anélkül, hogy visszaállítaná az összegyűjtött adatokat, állítsa le a profilalkotás ellenőrzését, ellenőrizze, hogy a megadott profilalkotási esemény elérhető-e. a cél JVM összegyűjti a gyűjtőprofilt a megadott időtartamra, majd leállítja (alapértelmezett művelet) Opciók: -e eseményprofil-esemény: cpu | allokáció | lock | cache-hiányzik stb. to -i intervallum mintavételi intervallum nanoszekundumokban -j jstackdepth maximális Java verem mélység -b bufsize keret pufferméret -t profil különböző szálak külön -szimplán osztálynevek FQN helyett -g nyomtatási módszer aláírások -a jegyzetek Java metódusnevek -o fmt output formátum: összefoglaló | nyomok | lapos | összecsukott | svg | fa | jfr - csak a megadott mintát tartalmazó kimeneti nyomkövetéseket tartalmazom -X kizárja a verem nyomát a megadott mintával -v, --version display ve rsion karakterlánc - címsor SVG cím - szélesség px SVG szélesség - magasság px SVG keret magasság - min szélesség px hagyja el a px-nél kisebb képkockákat - fordított verem generálása fordított FlameGraph / hívásfára - az összes kernel csak magot tartalmaz módú események - minden felhasználó csak felhasználói módú eseményeket tartalmaz - cstack mód a C verem áthaladásához: fp | lbr | no a cél JVM vagy 'jps' kulcsszó numerikus folyamatazonosítója a JVM futtatásának automatikus megtalálásához
A bemutatott lehetőségek közül sok hasznos lesz a későbbi szakaszokban.
3.2. Kernel konfigurálása
Használat során async-profiler Linux platformon meg kell győződnünk arról, hogy a kernelt úgy konfiguráltuk, hogy a perf_events minden felhasználó által:
Először beállítjuk a perf_event_paranoid 1-ig, amely lehetővé teszi a profilozó számára, hogy teljesítmény-információkat gyűjtsön:
$ sudo sh -c 'echo 1> / proc / sys / kernel / perf_event_paranoid'
Ezután beállítjuk a kptr_restrict 0-ig a kernel címek kitételére vonatkozó korlátozások eltávolításához:
$ sudo sh -c 'echo 0> / proc / sys / kernel / kptr_restrict'
Azonban a async-profiler önmagában fog működni a macOS platformon.
Most, hogy a platformunk készen áll, elkészíthetjük profilkészítő alkalmazásunkat és futtathatjuk azt a Java paranccsal:
$ java -XX: + UnlockDiagnosticVMOptions -XX: + DebugNonSafepoints -jar elérési út a jar-fájlhoz
Itt, a profil használatával elindítottuk a -XX: + UnlockDiagnosticVMOptions -XX: + DebugNonSafepoints JVM jelzők, amelyek erősen ajánlottak a pontos eredmények érdekében.
Most, hogy készen állunk alkalmazásunk profilozására, vizsgáljuk meg a async-profiler.
4. CPU profilozás
Async-profiler összegyűjti a Java módszerek verem nyomait, beleértve a JVM kódot, a natív osztályt és a kernel függvényeket a CPU profilozásakor.
Profilozzuk alkalmazásunkat a PID segítségével:
$ ./profiler.sh -e cpu -d 30 -o összefoglalás 66959 Elkezdett [cpu] profilozás --- Végrehajtási profil --- Összes minta: 28 Keret pufferhasználat: 0,069%
Itt definiáltuk a processzor profilalkotás az -e választási lehetőség. Aztán használtuk a -d lehetőség a minta 30 másodpercig történő gyűjtésére.
Utolsó, a -o Az opció hasznos a kimeneti formátum meghatározásához, mint az összefoglaló, a HTML, a nyomkövetés, az SVG és a fa.
Készítsük el a HTML kimenetet, miközben a CPU profilozza az alkalmazást:
$ ./profiler.sh -e cpu -d 30 -f cpu_profile.html 66959

Itt láthatjuk, hogy a HTML kimenet lehetővé teszi számunkra a minták kibővítését, összecsukását és keresését.
Ezenkívül async-profiler támogatja a lánggráfokat dobozon kívül.
Készítsünk egy lánggráfot a .svg fájlkiterjesztés alkalmazásunk CPU profiljához:
$ ./profiler.sh -e cpu -d 30 -f cpu_profile.svg 66959

A kapott lánggráf itt zöld színnel mutatja a Java kódútvonalakat, sárga színnel a C ++, piros színnel a rendszer kódútvonalakat.
5. Allokációs profilálás
Hasonlóképpen, mintákat gyűjthetünk a memóriafoglalásból anélkül, hogy tolakodó technikát használnánk, például a bytecode műszereket.
async-profiler a TLAB (Thread Local Allocation Buffer) alapú mintavételi technikát használja a halomallokáció mintáinak összegyűjtésére a TLAB átlagos mérete felett.
A kiosztani esemény során lehetővé tehetjük a profilozó számára, hogy összegyűjtse a profilalkotás halom kiosztásait:
$ ./profiler.sh -e allokáció -d 30 -f allok_profile.svg 66255

Itt láthatjuk, hogy az objektumklónozás a memória nagy részét lefoglalta, amelyet egyébként nehéz érzékelni, ha a kódot nézzük.
6. Falióra profilozás
Is, async-profiler a falióra-profil használatával az összes szálat státuszuktól függetlenül - például futás, alvás vagy letiltás - mintavételezheti.
Ez hasznos lehet az alkalmazások indítási idejében felmerülő problémák elhárításakor.
Meghatározásával a fal esemény esetén konfigurálhatjuk a profilozót az összes szál mintájának gyűjtésére:
$ ./profiler.sh -e fal -t -d 30 -f wall_clock_profile.svg 66959

Itt a falióra profilolót szálanként használtuk a -t opció, amely nagyon ajánlott az összes szál profilozásakor.
Ezenkívül ellenőrizhetjük a JVM által támogatott összes profilalkotási eseményt a lista választási lehetőség:
$ ./profiler.sh lista 66959
Alapvető események: cpu kiosztás zárfal itimer Java módszer hívások: ClassName.methodName
7. async-profiler IntelliJ IDEA-val
Az IntelliJ IDEA integrációja a async-profiler mint profilalkotó eszköz a Java számára.
7.1. Profiler konfigurációk
Konfigurálhatjuk async-profiler az IntelliJ IDEA-ban a Java Profiler menüpont a Beállítások / Beállítások> Összeállítás, Végrehajtás, Telepítés:

A gyors használat érdekében bármelyiket választhatjuk előre definiált konfiguráció, például az IntelliJ IDEA által kínált CPU Profiler és Allocation Profiler.
Hasonlóképpen másolhatunk egy profilozó sablont és szerkeszthetjük a Ügynök opciók speciális felhasználási esetekre.
7.2. Profilalkalmazás az IntelliJ IDEA használatával
Néhány módon elemezhetjük alkalmazásunkat egy profilozóval.
Például kiválaszthatjuk az alkalmazást, és választhatunk Fuss vele választási lehetőség:

Vagy kattinthatunk az eszköztárra, és kiválaszthatjuk a Fuss vele választási lehetőség:

Vagy a Futtatás a Profilerrel opció a Fuss menüt, majd válassza a <lehetőségetprofilozó konfigurációs neve>:

Ezen felül láthatjuk a lehetőséget A Profiler csatolása a folyamathoz alatt Fuss menü. Megnyit egy párbeszédablakot, amely lehetővé teszi a csatolás folyamatának kiválasztását:

Az alkalmazásunk profilja után elemezhetjük a profilalkotási eredményt a Profiler eszközablak az IDE alján.
Az alkalmazás profilozási eredménye a következőképpen fog kinézni:

Különböző kimeneti formátumokban mutatja a szál bölcs eredményeit, például lánggráfokat, hívásfákat és metóduslistát.
Alternatív megoldásként választhatjuk a Profiler opció a Nézet> Windows eszköz menü az eredmények megtekintéséhez:

8. Következtetés
Ebben a cikkben feltártuk a async-profiler, néhány profilozási technikával együtt.
Először is láttuk, hogyan kell konfigurálni a rendszermagot a Linux platform használatakor, és néhány JVM-jelzőt ajánlott az alkalmazásunk profilozásához a pontos eredmények elérése érdekében.
Ezután különféle típusú profilozási technikákat vizsgáltunk meg, mint például a CPU, az allokáció és a falióra.
Végül egy alkalmazást profiloztunk async-profiler az IntelliJ IDEA használatával.