Site Web principal: http://www.brendangregg.com/flamegraphs.html
Exemple (cliquez pour zoomer):
Cliquez sur une case pour zoomer le graphique de flamme à ce cadre de pile uniquement. Pour rechercher et mettre en surbrillance toutes les cadres de pile correspondant à une expression régulière, cliquez sur le bouton de recherche dans le coin supérieur droit ou appuyez sur Ctrl-F. Par défaut, la recherche est sensible à la casse, mais cela peut être basculé en appuyant sur Ctrl-I ou en cliquant sur le bouton IC dans le coin supérieur droit.
Autres sites:
Les graphiques de flamme peuvent être créés en trois étapes:
Les échantillons de pile peuvent être capturés à l'aide de Linux perf_events, FreeBSD PMCSTAT (HWPMC), DTRACE, SystemTap et de nombreux autres profilers. Voir les convertisseurs StackCollapse- *.
Utilisation de Linux perf_events (aka "perf") pour capturer 60 secondes d'échantillons de pile Hertz, à la fois des piles de niveau utilisateur et du noyau, tous les processus:
# perf record -F 99 -a -g -- sleep 60
# perf script > out.perf
Maintenant, capturant seulement PID 181:
# perf record -F 99 -p 181 -g -- sleep 60
# perf script > out.perf
Utilisation de DTrace pour capturer 60 secondes de piles de noyau au 997 Hertz:
# dtrace -x stackframes=100 -n 'profile-997 /arg0/ { @[stack()] = count(); } tick-60s { exit(0); }' -o out.kern_stacks
Utilisation de DTrace pour capturer 60 secondes de piles de niveau utilisateur pour PID 12345 à 97 Hertz:
# dtrace -x ustackframes=100 -n 'profile-97 /pid == 12345 && arg1/ { @[ustack()] = count(); } tick-60s { exit(0); }' -o out.user_stacks
60 secondes de piles au niveau de l'utilisateur, y compris le temps passé dans le navire, pour PID 12345 au 97 Hertz:
# dtrace -x ustackframes=100 -n 'profile-97 /pid == 12345/ { @[ustack()] = count(); } tick-60s { exit(0); }' -o out.user_stacks
Switch ustack()
pour jstack()
Si l'application a une aide UStack pour inclure les cadres traduits (par exemple, les cadres Node.js; -pour-node-programme dépenser-its time /). Le taux de collecte de pile au niveau de l'utilisateur est délibérément plus lent que le noyau, ce qui est particulièrement important lors de l'utilisation jstack()
car il effectue un travail supplémentaire pour traduire les cadres.
Utilisez les programmes StackCollapse pour plier les échantillons de pile en lignes uniques. Les programmes fournis sont:
stackcollapse.pl
: pour les piles dtracestackcollapse-perf.pl
: pour la sortie Linux perf_events "Script"stackcollapse-pmc.pl
: pour les piles FreeBSD PMCSTAT -Gstackcollapse-stap.pl
: pour les piles SystemTapstackcollapse-instruments.pl
: pour les instruments Xcodestackcollapse-vtune.pl
: pour les profils Intel vtunestackcollapse-ljp.awk
: Pour le profileur Java légerstackcollapse-jstack.pl
: pour Java JStack (1)stackcollapse-gdb.pl
: pour gdb (1) pilesstackcollapse-go.pl
: pour les piles Golang PPROFstackcollapse-vsprof.pl
: pour les profils Microsoft Visual Studiostackcollapse-wcp.pl
: pour la sortie de wallclockprofilerExemple d'utilisation:
For perf_events:
$ ./stackcollapse-perf.pl out.perf > out.folded
For DTrace:
$ ./stackcollapse.pl out.kern_stacks > out.kern_folded
La sortie ressemble à ceci:
unix`_sys_sysenter_post_swapgs 1401
unix`_sys_sysenter_post_swapgs;genunix`close 5
unix`_sys_sysenter_post_swapgs;genunix`close;genunix`closeandsetf 85
unix`_sys_sysenter_post_swapgs;genunix`close;genunix`closeandsetf;c2audit`audit_closef 26
unix`_sys_sysenter_post_swapgs;genunix`close;genunix`closeandsetf;c2audit`audit_setf 5
unix`_sys_sysenter_post_swapgs;genunix`close;genunix`closeandsetf;genunix`audit_getstate 6
unix`_sys_sysenter_post_swapgs;genunix`close;genunix`closeandsetf;genunix`audit_unfalloc 2
unix`_sys_sysenter_post_swapgs;genunix`close;genunix`closeandsetf;genunix`closef 48
[...]
Utilisez flamegraph.pl pour rendre un SVG.
$ ./flamegraph.pl out.kern_folded > kernel.svg
Un avantage d'avoir le fichier d'entrée plié (et pourquoi cela est séparé de flamegraph.pl) est que vous pouvez utiliser Grep pour les fonctions d'intérêt. Par exemple:
$ grep cpuid out.kern_folded | ./flamegraph.pl > cpuid.svg
Un exemple de sortie de Linux "Script perf" est inclus, gzip'd, comme exemple-perf-stacks.txt.gz. Le graphique de flamme résultant est l'exemple-perf.svg:
Vous pouvez créer ceci en utilisant:
$ gunzip -c example-perf-stacks.txt.gz | ./stackcollapse-perf.pl --all | ./flamegraph.pl --color=java --hash > example-perf.svg
Cela montre mon flux de travail typique: je vais les profils GZIP sur la cible, puis les copier sur mon ordinateur portable pour analyse. Depuis que j'ai des centaines de profils, je les laisse gzip'd!
Étant donné que ce profil incluait Java, j'ai utilisé la palette FlameGraph.pl --Color = Java. J'ai également utilisé StackCollapse-Perf.pl - All, qui inclut toutes les annotations qui aident FlameGraph.pl Utiliser des couleurs séparées pour le noyau et le code de niveau utilisateur. Le graphique de flamme résultant utilise: vert == java, jaune == C ++, rouge == mode utilisateur natif, orange == noyau.
Ce profil provenait d'une analyse des performances vert.x. Le client de référence, WRK, est également visible dans le graphique de flamme.
Un exemple de sortie de DTrace est également inclus, Exemple-Dtrace-Stacks.txt, et le graphique de flamme résultant, Exemple-Dtrace.svg:
Vous pouvez générer ceci en utilisant:
$ ./stackcollapse.pl example-stacks.txt | ./flamegraph.pl > example.svg
Cela provenait d'une enquête sur les performances particulière: le graphique de flamme a identifié que le temps de processeur était passé dans le module LOFS et a quantifié ce temps.
Voir le message d'utilisation (- help) pour les options:
Utilisation: ./flamegraph.pl [Options] Infile> outfile.svg
--title TEXT # change title text
--subtitle TEXT # second level title (optional)
--width NUM # width of image (default 1200)
--height NUM # height of each frame (default 16)
--minwidth NUM # omit smaller functions. In pixels or use "%" for
# percentage of time (default 0.1 pixels)
--fonttype FONT # font type (default "Verdana")
--fontsize NUM # font size (default 12)
--countname TEXT # count type label (default "samples")
--nametype TEXT # name type label (default "Function:")
--colors PALETTE # set color palette. choices are: hot (default), mem,
# io, wakeup, chain, java, js, perl, red, green, blue,
# aqua, yellow, purple, orange
--bgcolors COLOR # set background colors. gradient choices are yellow
# (default), blue, green, grey; flat colors use "#rrggbb"
--hash # colors are keyed by function name hash
--cp # use consistent palette (palette.map)
--reverse # generate stack-reversed flame graph
--inverted # icicle graph
--flamechart # produce a flame chart (sort by time, do not merge stacks)
--negate # switch differential hues (blue<->red)
--notes TEXT # add notes comment in SVG (for debugging)
--help # this message
eg,
./flamegraph.pl --title="Flame Graph: malloc()" trace.txt > graph.svg
Comme suggéré dans l'exemple, les graphiques de flamme peuvent traiter les traces de tout événement, tels que malloc (), à condition que des traces de pile soient rassemblées.
Si vous utilisez l'option --cp
, il utilisera la sélection des couleurs $ et générera de manière aléatoire la palette comme normale. Toute flamme future créée à l'aide de l'option --cp
utilisera la même carte de palette. Tous les nouveaux symboles de Future FlameGraphs auront leurs couleurs générées au hasard en utilisant la sélection des couleurs $.
Si vous n'aimez pas la palette, supprimez simplement le fichier palette.map.
Cela vous permet de modifier vos coloriages entre les flammes pour que les différences se démarquent vraiment.
Exemple:
Disons que nous avons 2 captures, une avec un problème, et une quand cela fonctionnait (quelle que soit "c'est"):
cat working.folded | ./flamegraph.pl --cp > working.svg
# this generates a palette.map, as per the normal random generated look.
cat broken.folded | ./flamegraph.pl --cp --colors mem > broken.svg
# this svg will use the same palette.map for the same events, but a very
# different colorscheme for any new events.
Jetez un œil au répertoire de démonstration pour un exemple:
palette-exemple-travail.svg
palette-échantillon abrégé.svg