الموقع الرئيسي: http://www.brendangregg.com/flamegraphs.html
مثال (انقر للتكبير):
انقر فوق مربع لتكبير الرسم البياني للهب إلى إطار المكدس هذا فقط. للبحث والتمييز على جميع إطارات المكدس التي تتطابق مع تعبير منتظم ، انقر فوق زر البحث في الزاوية اليمنى العلوية أو اضغط على Ctrl-F. افتراضيًا ، يكون البحث حساسًا للحالة ، ولكن يمكن تبديل ذلك عن طريق الضغط على CTRL-I أو بالنقر فوق زر IC في الزاوية اليمنى العليا.
مواقع أخرى:
يمكن إنشاء الرسوم البيانية لهب في ثلاث خطوات:
يمكن التقاط عينات المكدس باستخدام Linux perf_events و FreeBSD PMCSTAT (HWPMC) و DTRACE و SYSTEMTAP والعديد من المستفيدين الآخرين. انظر محولات StackCollapse-*.
باستخدام Linux perf_events (المعروف أيضًا باسم "perf") لالتقاط 60 ثانية من 99 عينة من مكدس Hertz ، كل من كدسات مستوى المستخدم والنواة ، جميع العمليات:
# perf record -F 99 -a -g -- sleep 60
# perf script > out.perf
الآن فقط التقاط PID 181:
# perf record -F 99 -p 181 -g -- sleep 60
# perf script > out.perf
باستخدام dtrace لالتقاط 60 ثانية من مداخن kernel في 997 هيرتز:
# dtrace -x stackframes=100 -n 'profile-997 /arg0/ { @[stack()] = count(); } tick-60s { exit(0); }' -o out.kern_stacks
باستخدام Dtrace لالتقاط 60 ثانية من مداخن مستوى المستخدم لـ 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 ثانية من مداخن على مستوى المستخدم ، بما في ذلك الوقت الذي يقضيه في kernel ، لـ PID 12345 في 97 Hertz:
# dtrace -x ustackframes=100 -n 'profile-97 /pid == 12345/ { @[ustack()] = count(); } tick-60s { exit(0); }' -o out.user_stacks
Switch ustack() لـ jstack() إذا كان التطبيق يحتوي على مساعد Ustack لتضمين إطارات مترجمة (على سبيل المثال ، Node.js إطارات -الرماية الخاصة بك-برنامج-spend-its-time/). يكون معدل مجموعة المكدس على مستوى المستخدم أبطأ عن عمد من kernel ، وهو أمر مهم بشكل خاص عند استخدام jstack() لأنه يؤدي أعمالًا إضافية لترجمة الإطارات.
استخدم برامج StackCollapse لوضع عينات المكدس في خطوط واحدة. البرامج المقدمة هي:
stackcollapse.pl : للحصول على مكدس dtracestackcollapse-perf.pl : من أجل Linux Perf_events "Perf Script"stackcollapse-pmc.pl : for Freebsd PMCSTAT -G MOTSSstackcollapse-stap.pl : بالنسبة إلى مداخن SystemTapstackcollapse-instruments.pl : لأدوات Xcodestackcollapse-vtune.pl : لملفات Intel Vtunestackcollapse-ljp.awk : من أجل جافا خفيفة الوزنstackcollapse-jstack.pl : لـ Java Jstack (1) الإخراجstackcollapse-gdb.pl : لـ GDB (1) أكوامstackcollapse-go.pl : بالنسبة إلى مداخن Golang pprofstackcollapse-vsprof.pl : لملفات تعريف Microsoft Visual Studiostackcollapse-wcp.pl : لإخراج Wallclockprofilerمثال الاستخدام:
For perf_events:
$ ./stackcollapse-perf.pl out.perf > out.folded
For DTrace:
$ ./stackcollapse.pl out.kern_stacks > out.kern_folded
يبدو الناتج مثل هذا:
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
[...]
استخدم flamegraph.pl لتقديم SVG.
$ ./flamegraph.pl out.kern_folded > kernel.svg
ميزة وجود ملف إدخال مطوي (ولماذا يكون ذلك منفصلًا إلى FlameGraph.pl) هو أنه يمكنك استخدام GREP لوظائف الاهتمام. على سبيل المثال:
$ grep cpuid out.kern_folded | ./flamegraph.pl > cpuid.svg
يتم تضمين مثال على الإخراج من Linux "Perf Script" ، gzip'd ، كمثال perf-stacks.txt.gz. الرسم البياني الناتج الناتج هو مثال perf.svg:
يمكنك إنشاء هذا باستخدام:
$ gunzip -c example-perf-stacks.txt.gz | ./stackcollapse-perf.pl --all | ./flamegraph.pl --color=java --hash > example-perf.svg
هذا يوضح سير العمل النموذجي الخاص بي: سأقوم بملفات تعريف GZIP على الهدف ، ثم نسخها إلى جهاز الكمبيوتر المحمول الخاص بي للتحليل. بما أن لدي المئات من الملفات الشخصية ، أتركها gzip'd!
منذ أن تضمن هذا الملف الشخصي Java ، استخدمت flamegraph.pl -color = Java Palette. لقد استخدمت أيضًا StackCollapse-perf.pl-والتي تتضمن جميع التعليقات التوضيحية التي تساعد FlameGraph.PL على استخدام ألوان منفصلة للرمز على مستوى المستخدم. يستخدم الرسم البياني الناتج الناتج: الأخضر == java ، الأصفر == c ++ ، أحمر == وضع المستخدم الأصلي ، البرتقالي == kernel.
كان هذا الملف الشخصي من تحليل أداء Vert.x. العميل القياسي ، WRK ، مرئي أيضًا في الرسم البياني للهب.
يتم أيضًا تضمين إخراج مثال من dtrace ، مثال على ذلك-stacks.txt ، والرسم البياني الناتج عن اللهب ، مثال على ذلك. svg:
يمكنك إنشاء هذا باستخدام:
$ ./stackcollapse.pl example-stacks.txt | ./flamegraph.pl > example.svg
كان هذا من تحقيق معين في الأداء: حدد الرسم البياني للهب أن وقت وحدة المعالجة المركزية قد تم إنفاقه في وحدة LOFS ، وحددت ذلك الوقت.
راجع رسالة الاستخدام (-help) للحصول على الخيارات:
الاستخدام: ./flamegraph.pl [خيارات] 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
كما هو مقترح في المثال ، يمكن لرسوم الرسوم البيانية Flame معالجة آثار أي حدث ، مثل Malloc () ، شريطة أن يتم جمع آثار المكدس.
إذا كنت تستخدم خيار --cp ، فسيستخدم اختيار ألوان $ وإنشاء اللوحة بشكل عشوائي مثل Normal. سيستخدم أي FlameGraphs المستقبلية التي تم إنشاؤها باستخدام خيار --cp خريطة اللوحة نفسها. أي رموز جديدة من FlameGraphs المستقبلية سوف يتم إنشاء ألوانها بشكل عشوائي باستخدام اختيار ألوان $.
إذا كنت لا تحب اللوحة ، فما عليك سوى حذف ملف palette.map.
هذا يسمح لك بتغيير ColorCheme بين FlameGraphs لجعل الاختلافات تبرز حقًا.
مثال:
لنفترض أن لدينا اثنين من التقاطات ، واحدة مع مشكلة ، وواحدة عندما كانت تعمل (أيا كان "هو"):
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.
ألقِ نظرة على الدليل التجريبي للحصول على مثال:
Palette-example work.svg
مثال على سبيل المثال broken.svg