什么是火焰图
⽕焰图仅⽤⼀张⼩图,就可以定量展示所有的性能瓶颈的全景图,⽽不论⽬标软件有多么复杂。
传统的性能分析⼯具通常会给⽤户展示⼤量的细节信息和数据, ⽽⽤户很难看到全貌,反⽽容易去优化那些并不重要的地⽅,经常浪费⼤量时间和精⼒却看不到明显效果。传统分析器的另⼀个缺点是,它们通常会孤⽴地显示每个函数调⽤的延时,但很难看出各个函数调⽤的上下⽂,⽽且⽤户还须刻意区分当前函数本身运⾏的时间和包括了其调⽤其他函数的时间在内的总时间。
火焰图可以分析什么
可以通过传统的工具分析函数的cpu时间,阻塞时间,还有哪些函数频繁的分配内存。
火焰图的样子
从火焰图中,我们可以看到函数的调用栈,而从左到右是函数调用所占用的次数,从图中可以看到最底层到最底层,占用的时间依次递减。
火焰图的类型及应用场景
常⻅的⽕焰图类型有 On-CPU,Off-CPU,还有 Memory,Hot/Cold,Differential 等等。它们有各⾃适合处理的场景
生成火焰图
1、下载火焰图生成源码
git clone https://gitee.com/mirrors/FlameGraph.git
2、通过工具生成对应的数据
火焰图支持多种工具
从源码就可以看出,支持的各种各样的工具
下面以perf工具为例子,如果你的系统没有,直接使用命令安装yum或者apt-get
2、CPU-ON
编写程序,使cpu尽量处于能占用100%的状态
top查看进程ID,以我的为例子
使用工具:
perf record -F 99 -p 27645 -g -- sleep 120
生成avg
perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > curl.svg
打开火焰图
3、 CPU-OFF
1、使能sched_schedstats统计
echo 1 > /proc/sys/kernel/sched_schedstats
2、使用工具生成
perf record -e sched:sched_stat_sleep -e sched:sched_switch -e sched:sched_process_exit -p 27645 -g -o perf.data.raw sleep 30
perf inject -v -s -i perf.data.raw -o perf.data
3、生成火焰图
perf script -F comm,pid,tid,cpu,time,period,event,ip,sym,dso,trace | awk '
NF > 4 { exec = $1; period_ms = int($5 / 1000000) }
NF > 1 && NF <= 4 && period_ms > 0 { print $2 }
NF < 2 && period_ms > 0 { printf "%s\n%d\n\n", exec, period_ms }' | \
./stackcollapse.pl | \
./flamegraph.pl --countname=ms --title="Off-CPU Time Flame
Graph" --colors=io > offcpu.svg