OpenResty 火焰图工具

 

什么是火焰图?

火焰图和直方图、曲线图一样,是一种分析数据的方式,它可以更直观、更形象地展示数据,让人很容易发现数据中的隐藏信息。之所以叫火焰图,是因为这种图很像一簇火焰。

火焰图展现的一般是从进程(或线程)的堆栈中采集来的数据,即函数之间的调用关系。从堆栈中采集数据有很多方式,下面是几种常见的采集工具:

  • Performance Event
  • SystemTap
  • DTrace
  • OProfile
  • Gprof

数据采集到了,怎么分析它呢?为此,Brendan Gregg开发了专门把采样到的堆栈轨迹(Stack Trace)转化为直观图片显示的工具——Flame Graph,这样就很容易生成火焰图了。

可见,火线图本身其实很简单,难的是从火焰图中发现问题,并且能够解释这种现象,从而找到优化系统或者解决问题的方法。

                                                                                                                                                             -- 引自《OpenResty最佳实践》

什么时候用火焰图?

一般来说,当发现 CPU 的占用率和实际业务应该出现的占用率不相符,或者对 Nginx worker 的资源使用率(CPU,内存,磁盘 IO )出现怀疑的情况下,都可以使用火焰图进行抓取。另外,对 CPU 占用率低、吐吞量低的情况也可以使用火焰图的方式排查程序中是否有阻塞调用导致整个架构的吞吐量低下。

常用的火焰图有三种:

这三种火焰图的用法相似,输出格式一致,所以接下的章节中我们只介绍最为常用的 lj-lua-stacks.sxx。

如何安装火焰图?

注意: 因为菜菜只在Centos7上使用过,因此这里只介绍Centos7上的火焰图工具的安装。

对应内核版本的开发包和调试包

第一步:查看机器的版本号和位数

[root@localhost flame_graph]# uname -r
3.10.0-957.21.2.el7.x86_64

第二步:下载对应版本号的开发包和调试包

包名下载地址
 kernel-debuginfo-common-$(uname -r).rpmhttp://debuginfo.centos.org
kernel-debuginfo-$(uname -r).rpmhttp://debuginfo.centos.org
kernel-devel-$(uname -r).rpmhttp://rpm.pbone.net

第三步:安装对应版本号的开发包和调试包

[root@localhost flame_graph]# rpm -ivh kernel-debuginfo-common-$(uname -r).rpm
[root@localhost flame_graph]# rpm -ivh kernel-debuginfo-$(uname -r).rpm
[root@localhost flame_graph]# rpm -ivh kernel-devel-$(uname -r).rpm

第四步:安装systemtap

yum install systemtap

第五步:测试systemtap是否可用

[root@localhost flame_graph]# stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'

Pass 1: parsed user script and 103 library script(s) using 201628virt/29508res/3144shr/26860data kb, in 10usr/190sys/219real ms.
Pass 2: analyzed script: 1 probe(s), 1 function(s), 3 embed(s), 0 global(s) using 296120virt/124876res/4120shr/121352data kb, in 660usr/1020sys/1889real ms.
Pass 3: translated to C into "/tmp/stapffFP7E/stap_82c0f95e47d351a956e1587c4dd4cee1_1459_src.c" using 296120virt/125204res/4448shr/121352data kb, in 10usr/50sys/56real ms.
Pass 4: compiled C into "stap_82c0f95e47d351a956e1587c4dd4cee1_1459.ko" in 620usr/620sys/1379real ms.
Pass 5: starting run.
read performed
Pass 5: run completed in 20usr/30sys/354real ms.

如果出现如上输出表示安装成功。

第六步:下载 stapxx 工具包

地址:https://github.com/openresty/stapxx

第七步:下载转换工具

地址:https://github.com/openresty/openresty-systemtap-toolkit#fix-lua-bt

不过现在这个工具已经不再维护了,官方团队已经转到转移到一个更好的动态跟踪平台,名为开放RestyXRay。但是对我们没啥影响。

第八步:下载 Flame-Graphic 生成包

地址:https://github.com/brendangregg/FlameGraph

该工具包中包含多个火焰图生成工具,其中,stackcollapse-stap.pl 才是为 SystemTap 抓取的栈信息的生成工具。

第九布:测试

[root@localhost flame_graph]# ps -aux | grep nginx | grep -v grep
egwnode  17839  0.0  0.1 670828  4428 ?        Ss   03:54   0:00 nginx: master process openresty -p /data/egwnode/workdir -c /opt/egwnode/openresty/conf/nginx.conf
egwnode  17840  0.0  1.3 715992 51416 ?        S    03:54   0:00 nginx: worker process
egwnode  17841  0.0  1.4 718652 54928 ?        S    03:54   0:00 nginx: worker process
[root@localhost flame_graph]# ./stapxx/samples/lj-lua-stacks.sxx --arg time=5 --skip-badvars -x 15833 > tmp.bt
Found exact match for libluajit: /usr/local/openresty/luajit/lib/libluajit-5.1.so.2
WARNING: Start tracing 15833 (/usr/local/openresty/nginx/sbin/nginx)
WARNING: Please wait for 5 seconds...
WARNING: user string copy fault -14 at ffff000000000017 [man error::fault]
WARNING: Time's up. Quitting now...
WARNING: Found 1852 JITted samples.
[root@localhost flame_graph]# openresty-systemtap-toolkit-master/fix-lua-bt tmp.bt > flame.bt
[root@localhost flame_graph]# FlameGraph-master/stackcollapse-stap.pl flame.bt > flame.cbt 
[root@localhost flame_graph]# FlameGraph-master/flamegraph.pl flame.cbt > flame.svg

如果一切正常,那么会生成 flame.svg,这便是火焰图,用浏览器打开即可。

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值