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éthode | Comment |
|---|
| Télécharger | Obtenir le tarball de version pour votre plateforme |
| Extraire | tar xzf async-profiler-*.tar.gz |
| Exécuter | ./bin/asprof <pid> (plus récent) ou ./profiler.sh <pid> |
| Permissions | peut nécessiter sysctl kernel.perf_event_paranoid=1 et kernel.kptr_restrict=0 |
| Vérifier | ./bin/asprof --version |
Profilage basique
| Commande | Description |
|---|
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 |
jps | Trouver le pid JVM |
Types d’événements
| Événement | Mesure |
|---|
cpu | Temps CPU (par défaut) |
alloc | Allocations de heap par pile |
lock | Contention de verrous/moniteurs |
wall | Wall-clock incluant le temps d’attente |
itimer | Fallback 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>
| Flag | Produit |
|---|
-f out.html | Graphique de flamme interactif |
-o collapsed | Stacks repliées (pour les outils FlameGraph) |
-o tree | Arbre d’appels |
-o flat | Liste plate des méthodes chaudes |
-f out.jfr | Enregistrement JFR (ouvrir dans JMC) |
-t | Diviser 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’agent | Objectif |
|---|
start | Commencer immédiatement |
event=cpu|alloc|lock | Quoi échantillonner |
file=NAME | Chemin de sortie |
interval=10ms | Intervalle d’échantillonnage |
jfr | Émettre le format JFR |
Lire le graphique de flamme
| Caractéristique | Signification |
|---|
| Largeur | Part des échantillons (temps) — plus large est plus chaud |
| Hauteur | Profondeur de la pile, non le coût |
| Couleurs | Java (vert), natif (jaunâtre), noyau (orange) |
| Cliquer | Zoomer sur un sous-arbre |
| Rechercher | Mettre 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
| Aspect | async-profiler | JFR | VisualVM |
|---|
| Biais des points d’arrêt sûr | Évité | Réduit | Présent |
| Cadres natifs/noyau | Oui | Limité | Non |
| Surcharge | Très faible | Faible | Plus élevée |
| Profilage d’allocation | Oui | Oui | Basique |
| Meilleur pour | Points chauds JVM précis | Enregistrement continu intégré | Inspection GUI rapide |
L’équivalent JVM de perf + FlameGraph pour le code natif.
Ressources