Linux 性能分析利器 -火焰圖 flame graph

簡述

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 的調用棧。正則表達式

Demo火焰圖

  1. y 軸表示調用棧,每一層都是一個函數。調用棧越深,火焰就越高,頂部就是正在執行的函數,下方都是它的父函數。
  2. x 軸表示抽樣數,若是一個函數在 x 軸佔據的寬度越寬,就表示它被抽到的次數多,即執行的時間長。
  3. 注意,x 軸不表明時間,而是全部的調用棧合併後,按字母順序排列的。

火焰圖就是看頂層的哪一個函數佔據的寬度最大。只要有"平頂"(plateaus),就表示該函數可能存在性能問題。sql

顏色沒有特殊含義,由於火焰圖表示的是 CPU 的繁忙程度,因此通常選擇暖色調。函數

互動性

火焰圖是 SVG 圖片,能夠與用戶互動。工具

鼠標懸浮顯示

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

下面是一個例子。code

mysqld'JOIN::exec (272,959 samples, 78.34 percent)

點擊查看詳細

在某一層點擊,火焰圖會水平放大,該層會佔據全部寬度,顯示詳細信息。

查看詳細信息

左上角會同時顯示**"Reset Zoom"**,點擊該連接,圖片就會恢復原樣。

搜索

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

侷限

在這兩種狀況下,沒法畫出火焰圖,須要修正系統行爲。

  1. 調用棧不完整

當調用棧過深時,某些系統只返回前面的一部分(好比前10層)。

  1. 函數名缺失

有些函數沒有名字,編譯器只用內存地址來表示(好比匿名函數)。

參考資料

  1. 如何讀懂火焰圖?
  2. 火焰圖介紹論文
  3. 火焰圖官方文檔
  4. 火焰圖生成工具
相關文章
相關標籤/搜索