在CentOS 6.6 x86_64上安装SystemTap/Perf+FlameGraph玩转火焰图实录
生活随笔
收集整理的這篇文章主要介紹了
在CentOS 6.6 x86_64上安装SystemTap/Perf+FlameGraph玩转火焰图实录
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
下面是我結合網上資料摸索出的可行的操作方法,記錄在這樣,以備后面繼續研究。操作系統是CentOS 6.6 x86_64。
1.將內核版本升級到最新版
因為我機器上CentOS 6.6的內核版本號是2.6.32-573.12.1.el6.x86_64,網上根本找不到對應的kernel-devel,kernel-debuginfo和kernel-debuginfo-common內核rpm包,而升級到最新版就可以解決這個問題。
升級方法參見
http://blog.csdn.net/tao_627/article/details/52136091
打開/boot/config-2.6.32-642.3.1.el6.x86_64文件(內核版本不同,文件名不同),檢查CONFIG_UTRACE宏是否設置。如果沒有,就不能使用SystemTap
cat /boot/config-2.6.32-642.3.1.el6.x86_64 | grep '_UTRACE'
2.安裝內核調試所需要的包
yum -y install kernel-devel-2.6.32-642.3.1.el6.x86_64
yum -y install kernel-debuginfo-2.6.32-642.3.1.el6.x86_64
yum -y install kernel-debuginfo-common-x86_64-2.6.32-642.3.1.el6.x86_64
3.安裝SystemTap并配置腳本
yum -y install systemtap
驗證SystemTap是否安裝成功?
4.監視運行中的ats并采樣,輸出svg圖
stap --ldd -d /usr/bin/traffic_server --all-modules -D MAXMAPENTRIES=256 -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-perf.pl到當前目錄,并執行
perl stackcollapse-stap.pl ats.out > ats.out2
perl flamegraph.pl ats.out2 > ats.svg
使用瀏覽器打開該svg文件就可以了。
6.perf+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
1.將內核版本升級到最新版
因為我機器上CentOS 6.6的內核版本號是2.6.32-573.12.1.el6.x86_64,網上根本找不到對應的kernel-devel,kernel-debuginfo和kernel-debuginfo-common內核rpm包,而升級到最新版就可以解決這個問題。
升級方法參見
http://blog.csdn.net/tao_627/article/details/52136091
升級后的版本號是2.6.32-642.3.1.el6.x86_64
打開/boot/config-2.6.32-642.3.1.el6.x86_64文件(內核版本不同,文件名不同),檢查CONFIG_UTRACE宏是否設置。如果沒有,就不能使用SystemTap
cat /boot/config-2.6.32-642.3.1.el6.x86_64 | grep '_UTRACE'
2.安裝內核調試所需要的包
yum -y install kernel-devel-2.6.32-642.3.1.el6.x86_64
yum -y install kernel-debuginfo-2.6.32-642.3.1.el6.x86_64
yum -y install kernel-debuginfo-common-x86_64-2.6.32-642.3.1.el6.x86_64
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=256 -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-perf.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
總結
以上是生活随笔為你收集整理的在CentOS 6.6 x86_64上安装SystemTap/Perf+FlameGraph玩转火焰图实录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS 6.6 x86_64升级内
- 下一篇: 在CentOS上安装TCP协议性能评测工