perf + 火焰圖用法 小結
要對新服務做效能測試,分析程式碼熱點,初識perf,做下總結
perf + 火焰圖用法
perf簡介
Perf (Performance Event), Linux 系統原生提供的效能分析工具, 會返回 CPU 正在執行的函式名以及呼叫棧(stack)
通過它,應用程式可以利用 PMU,tracepoint 和核心中的特殊計數器來進行效能統計。它不但可以分析指定應用程式的效能問題 (per thread)
,也可以用來分析核心的效能問題,當然也可以同時分析應用程式碼和核心,從而全面理解應用程式中的效能瓶頸通常,它的執行頻率是 99Hz(每秒99次),如果99次都返回同一個函式名,那就說明 CPU 這一秒鐘都在執行同一個函式,可能存在效能問題
sudo perf record -F 99 -p 13204 -g -- sleep 30
上面的程式碼中,perf record表示記錄,-F 99表示每秒99次,-p 13204是程序號,即對哪個程序進行分析,-g表示記錄呼叫棧,sleep 30則是持續30秒
執行後會產生一個龐大的文字檔案。如果一臺伺服器有16個 CPU,每秒抽樣99次,持續30秒,就得到 47,520 個呼叫棧,長達幾十萬甚至上百萬行。
為了便於閱讀,perf record命令可以統計每個呼叫棧出現的百分比,然後從高到低排列
火焰圖簡介
火焰圖(flame graph), 是基於 perf 結果產生的 SVG 圖片,用來展示 CPU 的呼叫棧
y 軸表示呼叫棧,每一層都是一個函式。呼叫棧越深,火焰就越高,頂部就是正在執行的函式,下方都是它的父函式。
x軸表示抽樣數,如果一個函式在 x 軸佔據的寬度越寬,就表示它被抽到的次數多,即執行的時間長。注意,x 軸不代表時間,而是所有的呼叫棧合併後,按字母順序排列的。
火焰圖就是看頂層的哪個函式佔據的寬度最大。只要有"平頂"(plateaus),就表示該函式可能存在效能問題。
顏色沒有特殊含義,因為火焰圖表示的是 CPU 的繁忙程度,所以一般選擇暖色調。
火焰圖互動性
火焰圖是 SVG 圖片,可以與使用者互動。
- 滑鼠懸浮
火焰的每一層都會標註函式名,滑鼠懸浮時會顯示完整的函式名、抽樣抽中的次數、佔據總抽樣次數的百分比。下面是一個例子
Function: Taf::TC_Thread::threadEntry (7,665 samples, 49.9%)
- 點選放大
- 在某一層點選,火焰圖會水平放大,該層會佔據所有寬度,顯示詳細資訊
- 左上角會同時顯示"Reset Zoom",點選該連結,圖片就會恢復原樣。
- 搜尋
- 按下 Ctrl + F 會顯示一個搜尋框,使用者可以輸入關鍵詞或正則表示式,所有符合條件的函式名會高亮顯示
- 滑鼠懸浮
例項
登入宿主機或者容器
go -d A
檢視程序pid
ps aux|grep name
使用perf記錄和生成
perf record -F 99 -p 101503 -m 4 -g -a -- sleep 60 perf script > out.perf
製作火焰圖
從github上clone下來
git clone https://github.com/brendangregg/FlameGraph.git cd FlameGraph
處理perf script
./stackcollapse-perf.pl out.perf > out.folded
繪製SVG
./flamegraph.pl out.folded > pmCount.svg
火焰圖侷限性
呼叫棧不完整
- 當呼叫棧過深時,某些系統只返回前面的一部分(比如前10層)。
函式名缺失
- 有些函式沒有名字,編譯器只用記憶體地址來表示(比如匿名函式)。
火焰圖示例
- 從圖中看出,jce 的display方法是程式碼熱點,佔用cpu資源很高, 優化之後預計效能提升20%+
後臺服務效能測試常見指標
測試指標
QPS(吞吐量)
- 每秒鐘系統能夠處理的請求數、任務數
響應時間
- 服務處理一個請求或一個任務的耗時
錯誤率
- 一批請求中結果出錯的請求所佔比例
壓測
引數
- 併發數
- 請求個數
分析
- req個數
- 有效rsp個數
- 耗時分佈
- 耗時隨QPS上升的曲線
- QPS
- 第一次出現異常,即當前系統已經開始出現異常(QPS=有效RSP/主調超時時間)
- 異常率統計
- 異常率=失敗RSP/REQ
優化
分析服務瓶頸
- top
- vmstat
- google-perftools
專項優化
- CPU分析
- perf
- 火焰圖
- 記憶體分析
- CPU分析
參考