Hauptwebsite: http://www.brendangregg.com/flamgraphs.html
Beispiel (Klicken Sie auf Zoom):
Klicken Sie auf ein Feld, um das Flammengraf nur in diesen Stapelrahmen zu zoomen. Klicken Sie in der oberen rechten Ecke, um alle Stapelrahmen für einen regulären Ausdruck zu suchen und hervorzuheben, oder drücken Sie die Suchschaltfläche in der oberen rechten Ecke. Standardmäßig ist die Suche von Fall sensibel, kann jedoch durch Drücken von Strg-I oder durch Klicken auf die IC -Taste in der oberen rechten Ecke umgeschaltet werden.
Andere Websites:
Flammengraphen können in drei Schritten erstellt werden:
Stapelproben können mit Linux perf_events, FreeBSD PMCStat (HWPMC), Dtrace, SystemTap und vielen anderen Profilern erfasst werden. Siehe die StackCollapse-* -Ranter.
Mit Linux perf_events (auch bekannt als "Perf"), um 60 Sekunden von 99 Hertz-Stapel-Samples, sowohl User- als auch Kernel-Ebene-Stapel, zu erfassen, alle Prozesse:
# perf record -F 99 -a -g -- sleep 60
# perf script > out.perf
Jetzt nur PID 181 erfassen:
# perf record -F 99 -p 181 -g -- sleep 60
# perf script > out.perf
Verwenden Sie DTRACE, um 60 Sekunden Kernelstapel bei 997 Hertz zu erfassen:
# dtrace -x stackframes=100 -n 'profile-997 /arg0/ { @[stack()] = count(); } tick-60s { exit(0); }' -o out.kern_stacks
Verwenden Sie DTRACE, um 60 Sekunden von Stapeln auf Benutzerebene für PID 12345 bei 97 Hertz zu erfassen:
# dtrace -x ustackframes=100 -n 'profile-97 /pid == 12345 && arg1/ { @[ustack()] = count(); } tick-60s { exit(0); }' -o out.user_stacks
60 Sekunden Stapel auf Benutzerebene, einschließlich der Zeit in Kernel, für PID 12345 bei 97 Hertz:
# dtrace -x ustackframes=100 -n 'profile-97 /pid == 12345/ { @[ustack()] = count(); } tick-60s { exit(0); }' -o out.user_stacks
Switch ustack()
für jstack()
Wenn die Anwendung über übersetzte Frames (z. -Your-Node-Program-Spend-Its-Zeit/). Die Rate für die Stapelsammlung auf Benutzerebene ist absichtlich langsamer als Kernel, was besonders wichtig ist, wenn jstack()
verwendet wird, da zusätzliche Arbeiten zur Übersetzung von Rahmen ausgeführt werden.
Verwenden Sie die StackCollapse -Programme, um Stapel -Samples in einzelne Zeilen zu falten. Die bereitgestellten Programme sind:
stackcollapse.pl
: Für Dtrace -Stapelstackcollapse-perf.pl
: Für Linux Perf_events "Perf Skript" Ausgabestackcollapse-pmc.pl
: Für FreeBSD PMCStat -g -Stapelstackcollapse-stap.pl
: Für Systemtap-Stapelstackcollapse-instruments.pl
: Für Xcode-Instrumentestackcollapse-vtune.pl
: Für Intel vtune-Profilestackcollapse-ljp.awk
: Für einen leichten Java-Profilerstackcollapse-jstack.pl
: Für Java JStack (1) Ausgabestackcollapse-gdb.pl
: Für GDB (1) Stapelstackcollapse-go.pl
: Für Golang PPROF-Stapelstackcollapse-vsprof.pl
: Für Microsoft Visual Studio-Profilestackcollapse-wcp.pl
: Für WallclockProfiler-AusgangVerwendungsbeispiel:
For perf_events:
$ ./stackcollapse-perf.pl out.perf > out.folded
For DTrace:
$ ./stackcollapse.pl out.kern_stacks > out.kern_folded
Die Ausgabe sieht so aus:
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
[...]
Verwenden Sie Flamgraph.pl, um einen SVG zu rendern.
$ ./flamegraph.pl out.kern_folded > kernel.svg
Ein Vorteil der gefalteten Eingabedatei (und warum dies von flamgraph.pl) getrennt ist, besteht darin, dass Sie Grep für interessante Funktionen verwenden können. Z.B:
$ grep cpuid out.kern_folded | ./flamegraph.pl > cpuid.svg
Eine Beispielausgabe von Linux "Perf Skript" ist enthalten, gzip'd als Beispiel-perf-stacks.txt.gz. Das resultierende Flammendiagramm ist Beispiel-perf.svg:
Sie können dies mit:
$ gunzip -c example-perf-stacks.txt.gz | ./stackcollapse-perf.pl --all | ./flamegraph.pl --color=java --hash > example-perf.svg
Dies zeigt meinen typischen Workflow: Ich werde Gzip -Profile auf dem Ziel und dann für die Analyse auf meinen Laptop kopieren. Da ich Hunderte von Profilen habe, lasse ich sie gzip'd!
Da dieses Profil Java enthielt, habe ich die Flamgraph.pl - -Color = Java -Palette verwendet. Ich habe auch StackCollapse-perf.pl verwendet-ALL, das alle Anmerkungen enthält, die Flamgraph.PL helfen, separate Farben für Kernel- und Benutzerebene zu verwenden. Das resultierende Flammengraphen verwendet: Green == Java, Yellow == C ++, Red == User-Mode Native, Orange == Kernel.
Dieses Profil stammte aus einer Analyse der Vert.x -Leistung. Der Benchmark -Client WRK ist auch in der Flammengrafik sichtbar.
Eine Beispielausgabe von DTRACE ist ebenfalls enthalten, Beispiel-Dtrace-stacks.txt und das resultierende Flammengraphen, Beispiel-Dtrace.svg:
Sie können dies mit:
$ ./stackcollapse.pl example-stacks.txt | ./flamegraph.pl > example.svg
Dies stammt aus einer bestimmten Leistungsuntersuchung: In dem Flammengraphen wurde festgestellt, dass die CPU -Zeit im LOFS -Modul verbracht wurde und diese Zeit quantifizierte.
Optionen finden Sie in der Nutzungsnachricht (-HELP):
Verwendung: ./flamgraph.pl [Optionen] 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
Wie im Beispiel vorgeschlagen, können Flammengrafs Spuren eines beliebigen Ereignisses verarbeiten, z. B. Malloc () s, sofern Stapelspuren gesammelt werden.
Wenn Sie die Option --cp
verwenden, wird die Auswahl von $ colors verwendet und die Palette nach dem Normalwert zufällig generiert. Alle zukünftigen Flamgraphs, die mit der Option --cp
erstellt wurden, werden dieselbe Palettenkarte verwenden. In jeglichen neuen Symbolen aus zukünftigen Flamgraphs werden ihre Farben mit der Auswahl von $ Colors zufällig generiert.
Wenn Sie die Palette nicht mögen, löschen Sie einfach die Datei palette.map.
Dies ermöglicht es Ihnen, Ihr ColorScheme zwischen Flamgraphs zu ändern, um die Unterschiede wirklich herauszufinden.
Beispiel:
Sagen Sie, wir haben 2 Erfassungen, eine mit einem Problem und eines, wenn es funktioniert (was auch immer "es" ist):
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.
Schauen Sie sich das Demo -Verzeichnis an, um ein Beispiel zu erhalten:
Palette-Exampe-Working.svg
palette-example-broken.svg