Aller au contenu

async-profiler - Profileur JVM à faible surcharge

async-profiler - Profileur JVM à faible surcharge

async-profiler est un profileur d’échantillonnage à faible surcharge pour la JVM. Les profileurs Java traditionnels échantillonnent uniquement aux points d’arrêt sûr, ce qui biaise les résultats vers n’importe quel code qui se trouve être près d’un point d’arrêt sûr et peut cacher le vrai chemin chaud. async-profiler utilise AsyncGetCallTrace plus les événements perf pour échantillonner n’importe où, incluant le code natif et les cadres du noyau, donnant une image bien plus honnête. Il profile le CPU, les allocations, la contention de verrous, et plus, et exporte les graphiques de flamme ou JFR.

Installation

MéthodeComment
TéléchargerObtenir le tarball de version pour votre plateforme
Extrairetar xzf async-profiler-*.tar.gz
Exécuter./bin/asprof <pid> (plus récent) ou ./profiler.sh <pid>
Permissionspeut nécessiter sysctl kernel.perf_event_paranoid=1 et kernel.kptr_restrict=0
Vérifier./bin/asprof --version

Profilage basique

CommandeDescription
asprof -d 30 -f out.html <pid>Profile 30s → graphique de flamme
asprof -e alloc -d 30 -f alloc.html <pid>Profilage d’allocation
asprof -e lock -d 30 -f lock.html <pid>Contention de verrous
asprof -e wall -d 30 -f wall.html <pid>Wall-clock (inclut l’attente)
asprof start <pid> / asprof stop -f out.html <pid>Démarrage/arrêt manuel
jpsTrouver le pid JVM

Types d’événements

ÉvénementMesure
cpuTemps CPU (par défaut)
allocAllocations de heap par pile
lockContention de verrous/moniteurs
wallWall-clock incluant le temps d’attente
itimerFallback quand perf n’est pas disponible
cache-misses, page-faultsÉvénements perf matériels/logiciels
# Où l'app passe-t-elle réellement le wall-clock time (incl. attentes IO) ?
./bin/asprof -e wall -t -d 30 -f wall.html <pid>

Formats de sortie

FlagProduit
-f out.htmlGraphique de flamme interactif
-o collapsedStacks repliées (pour les outils FlameGraph)
-o treeArbre d’appels
-o flatListe plate des méthodes chaudes
-f out.jfrEnregistrement JFR (ouvrir dans JMC)
-tDiviser par thread

Lancer avec l’agent

# Profile dès le démarrage JVM (capture le réchauffement)
java -agentpath:/path/libasyncProfiler.so=start,event=cpu,file=profile.html \
  -jar app.jar
Option d’agentObjectif
startCommencer immédiatement
event=cpu|alloc|lockQuoi échantillonner
file=NAMEChemin de sortie
interval=10msIntervalle d’échantillonnage
jfrÉmettre le format JFR

Lire le graphique de flamme

CaractéristiqueSignification
LargeurPart des échantillons (temps) — plus large est plus chaud
HauteurProfondeur de la pile, non le coût
CouleursJava (vert), natif (jaunâtre), noyau (orange)
CliquerZoomer sur un sous-arbre
RechercherMettre en évidence les cadres correspondants

Cherchez les plateaux larges — un seul cadre consommant une grande part horizontale est votre point chaud. Les cadres Java/natif/noyau mixtes sont exactement ce que les profileurs biaisés vers les points d’arrêt sûr cachent.

Workflows courants

# 1) Points chauds CPU dans un service en cours d'exécution
./bin/asprof -d 60 -f cpu.html $(jps | grep MyApp | cut -d' ' -f1)

# 2) Chasser la pression GC — qui alloue le plus ?
./bin/asprof -e alloc -d 60 -f alloc.html <pid>

# 3) Les threads semblent inactifs mais la latence est élevée → wall-clock
./bin/asprof -e wall -t -d 30 -f wall.html <pid>

# 4) Contention sur une ressource partagée
./bin/asprof -e lock -d 30 -f lock.html <pid>

async-profiler vs alternatives

Aspectasync-profilerJFRVisualVM
Biais des points d’arrêt sûrÉvitéRéduitPrésent
Cadres natifs/noyauOuiLimitéNon
SurchargeTrès faibleFaiblePlus élevée
Profilage d’allocationOuiOuiBasique
Meilleur pourPoints chauds JVM précisEnregistrement continu intégréInspection GUI rapide

L’équivalent JVM de perf + FlameGraph pour le code natif.

Ressources