Linux程序性能分析和火焰圖

Linux程序性能分析和火焰圖linux

 

       Linux程序的性能分析工具數量比較多,涉及到整個操做系統的方方面面,多是開源的緣由吧,相對於Windows來講豐富太多。其中應用分析性能方面Dtrace, SystemTap, Perf_events應該算是這方面的集大成者。Dtrace目前只在較高的內核版本有支持,記得是4.8之後, SystemTap則是須要在Red Hat的官方網站下載OS版本對應的調試符號和對應的調試版本內核,配置起來須要花費必定的時間,只有Perf_events使用起來比較方面,可是客觀來講,實力也是最弱的,但應對日一些簡單的場景也足夠了。本文以Perf_events進行示範,算是對這方面感興趣的朋友開個頭,拋磚引玉一下。git

       Perf_events簡稱perf是 Linux 系統原生提供的性能分析工具,會返回 CPU 正在執行的函數名以及調用棧(stack)。一般,它的執行頻率是 99Hz(每秒99次),若是99次都返回同一個函數名,那就說明 CPU 這一秒鐘都在執行同一個函數,可能存在性能問題。github

 

命令以下:正則表達式

# perf record -F 99 -p 15533 -g -- sleep 30

 

       上面的命令中,perf record表示記錄,-F 99表示每秒99次,-p 15533是進程號,即對哪一個進程進行分析,也能夠對線程進行分析, -g表示記錄調用棧,sleep 30則是持續30秒。運行後會產生一個龐大的文本文件。若是一臺服務器有16個 CPU,每秒抽樣99次,持續30秒,就獲得 47,520 個調用棧,長達幾十萬甚至上百萬行。爲了便於閱讀,perf record命令能夠統計每一個調用棧出現的百分比,而後從高到低排列。服務器

 

命令以下:svg

 

# perf report -n --stdio

 

因爲文本顯示方式對於初學者不是十分直觀,因而有了火焰圖, 首先對剛纔生成的perf.data進行以下兩步處理。函數

 

# perf script -i perf.data &> perf.unfold

 

# ./stackcollapse-perf.pl perf.unfold &> perf.folded

 

而後生成火焰圖工具

#./flamegraph.pl perf.folded > perf.svg

 

具體的火焰圖生成工具能夠去以下路徑下載:性能

https://github.com/brendangregg/FlameGraph網站

 

 

關於火焰圖

 

       火焰圖是基於 perf 結果產生的 SVG 圖片,用來展現 CPU 的調用棧。y 軸表示調用棧,每一層都是一個函數。調用棧越深,火焰就越高,頂部就是正在執行的函數,下方都是它的父函數。x 軸表示抽樣數,若是一個函數在 x 軸佔據的寬度越寬,就表示它被抽到的次數多,即執行的時間長。注意,x 軸不表明時間,而是全部的調用棧合併後,按字母順序排列的。火焰圖就是看頂層的哪一個函數佔據的寬度最大。只要有"平頂"(plateaus),就表示該函數可能存在性能問題。顏色沒有特殊含義,由於火焰圖表示的是 CPU 的繁忙程度,因此通常選擇暖色調。火焰圖是 SVG 圖片,能夠與用戶互動。

 

--鼠標懸浮

火焰的每一層都會標註函數名,鼠標懸浮時會顯示完整的函數名、抽樣抽中的次數、佔據總抽樣次數的百分比。

 

--點擊放大

在某一層點擊,火焰圖會水平放大,該層會佔據全部寬度,顯示詳細信息。左上角會同時顯示"Reset Zoom",點擊該連接,圖片就會恢復原樣。

 

--搜索

按下 Ctrl + F 會顯示一個搜索框,用戶能夠輸入關鍵詞或正則表達式,全部符合條件的函數名會高亮顯示。

 

小結

       本文對linux應用性能分析工具perf的使用進行了完整的介紹,並對如何生成火焰圖的命令進行了示範,火焰圖的應用場景不少,不只能夠處理perf的輸出數據還能夠處理Dtrace命令的輸出,功能強悍,但願本文對你們有所幫助。

相關文章
相關標籤/搜索