1. 程式人生 > >在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

升級後的版本號是2.6.32-642.3.1.el6.x86_64


2.檢查核心是否提供utrace/uprobes使用者態支援
開啟/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