Ú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.