天天看點

Linux程式性能分析和火焰圖perf record -F 99 -p 15533 -g -- sleep 30perf report -n --stdioperf script -i perf.data &> perf.unfold./stackcollapse-perf.pl perf.unfold &> perf.folded./flamegraph.pl perf.folded > perf.svg

Linux程式性能分析和火焰圖

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

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

指令如下:

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指令可以統計每個調用棧出現的百分比,然後從高到低排列。
           

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指令的輸出,功能強悍,希望本文對大家有所幫助。           

原文位址

https://www.cnblogs.com/pugang/p/10659301.html

繼續閱讀