注:本次安装如下都是基于centos6的html
uname -a ; rpm -qa kernel\* | sortnginx
kernel,kernel-devel,kernel-debuginfo,kernel-debuginfo-common(先安装kernel-debuginfo-common,在安装 kernel-debuginfo) 这些版本必定要和内核版本保持一致git
相关rpm包下载:http://rpm.pbone.net (kernel,kernel-devel), http://debuginfo.centos.org (kernel-debuginfo,kernel-debuginfo-common)对应搜索下载rpm安装,版本必定要对应,否则会报一些内核错。github
yum install systemtapcentos
测试安装是否成功:浏览器
stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'tcp
安装成功:svg
出现下面的状况,是kernel-devel不匹配致使的函数
kernel-debug 版本不匹配工具
https://github.com/openresty/openresty-systemtap-toolkit 基于SystemTap的OpenResty实时分析和诊断工具(包括nginx、luajit、ngx_Lua等)
https://github.com/openresty/stapxx 对SystemTap的简单宏语言扩展
https://github.com/brendangregg/FlameGraph.git 火焰图svg制做工具
一、openresty-systemtap-toolkit
二、stapxx(有不少与openresty-systemtap-toolkit功能类似的命令)
./samples/lj-lua-stacks.sxx --arg time=5 --skip-badvars -x 6949 > a.bt 带采集时间
能够结合 openresty-systemtap-toolkit 的 fix-lua-bt,参考ngx-sample-lua-bt的介绍
生成火焰图:stackcollapse-stap.pl a.bt > a.cbt stackcollapse-stap.pl a.bt > a.cbt flamegraph.pl --encoding="ISO-8859-1" --title="Lua-land on-CPU flamegraph" a.cbt > a.svg
cd /opt/stapxx
export PATH=$PWD:$PATH (能够加到环境变量里面)
收集内存:
./samples/sample-bt-leaks.sxx -x 12130 -v > /opt/flame_img/ngx_mem_1.bt 注:12130 进程PID
收集cpu:
./samples/lj-lua-stacks.sxx --skip-badvars -x 12130 > /opt/flame_img/ngx_cpu_1.bt
./fix-lua-bt /opt/flame_img/ngx_cpu_1.bt > /opt/flame_img/ngx_cpu_1.bt
注:里面目录是个人环境目录,能够放到任意目录,可是必须注意权限问题
可能遇到错误:
cannot find module /lib64/libc-2.12.so debuginfo: No DWARF information found [man warning::debuginfo]
解决:首先查看libc的版本 rpm -aq | grep glibc
在 http://debuginfo.centos.org/6/x86_64/ 下载对应的 glibc-debuginfo-common glibc-debuginfo,先安装glibc-debuginfo-common,在安装 glibc-debuginfo
cd ./FlameGraph
./stackcollapse-stap.pl /opt/flame_img/ngx_mem_1.bt > /opt/flame_img/ngx_mem_1.cbt
./flamegraph.pl --encoding="ISO-8859-1" --title="Lua-land memcache flamegraph" /opt/flame_img/ngx_mem_1.cbt > /opt/flame_img/ngx_mem_1.svg
需安装openresty的debuginfo,不然会报错:
sudo yum install -y openresty-debug-debuginfo
y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
x 轴表示抽样数,若是一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不表明时间,而是全部的调用栈合并后,按字母顺序排列的。
火焰图就是看顶层的哪一个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题
注:颜色没有特殊含义