Perf 命令(performance的簡寫)是 Linux 系統原生提供的性能分析工具,返回 CPU 正在執行的函數名以及調用棧(stack)。html
一般,它的執行頻率是 99Hz(每秒99次),若是99次都返回同一個函數名,那就說明 CPU 這一秒鐘都在執行同一個函數,可能存在性能問題。mysql
$ sudo perf record -F 99 -p 13204 -g -- sleep 30
注:perf record表示記錄,-F 99表示每秒99次,-p 13204是進程號,即對哪一個進程進行分析,-g表示記錄調用棧,sleep 30則是持續30秒。git
執行以後會產生一個文本文件(perf.data)。爲了便於閱讀,使用 perf record 命令能夠統計每一個調用棧出現的百分比,而後從高到低排列。github
$ sudo perf report -n --stdio
火焰圖是基於 perf 結果產生的 SVG 圖片,用來展現 CPU 的調用棧。正則表達式
火焰圖就是看頂層的哪一個函數佔據的寬度最大。只要有"平頂"(plateaus),就表示該函數可能存在性能問題。sql
顏色沒有特殊含義,由於火焰圖表示的是 CPU 的繁忙程度,因此通常選擇暖色調。函數
火焰圖是 SVG 圖片,能夠與用戶互動。工具
火焰的每一層都會標註函數名,鼠標懸浮時會顯示完整的函數名、抽樣抽中的次數、佔據總抽樣次數的百分比。性能
下面是一個例子。code
mysqld'JOIN::exec (272,959 samples, 78.34 percent)
在某一層點擊,火焰圖會水平放大,該層會佔據全部寬度,顯示詳細信息。
左上角會同時顯示**"Reset Zoom"**,點擊該連接,圖片就會恢復原樣。
按下 Ctrl + F 會顯示一個搜索框,用戶能夠輸入關鍵詞或正則表達式,全部符合條件的函數名會高亮顯示。
在這兩種狀況下,沒法畫出火焰圖,須要修正系統行爲。
當調用棧過深時,某些系統只返回前面的一部分(好比前10層)。
有些函數沒有名字,編譯器只用內存地址來表示(好比匿名函數)。