首頁 > 運動
# 資料探勘# # 高階統計# 火焰圖在程式效能分析方面的重要應用
由 演算法集市 發表于 運動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