เว็บไซต์หลัก: http://www.brendangregg.com/flamegraphs.html
ตัวอย่าง (คลิกเพื่อซูม):
คลิกกล่องเพื่อซูมกราฟเปลวไฟไปยังเฟรมสแต็กนี้เท่านั้น ในการค้นหาและไฮไลต์เฟรมสแต็กทั้งหมดที่ตรงกับนิพจน์ทั่วไปให้คลิกปุ่ม ค้นหา ที่มุมขวาบนหรือกด Ctrl-F โดยค่าเริ่มต้นการค้นหาเป็นตัวพิมพ์เล็กที่ละเอียดอ่อน แต่สิ่งนี้สามารถสลับได้โดยการกด CTRL-I หรือคลิกปุ่ม IC ที่มุมขวาบน
เว็บไซต์อื่น ๆ :
กราฟเปลวไฟสามารถสร้างได้ในสามขั้นตอน:
ตัวอย่างสแต็กสามารถจับได้โดยใช้ Linux Perf_events, FreeBSD PMCSTAT (HWPMC), DTRACE, SystemTap และโปรไฟล์อื่น ๆ อีกมากมาย ดูตัวแปลง StackCollapse-*
การใช้ linux perf_events (aka "perf") เพื่อจับตัวอย่าง 60 วินาทีจาก 99 ตัวอย่างสแต็กเฮิร์ตซ์ทั้งสแต็คระดับผู้ใช้และเคอร์เนลกระบวนการทั้งหมด:
# 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 วินาทีที่ 997 Hertz:
# 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 วินาทีรวมถึงเวลาที่ใช้ในเคิร์นเนลสำหรับ 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 เฟรม; ดู: http://dtrace.org/blogs/dap/2012/01/05/where-does -your-node-program-its-its-time/) อัตราการรวบรวมสแต็กระดับผู้ใช้ช้ากว่าเคอร์เนลโดยเจตนาซึ่งมีความสำคัญอย่างยิ่งเมื่อใช้ jstack()
เนื่องจากทำงานเพิ่มเติมเพื่อแปลเฟรม
ใช้โปรแกรม StackCollapse เพื่อพับตัวอย่างสแต็กเป็นบรรทัดเดียว โปรแกรมที่ให้คือ:
stackcollapse.pl
: สำหรับ dtrace stacksstackcollapse-perf.pl
: สำหรับเอาต์พุตสคริปต์ linux perf_events "stackcollapse-pmc.pl
: สำหรับ FreeBSD PMCSTAT -G Stacksstackcollapse-stap.pl
: สำหรับ SystemTap Stacksstackcollapse-instruments.pl
: สำหรับเครื่องมือ XCodestackcollapse-vtune.pl
: สำหรับโปรไฟล์ Intel Vtunestackcollapse-ljp.awk
: สำหรับ Java Profiler ที่มีน้ำหนักเบาstackcollapse-jstack.pl
: สำหรับ Java Jstack (1) เอาต์พุตstackcollapse-gdb.pl
: สำหรับ GDB (1) สแต็กstackcollapse-go.pl
: สำหรับ Golang pprof stacksstackcollapse-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 ใช้สีแยกต่างหากสำหรับเคอร์เนลและรหัสระดับผู้ใช้ กราฟเปลวไฟที่เกิดขึ้น: Green == Java, Yellow == C ++, Red == Native โหมดผู้ใช้, Orange == เคอร์เนล
โปรไฟล์นี้มาจากการวิเคราะห์ประสิทธิภาพ vert.x WRK ไคลเอ็นต์มาตรฐานสามารถมองเห็นได้ในกราฟเปลวไฟ
ตัวอย่างเอาต์พุตจาก DTRACE รวมอยู่ด้วยเช่นกันตัวอย่าง dtrace-stacks.txt และกราฟเปลวไฟผลลัพธ์, ตัวอย่าง dtrace.svg:
คุณสามารถสร้างสิ่งนี้โดยใช้:
$ ./stackcollapse.pl example-stacks.txt | ./flamegraph.pl > example.svg
นี่คือจากการตรวจสอบประสิทธิภาพโดยเฉพาะ: กราฟเปลวไฟระบุว่าใช้เวลา CPU ในโมดูล 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
ตามที่แนะนำในตัวอย่างกราฟเปลวไฟสามารถประมวลผลร่องรอยของเหตุการณ์ใด ๆ เช่น malloc () s การรวบรวมร่องรอยสแต็กที่ให้ไว้
หากคุณใช้ตัวเลือก --cp
มันจะใช้การเลือก $ สีและสร้างจานสีแบบสุ่มเหมือนปกติ flamegraphs ในอนาคตใด ๆ ที่สร้างขึ้นโดยใช้ตัวเลือก --cp
จะใช้แผนที่จานเดียวกัน สัญลักษณ์ใหม่ใด ๆ จาก flamegraphs ในอนาคตจะมีสีที่สร้างแบบสุ่มโดยใช้การเลือก $ สี
หากคุณไม่ชอบจานสีเพียงแค่ลบไฟล์ Palette.Map
สิ่งนี้ช่วยให้คุณสามารถเปลี่ยน colorscheme ของคุณระหว่าง FlameGraphs เพื่อให้ความแตกต่างโดดเด่นจริงๆ
ตัวอย่าง:
สมมติว่าเรามีการจับ 2 ครั้งหนึ่งที่มีปัญหาและอีกหนึ่งเมื่อมันทำงาน (อะไรก็ตามที่ "มัน" คือ):
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-working.svg
Palette-Example-broken.svg