Aller au contenu

Surveillance et profilage

Enregistrez des fichiers JFR, videz le tas, observez un processus Elide en cours avec jcmd, jps et jstat, et profilez avec perf sous Linux grâce aux options d'instrumentation.

Sur cette page

Les options d’instrumentation enregistrent ce que fait un processus Elide pendant son exécution.

QuestionCaptureAnalyser avec
Que s’est-il passé pendant l’exécution ?--jfr=run.jfrjfr du JDK
Que contient le tas ?--heap-dump=heap.hprofVisualVM
Comment le tas évolue-t-il dans le temps ?--vmstatjps, jstat
Que fait un processus en cours ?jcmd PIDJFR, vidages du tas, piles de threads
Où le code compilé passe-t-il son temps CPU ?--jitdump=DIRperf sous Linux

Listez les options avec elide help instruments. Elles s’appliquent à run ainsi qu’aux scripts, extraits et modules. Placez-les avant tout -- ou -m MODULE. Une installation du JDK 25 fournit jfr, jcmd, jps et jstat ; VisualVM lit les vidages du tas. Pour la couverture, le traçage CPU et les débogueurs, voir Débogage. Pour exporter traces, métriques et journaux vers un backend d’observabilité, voir OpenTelemetry.

Enregistrer avec JFR

elide --jfr=run.jfr run app.js
jfr summary run.jfr
jfr print --events 'dev.elide.*' run.jfr

--jfr utilise les paramètres profile et enregistre à la sortie normale. --jfr-settings=default ou un chemin .jfc choisit d’autres paramètres. Les noms de fichiers et les paramètres ne peuvent contenir ni virgules ni guillemets doubles.

ÉvénementEnregistre
dev.elide.BootDémarrage terminé ; elapsedNanos est le temps de démarrage.
dev.elide.GuestStart / dev.elide.GuestStopExécution du programme d’entrée, avec langage, durée, résultat, code de sortie.
dev.elide.HttpRequest / dev.elide.HttpResponseUne requête servie, avec méthode, protocole, statut, durée.
dev.elide.HttpClientExchangeUne requête sortante, avec temps d’attente et de connexion, protocole, statut et octets du corps.
dev.elide.TransportTlsHandshakeUne négociation TLS, avec durée, rôle, résultat et ALPN.
dev.elide.ExecutionLa commande s’est terminée, avec son code de sortie.

Les URL, en-têtes et charges utiles ne sont pas enregistrés.

Vider le tas

elide --heap-dump=heap.hprof run app.js
elide --heap-dump-on-oom=oom.hprof run app.js
visualvm --openfile heap.hprof

--heap-dump écrit à la sortie normale. --heap-dump-on-oom écrit lors d’une erreur de mémoire insuffisante, puis quitte sans exécuter les hooks d’arrêt.

Observer un processus en cours

elide --vmstat run app.js &
jps -l
jstat -gc PID 1s

--vmstat fait apparaître le processus dans jps (par PID, sans nom) et permet à jstat de l’échantillonner. jcmd s’attache par PID avec ou sans --vmstat, sous Linux et macOS, avec le même utilisateur système :

jcmd PID help
jcmd PID JFR.start name=profile settings=profile
jcmd PID JFR.dump name=profile filename=live.jfr
jcmd PID GC.heap_dump live.hprof
jcmd PID Thread.print

Un processus tué n’écrit pas ses captures. Videz un enregistrement en cours avec jcmd avant de l’arrêter.

Profiler avec perf sous Linux

perf record -k 1 --call-graph fp -o perf.data -- elide --jitdump=./jitdump run app.js
perf inject -j -i perf.data -o perf.jit.data
perf report -i perf.jit.data

--jitdump fonctionne dans les builds de release pour Linux. Conservez le répertoire jitdump jusqu’à la fin de perf inject. Les fonctions souvent exécutées apparaissent sous des objets jitted-. Un code de sortie nul ne prouve pas que la capture est valide ; vérifiez que le rapport affiche vos fonctions. Sous WSL2, perf doit correspondre au noyau en cours d’exécution.

Options de la VM

Chaque option a une écriture équivalente en option de la VM :

--jfr=run.jfr                 -XX:StartFlightRecording=filename=run.jfr,settings=profile,dumponexit=true
--heap-dump-on-oom=oom.hprof  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=oom.hprof -XX:+ExitOnOutOfMemoryError
--vmstat                      -XX:+UsePerfData
--jitdump=DIR                 -XX:+RuntimeJitdump -XX:RuntimeJitdumpDir=DIR

-XX:+DumpHeapAndExit -XX:HeapDumpPath=initial.hprof vide le tas initial, puis quitte. -Xmx et -XX:MaxHeapSize correspondent au même réglage que --max-mem ; passer les deux est une erreur.

Cette page vous a-t-elle aidé ?