纵向表示调用栈的深度,横向表示消耗的时间。因为调用栈在横向会按照字母排序,并且同样的调用栈会做合并,所以,一个格子的宽度越大越说明其可能是瓶颈。
综上所述,主要就是看那些比较宽大的火苗,特别留意那些类似平顶山的火苗。
火焰图例子:
2.2 安装火焰图的安装比较简单,只需要把脚本从github上down下来即可,命令如下:
git clone https://github.com/brendangregg/FlameGraph
2.3 生成火焰图
生成火焰图一般需要以下几个步骤:
1)、抓取和捕获堆栈信息:使用 perf/systemtap/dtrace 等工具抓取程序的运行堆栈信息。
2)、折叠堆栈:使用FlameGraph 中的 stackcollapse 程序 把抓取的信息进行分析组合;trace 工具抓取的系统和程序运行每一时刻的堆栈信息, 需要对他们进行分析组合, 将重复的堆栈累计在一起, 从而体现出负载和关键路径
3)、生成火焰图:使用FlameGraph中的flamegraph.pl 分析 stackcollapse 输出的堆栈信息生成火焰图
stackcollapse分很多工具,用来分析不同trace工具抓取的内核信息,比如stackcollapse-stap.pl 是用来分析 SystemTap捕获的信息。
三、使用
以具体的例子来说明SystemTap和FlameGraph 是如何使用的。
3.1 sample_bt_vfs 工具
这个工具是openresty的作者春哥写的,这个工具是在虚拟文件系统(VFS)之上采样用户空间调用栈,以便渲染出文件 I/O 火焰图,这个火焰图可以准确的反映出在任意正在运行的用户进程中,文件 I/O 数据量或者文件 I/O 延迟在不同的用户空间代码路径的分布。
工具使用详细介绍:
工具包下载地址:openresty-systemtap-toolkit
方法:git clone https://github.com/openresty/openresty-systemtap-toolkit.git
工具放在openresty-systemtap-toolkit目录下
以查看nginx为例:
1)、使用SystemTap进行内核数据采集:
运行:
$ ./sample-bt-vfs -p 12345 -t 3 > a_vfs.log WARNING: Tracing 20636 (/opt/nginx/sbin/nginx)... WARNING: Time's up. Quitting now...(it may take a while) WARNING: Number of errors: 0, skipped probes: 2参数:
-p: 代表程序的PID
-t:代表要采集数据的时间
a_vfs.log: 是采集数据要保存的文件名子。
2)、分析组合采集的数据
运行:
$ ./FlameGraph/stackcollapse-stap.pl a_vfs.log > a_vfs.cbt
3)、生成火焰图
运行:
$ ./FlameGraph/flamegraph.pl ./a_vfs.cbt > a_vfs.svg
这里有一个 "文件 I/O 火焰图" 的例子:
a_vfs.svg就是生成的火焰图,使用浏览器打开,找到宽平的项,就是比较耗时的。
3.2 sample-bt 工具
这个脚本可以对你指定的 任意 用户进程进行调用栈的采样。调用栈可以是用户空间,可以是内核空间,或者是两者兼得。 它的输出是汇总后的调用栈(按照总数)。
工具详细介绍:
例如:
./openresty-systemtap-toolkit/sample-bt-vfs -p 41046 -t 50 -ku > 17_on_cpu.log
参数:
-p:代表进程ID
-t:代表采样时间 单位是秒
-u 采集用户空间调用栈信息
-k 采集内核空间调用栈信息
剩下的火焰图的生成方式同3.1。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx