在OR專案中使用火焰圖

weixin_33763244發表於2017-05-29

火焰圖介紹

看到openresty裡用火焰圖覺得挺有意思的,又裝逼又有用。它可以快速的定位到程式效能的瓶頸,生成程式的呼叫棧並且計算呼叫棧中每部分的 CPU 消耗,能夠比較容易的找到CPU佔用高、記憶體洩漏等問題。今天在自己以前的專案中測試了下,下面貼個圖留個紀念。
![圖片描述

這裡面不要看顏色,因為顏色是隨機搞來的,沒有任何意義。要看火焰山上縱向的高度和每個對應的長度。縱向的高度代表函式呼叫棧的深度,橫向長度代表此函式執行佔用CPU的比例。

下面來了解下火焰圖工具如何安裝。

火焰圖安裝

參考 http://kernelmaker.github.io/...

安裝systemtap

其實主要就是安裝核心探測工具 systemtap。(SystemTap 通過將指令碼語句翻譯成C語句,編譯成核心模組。模組載入之後,依據時間處理機制來收集有關正在執行的Linux系統的資訊)

    1. yum install yum-utils
    2. yum install kernel-devel
    3. debuginfo-install kernel
    4. yum install systemtap

第三步安裝失敗的話,使用核心版本號找到對應的包進行安裝就好了。
完成後輸入以下命令進行測試

    stap -ve 'probe begin { log("hello world") exit() }'

如果安裝成功則是這樣
clipboard.png

下載 openresty-systemtap-toolkit

要知道systemtap只是個核心探測工具,不只是可以用在openresty中的,你得自己寫好指令碼來進行埋點等工作。但是春哥已經在 openresty-systemtap-toolkit 中提供了許多可以直接使用的指令碼,我們直接拿過來用就好了,畢竟我自己是不會寫的。

下載 FlameGraph

使用上面openresty-systemtap-toolkit這些指令碼後,我們其實已經可以拿到我們所需要的資訊了,只是還是不夠直觀,所以我們得用FlameGraph火焰圖生成工具來生成直觀的圖片。

使用示例

1.找到我們要監控的nginx的某個程式
ps -ef | grep nginx

clipboard.png

2.ngx-sample-lua-bt 抓取棧資訊(這個工具可以看到在某個檔案對應行函式的情況)
此處我是把上面下載的openresty-systemtap-toolkitFlameGraph加到環境變數裡面去了。所以直接輸入命令就行了

ngx-sample-lua-bt -p 19075 --luajit20 -t 5 > temp.bt

3.使用fix-lua-bt把上面得到的檔案轉化更友好點(直接看到對應的lua函式)

fix-lua-bt temp.bt > a.bt 

4.使用下面兩個FlameGraph中的命令將檔案轉化為svg圖片

stackcollapse-stap.pl a.bt > a.cbt
flamegraph.pl a.cbt > a.svg

然後開啟a.svg就可以看到火焰圖了

相關文章