首頁 > 運動

# 資料探勘# # 高階統計# 火焰圖在程式效能分析方面的重要應用

由 演算法集市 發表于 運動2021-05-24

簡介combrendangreggFlameGraph

縱軸表示什麼

使用火焰圖對程式進行效能分析

在對程式進行效能分析時,首先需要找到熱點函式,定位效能瓶頸,然後才能透過演算法最佳化或程式碼最佳化來提高程式的效能。

系統性能分析工具:perf

這篇文章中,我們介紹了 perf 工具的使用,透過 perf record 和 perf report 命令,可以檢視程式中各個函式的CPU佔用率,但是不太直觀,尤其對於大型複雜的程式。

而使用火焰圖查詢熱點函式則非常方便。

一、火焰圖的解釋

使用火焰圖對程式進行效能分析

如上圖所示,火焰圖的解釋:

橫軸表示取樣數和取樣比例,一個函式橫軸越寬,代表它的執行時間越長。同一層的函式按照字母順序排列的;

縱軸表示呼叫棧,由下向上根據呼叫關係逐個展開,即上面函式是下面函式的子函式,呼叫棧越深,縱軸越高。

圖中的顏色沒有特殊含義,只是用來區分不同函式。

火焰圖是動態向量圖格式,支援動態特性。滑鼠懸浮在某函式,則會顯示該函式的函式名、抽樣次數、抽樣比例;用滑鼠點選某函式時,則該層及其上層函式就會放大,方便檢視呼叫棧的細節。

使用火焰圖對程式進行效能分析

使用火焰圖對程式進行效能分析時,就是看火焰圖頂層的哪個函式佔據的寬度最大。

若存在平頂函式,則表示該函式可能存在效能問題。

二、火焰圖的建立

Brendan D。 Gregg 的 Flame Graph 實現了一套生成火焰圖的指令碼,首先需要下載此指令碼。

git clone https://github。com/brendangregg/FlameGraph。git

建立火焰圖需要以下三個步驟:

1、捕獲堆疊

比如要分析程序 xxx,啟動該程序後,使用 perf record 採集資料,使用 perf script 匯出到 out。perf:

sudo perf record -a ——call-graph dwarf -p `ps aux | grep “xxx” | grep -v grep | cut -c 9-15`sudo perf script > out。perf

2、摺疊堆疊

合併呼叫棧的資訊:

。/stackcollapse-perf。pl out。perf > out。folded

3、生成火焰圖

。/flamegraph。pl out。folded > xxx。svg

最後使用瀏覽器開啟 xxx。svg 檔案,即可開始效能分析。

透過管道,可將後面兩步合為一步:

。/stackcollapse-perf。pl out。perf | 。/flamegraph。pl > xxx。svg

將兩個火焰圖進行diff,還可以生成一個diff火焰圖

。/difffolder。pl out。folded1 out。folded2 | 。/flamegraph。pl > diff。svg

Tags:perf函式out火焰PL