Sitio web principal: http://www.brendangreggg.com/flamegraphs.html
Ejemplo (haga clic para zoom):
Haga clic en un cuadro para acercar el gráfico de la llama a este marco de pila solamente. Para buscar y resaltar todos los marcos de pila que coincidan con una expresión regular, haga clic en el botón de búsqueda en la esquina superior derecha o presione CTRL-F. Por defecto, la búsqueda es sensible a la caja, pero esto se puede alternar presionando CTRL-I o haciendo clic en el botón IC en la esquina superior derecha.
Otros sitios:
Los gráficos de llama se pueden crear en tres pasos:
Las muestras de pila se pueden capturar con Linux Perf_events, FreeBSD PMCSTAT (HWPMC), DTRACE, SystemTAP y muchos otros perfiladores. Vea los convertidores StackCollapse-*.
Uso de Linux Perf_events (también conocido como "Perf") para capturar 60 segundos de 99 muestras de pila Hertz, pilas de nivel de usuario y núcleo, todos los procesos:
# perf record -F 99 -a -g -- sleep 60
# perf script > out.perf
Ahora solo captura el PID 181:
# perf record -F 99 -p 181 -g -- sleep 60
# perf script > out.perf
Usando DTRACE para capturar 60 segundos de pilas de núcleo en 997 Hertz:
# dtrace -x stackframes=100 -n 'profile-997 /arg0/ { @[stack()] = count(); } tick-60s { exit(0); }' -o out.kern_stacks
Uso de DTRace para capturar 60 segundos de pilas a nivel de usuario para PID 12345 en 97 Hertz:
# dtrace -x ustackframes=100 -n 'profile-97 /pid == 12345 && arg1/ { @[ustack()] = count(); } tick-60s { exit(0); }' -o out.user_stacks
60 segundos de pilas a nivel de usuario, incluido el tiempo dedicado al tiempo, para el PID 12345 en 97 Hertz:
# dtrace -x ustackframes=100 -n 'profile-97 /pid == 12345/ { @[ustack()] = count(); } tick-60s { exit(0); }' -o out.user_stacks
Switch ustack()
para jstack()
si la aplicación tiene un ayudante de Ustack para incluir marcos traducidos (por ejemplo, node.js marcos; ver: http://dtrace.org/blogs/dap/2012/01/05/where-does -Wour-Node-Program-gass-its-Time/). La tarifa para la colección de pila a nivel de usuario es deliberadamente más lenta que el kernel, que es especialmente importante cuando se usa jstack()
ya que realiza trabajo adicional para traducir marcos.
Use los programas StackCollapse para doblar las muestras de pila en líneas únicas. Los programas proporcionados son:
stackcollapse.pl
: para pilas dtracestackcollapse-perf.pl
: para la salida de "Script de perf Script" de Linuxstackcollapse-pmc.pl
: para freeBSD PMCSTAT -G PISTAstackcollapse-stap.pl
: para pilas SystemTapstackcollapse-instruments.pl
: para Xcode Instrumentsstackcollapse-vtune.pl
: para perfiles Intel Vtunestackcollapse-ljp.awk
: para el perfilador de Java Ligerostackcollapse-jstack.pl
: para la salida de Java Jstack (1)stackcollapse-gdb.pl
: para pilas GDB (1)stackcollapse-go.pl
: para las pilas de Golang Pprofstackcollapse-vsprof.pl
: para los perfiles de Microsoft Visual Studiostackcollapse-wcp.pl
: para la salida de WallClockProfilerEjemplo de uso:
For perf_events:
$ ./stackcollapse-perf.pl out.perf > out.folded
For DTrace:
$ ./stackcollapse.pl out.kern_stacks > out.kern_folded
La salida se ve así:
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
[...]
Use FlameGraph.pl para renderizar un SVG.
$ ./flamegraph.pl out.kern_folded > kernel.svg
Una ventaja de tener el archivo de entrada plegado (y por qué esto está separado para FlameGraph.pl) es que puede usar GREP para funciones de interés. P.ej:
$ grep cpuid out.kern_folded | ./flamegraph.pl > cpuid.svg
Se incluye una salida de ejemplo del "Script" PERF de Linux, GZIP'd, como Ejemplo-Perf-stacks.txt.gz. El gráfico de llama resultante es el ejemplo-perf.svg:
Puedes crear esto usando:
$ gunzip -c example-perf-stacks.txt.gz | ./stackcollapse-perf.pl --all | ./flamegraph.pl --color=java --hash > example-perf.svg
Esto muestra mi flujo de trabajo típico: seré perfiles de GZIP en el objetivo, luego los copiaré a mi computadora portátil para su análisis. ¡Desde que tengo cientos de perfiles, los dejo gzip'd!
Como este perfil incluía Java, utilicé el FlameGraph.pl -Color = Java Palette. También he usado StackCollapse-Perf.Pl, que incluye todas las anotaciones que ayudan a FlameGraph.PL a usar colores separados para el núcleo y el código de nivel de usuario. El gráfico de la llama resultante usa: verde == Java, amarillo == C ++, rojo == Modo de usuario nativo, naranja == kernel.
Este perfil fue de un análisis del rendimiento vert.x. El cliente de referencia, WRK, también es visible en el gráfico de llamas.
También se incluye una salida de ejemplo de DTRACE, Ejemplo-Dtrace Stacks.txt, y el gráfico de llama resultante, Ejemplo-DTRACE.SVG:
Puedes generar esto usando:
$ ./stackcollapse.pl example-stacks.txt | ./flamegraph.pl > example.svg
Esto fue de una investigación de rendimiento particular: el gráfico de llama identificó que el tiempo de CPU se dedicó al módulo LOFS y cuantificó ese tiempo.
Consulte el mensaje de uso (--help) para obtener opciones:
Uso: ./flamegraph.pl [opciones] 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
Como se sugiere en el ejemplo, los gráficos de llama pueden procesar trazas de cualquier evento, como Malloc () S, siempre que se recopilen trazas de pila.
Si usa la opción --cp
, usará la selección de $ Colors y generará aleatoriamente la paleta como lo normal. Cualquier futuro FlameGraphs creado usando la opción --cp
utilizará el mismo mapa de paleta. Cualquier símbolo nuevo de Future FlameGraphs tendrá sus colores generados aleatoriamente utilizando la selección de $ Colors.
Si no le gusta la paleta, simplemente elimine el archivo palette.map.
Esto le permite cambiar su ColorScheme entre FlameGraphs para que las diferencias realmente se destaquen.
Ejemplo:
Digamos que tenemos 2 capturas, una con un problema y otra cuando estaba funcionando (lo que sea "que sea"):
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.
Eche un vistazo al directorio de demostración para obtener un ejemplo:
Paleta-Ejemplo de trabajo.svg
paleta-exame-boken.svg