注:本次安裝如下都是基於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),就表示該函數可能存在性能問題
注:顏色沒有特殊含義