原创 孟冉 Linux阅码场 2017-11-15html
内容简介:
本文紧接着《宋宝华:火焰图:全局视野的Linux性能剖析》一文,继续分析火焰图的数据流程和绘制原理。linux
做者简介:
孟冉,目前就读于西安邮电大学,计算机科学与技术专业;目前研究linux系统的负载均衡技术和网络安全方面。孟冉目前在陈莉君老师的Linux 3+1实验室,并正在努力朝LEP(Linux Easy Profiling, http://www.linuxep.com)添加一键火焰图支持。git
火焰图是将当前系统的部分信息利用特殊图表的方式进行展现,能够将大量的数据汇聚到一张简明扼要的途中。火焰图能够直观的反映出当前系统性能占用状况,很适合应用于服务器性能的监控中。根据系统性能的指标能够将火焰图分为多种,常见的有on-cpu和off-cpu两种火焰图,下面是生成一个on-cpu火焰图的过程。
相关阅读:
宋宝华:火焰图:全局视野的Linux性能剖析github
以on-CPU火焰图为例,生成一张火焰图的大体过程以下:采集系统信息,处理信息,生成火焰图。
采集信息
采集信息有不少种方法,这里使用的是perf工具采集:vim
# perf record -F 99 –p 13204 -g -- sleep 60
-F 99表示每秒99次,-p 13204是进程号,即对哪一个进程进行分析,-g表示记录调用栈,sleep 60则是持续60秒。安全
# perf record -F 99 –a -g -- sleep 60
# perf script
查看采集到的信息,下面是其中一段。其实就是一个栈回溯:
采样到的栈回溯信息是巨量的,显然须要进行加工处理。服务器
处理信息须要工具,能够从github上下载:网络
# git clone https://github.com/brendangregg/FlameGraph
利用里面的工具处理采集到的数据:app
# cd FlameGraph # perf script | ./stackcollapse-perf.pl > out.perf
下面咱们详细解释一下perf script | ./stackcollapse-perf.pl > out.perf这个命令的含义。
如前一节所描述,当信息采集完后会获得到大量相似于前面已经显示的数据单元的数据:
有不少组数据单元是相同的,"perf script | ./stackcollapse-perf.pl > out.perf"命令中的 stackcollapse-perf.pl脚本会统计每一个调用栈回溯出现的次数,并将这一单元(以行为单位从下到上)处理为一行。上面的调用栈通过处理后获得:
swapper; x86_64_start_reservations; start_kernel; rest_init; cpu_startup_entry; arch_cpu_idle; default_idle; native_safe_halt 1
这里的1表示采样数,若是采样到多个相同的调用栈,则每次增长1。负载均衡
“perf script | ./stackcollapse-perf.pl > out.perf”生成的out.perf数据文件已经很方便阅读了,咱们能够根据须要作定制修改,好比不须要火焰图中cpu_idle的信息:
# grep -v cpu_idle out.perf>out1.perf
不须要cpu_idle的火焰图信息,则能够过滤掉。固然也能够直接用vim处理。
这里生成的火焰图是利用flamegraph.pl工具,有兴趣的能够本身作一个工具哦:
# ./flamegraph.pl out.perf > perf-kernel.svg #将产生的数据生成火焰图。
综合上面的步骤,生成火焰图须要采样,生成数据文件(out.perf),将数据文件生成svg矢量图,火焰图就作好了(这台linux没有业务运行,因此火焰图很简单)。
若是想本身作一个相似于flamegraph.pl的工具,就须要知道flamegraph.pl作了哪些事情,先来看一下out.perf的内容吧!
这个是数据文件(out.perf)的内容,这里的每一行对应火焰图的一列:
好比如今有一下数据文件:
a;b;c 1
a;b;d 2
a;e;f 1
flamegraph.pl脚本在绘制的过程以下:将一行绘制成一列,采样数越大列就越宽;在生成svg图里面,同一级的一样的函数名,合并在一块儿。全部的列按照样本数比例填满火焰图的总宽度(好比火焰总宽为1200px,在下图中A的宽度为1200px,C为300px)生成的svg火焰图以下:
若是采集的out.perf中的采样数恰好都是1,那么将out.perf中的文字缩小并旋转后就会产生下面的图片,恰好对应上面生成的火焰图。这仍是颇有意思的。
想要更深刻的了解火焰图能够去官网查看:http://www.brendangregg.com/flamegraphs.html
on-cpu资料:http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html
off-cpu资料:http://www.brendangregg.com/FlameGraphs/offcpuflamegraphs.html