我的系統是CentOs 6.4,內核是2.6.32-358.el6.x86_64,以下的安裝包需要是對應內核版本的。
1.檢查內核是否提供utrace/uprobes用戶態支持
打開/boot/config-2.6.32-358.el6.x86_64文件(內核版本不同,文件名不同),檢查CONFIG_UTRACE宏是否設置。如果沒有,就不能使用SystemTap
cat /boot/config-2.6.32-358.el6.x86_64 | grep '_UTRACE'
2.安裝內核調試所需要的包
下載
wget http://debuginfo.centos.org/6/x86_64/kernel-debuginfo-2.6.32-358.el6.x86_64.rpm
wget http://debuginfo.centos.org/6/x86_64/kernel-debuginfo-common-x86_64-2.6.32-358.el6.x86_64.rpm
安裝
rpm -ivh kernel-devel-2.6.32-358.el6.x86_64.rpm
rpm -ivh kernel-debuginfo-common-x86_64-2.6.32-358.el6.x86_64.rpm
rpm -ivh kernel-debuginfo-2.6.32-358.el6.x86_64.rpm
3.安裝SystemTap並配置腳本
yum -y install systemtap
驗證SystemTap是否安裝成功?
stap -ve 'probe begin{log("hello SystemTap!")exit()}'
我目前安裝的版本號是
配置的腳本flame.stp內容如下
global s;
global quit = 0;
probe timer.profile {
if (pid() == target()) {
if (quit) {
foreach ([sys,usr] in s- limit 1000) {
print_stack(sys)
print_ustack(usr);
printf("\t%d\n", @count(s[sys, usr]));
}
exit()
} else {
s[backtrace(), ubacktrace()] <<< 1;
}
}
}
probe timer.s(20) {
quit = 1
}
4.監視運行中的ats並採樣,輸出svg圖
stap --ldd -d /usr/bin/traffic_server --all-modules -D MAXMAPENTRIES=2560 -D MAXACTION=20000 -D MAXTRACE=100 -D MAXSTRINGLEN=4096 -D MAXBACKTRACE=100 -x $(pidof traffic_server) flame.stp --vp 0001 > ats.out
這裏ats必須是debug版本的,各重要參數說明一下:
-d 表示要查看的對象,比如這裏必須要填traffic_server
--ldd 表示加載所有需要的動態庫名
--all-modules 加載內核所有需要用到所有動態庫名
-D NM=VAL emit macro definition into generated C code
注意這些宏參數根據各自環境自行配置和摸索得到合適的值,可以進一步參考SystemTap的官方資料和文檔,我這裏暫沒有好的結果。
各種資源的使用限制由所生成的C代碼中的宏來設置。這些值可在編譯時由-D選項來重寫。下面描述了部分挑選出來的宏:
MAXNESTING 遞歸函數的最大調用層數,默認值是10。
MAXSTRINGLEN 字符串的最大長度,默認值是128。
MAXTRYLOCK 在聲稱可以出現死鎖和跳出探測點前,等待全局變量鎖的最大迭代次數,默認值是1000。
MAXACTION 單個探測點內可以執行語句數的最大值,默認值是1000。
MAXMAPENTRIES 數組在聲明時沒有顯示指定大小時,數組的最大行數(譯者注:即組數的最大下標個數),默認值爲2048。
MAXERRORS 在觸發退出前,可以容忍軟件錯誤個數的最大值,默認值是0。
MAXSKIPPED 在觸發退出前,可忽略的重入探測點的最大值,默認值是100。
MINSTACKSPACE 運行探測處理函數所需要的內核棧的最小字節數。此數值應比探測處理函數所需內核棧的大小加上安全邊界大小足夠大。默認值是1024。
參考nginx的項目nginx-systemtap-toolkit中sample-bt這個perl腳本的內容來完善我們的測試。
5.下載FlameGraph包,並轉換輸出數據爲svg圖
git clone https://github.com/brendangregg/FlameGraph.git
將需要用到的flamegraph.pl和stackcollapse-stap.pl到當前目錄,並執行
perl stackcollapse-stap.pl ats.out > ats.out2
perl flamegraph.pl ats.out2 > ats.svg
使用瀏覽器打開該svg文件就可以了。
6.perf+FlameGraph生成的火焰圖
另外使用perf record也可以採集指定時間的數據,並使用FlameGraph生成活躍圖。下面是火焰圖示例
局部圖
參考文獻
[1].https://sourceware.org/systemtap/ftp/releases/
[2].https://github.com/brendangregg/FlameGraph
[3].https://github.com/openresty/nginx-systemtap-toolkit
[4].https://github.com/openresty/stapxx