火焰图(Flame Graphs)的安装和基本用法
火焰圖(Flame Graphs)
一、概述:
? ? ? ? 火焰圖(flame graph)是性能分析的利器,通過它可以快速定位性能瓶頸點(diǎn)。
? ? ? ? perf 命令(performance 的縮寫)是 Linux 系統(tǒng)原生提供的性能分析工具,會(huì)返回 CPU 正在執(zhí)行的函數(shù)名以及調(diào)用棧(stack)。
? ? ? ? 本文介紹它的安裝和基本用法。
二、安裝perf和可視化生成器
# yum install perf -y? ? ? ? ? ?//yum方式安裝perf
#?git clone https://github.com/brendangregg/FlameGraph.git? ? ? ? ? ? ? ?//選擇好火焰圖文件存放路徑后執(zhí)行該條命令,從github上獲取火焰圖的相關(guān)文件,獲取完成后會(huì)有一個(gè)FlameGraph的文件夾,如下圖
?說明:打開文件夾,里面大部分是perf語言寫的腳本,生成火焰圖后續(xù)會(huì)用到,如下圖,右圖為各pl文件用途釋義
到此,安裝完成。
三、perf 采集數(shù)據(jù)
# perf record -F 99 -a -g -- sleep 60 //對CPU所有進(jìn)程以99Hz采集,它的執(zhí)行頻率是 99Hz(每秒99次),如果99次都返回同一個(gè)函數(shù)名,那就說明 CPU 這一秒鐘都在執(zhí)行同一個(gè)函數(shù),可能存在性能問題。執(zhí)行60秒后會(huì)彈出如下圖提示表示采集完成,在當(dāng)前目錄會(huì)生成一個(gè)perf.data的文件
# perf record -F 99 -p 181 -g -- sleep 60 //對進(jìn)程ID為181的進(jìn)程進(jìn)行采集,采集時(shí)間為60秒,執(zhí)行期間不要退出上述代碼中perf record表示記錄,-F 99表示每秒99次,-p 13204是進(jìn)程號,即對哪個(gè)進(jìn)程進(jìn)行分析,-g表示記錄調(diào)用棧,sleep 30則是持續(xù)30秒,-a 表示記錄所有cpu調(diào)用。更多參數(shù)可以執(zhí)行perf --help查看。
perf.data文件生成后,表示采集完成。最好是在火焰圖的目錄下進(jìn)行采集,方便轉(zhuǎn)換成SVG圖形。 四、生成火焰圖
# perf script -i perf.data &> perf.unfold? ? ? ? ? ? ? ? ? ? ? ? //生成腳本文件
# ./FlameGraph/stackcollapse-perf.pl perf.unfold &> perf.folded? ? ? ? ? ? ??
# ./FlameGraph/flamegraph.pl perf.folded > perf.svg? ? ? ? ? ? ? ? ? ? ? ?//執(zhí)行完成后生成perf.svg圖片,可以下載到本地,用瀏覽器打開 perf.svg,如下圖
?
?
五、火焰圖的含義
火焰圖是基于 perf 結(jié)果產(chǎn)生的?SVG 圖片,用來展示 CPU 的調(diào)用棧。
y 軸表示調(diào)用棧,每一層都是一個(gè)函數(shù)。調(diào)用棧越深,火焰就越高,頂部就是正在執(zhí)行的函數(shù),下方都是它的父函數(shù)。
x 軸表示抽樣數(shù),如果一個(gè)函數(shù)在 x 軸占據(jù)的寬度越寬,就表示它被抽到的次數(shù)多,即執(zhí)行的時(shí)間長。注意,x 軸不代表時(shí)間,而是所有的調(diào)用棧合并后,按字母順序排列的。
火焰圖就是看頂層的哪個(gè)函數(shù)占據(jù)的寬度最大。只要有"平頂"(plateaus),就表示該函數(shù)可能存在性能問題。
顏色沒有特殊含義,因?yàn)榛鹧鎴D表示的是 CPU 的繁忙程度,所以一般選擇暖色調(diào)。
六、互動(dòng)性
火焰圖是?SVG 圖片,可以與用戶互動(dòng)。
(1)鼠標(biāo)懸浮
火焰的每一層都會(huì)標(biāo)注函數(shù)名,鼠標(biāo)懸浮時(shí)會(huì)顯示完整的函數(shù)名、抽樣抽中的次數(shù)、占據(jù)總抽樣次數(shù)的百分比。下面是一個(gè)例子。
mysqld'JOIN::exec (272,959 samples, 78.34 percent)
(2)點(diǎn)擊放大
在某一層點(diǎn)擊,火焰圖會(huì)水平放大,該層會(huì)占據(jù)所有寬度,顯示詳細(xì)信息。
左上角會(huì)同時(shí)顯示"Reset Zoom",點(diǎn)擊該鏈接,圖片就會(huì)恢復(fù)原樣。
(3)搜索
按下 Ctrl + F 會(huì)顯示一個(gè)搜索框,用戶可以輸入關(guān)鍵詞或正則表達(dá)式,所有符合條件的函數(shù)名會(huì)高亮顯示。
七、火焰圖示例
下面是一個(gè)簡化的火焰圖例子。
首先,CPU 抽樣得到了三個(gè)調(diào)用棧。
func_c func_b func_a start_thread func_d func_a start_thread func_d func_a start_thread
上面代碼中,start_thread是啟動(dòng)線程,調(diào)用了func_a。后者又調(diào)用了func_b和func_d,而func_b又調(diào)用了func_c。
經(jīng)過合并處理后,得到了下面的結(jié)果,即存在兩個(gè)調(diào)用棧,第一個(gè)調(diào)用棧抽中1次,第二個(gè)抽中2次。
start_thread;func_a;func_b;func_c 1 start_thread;func_a;func_d 2
有了這個(gè)調(diào)用棧統(tǒng)計(jì),火焰圖工具就能生成 SVG 圖片。
上面圖片中,最頂層的函數(shù)g()占用 CPU 時(shí)間最多。d()的寬度最大,但是它直接耗用 CPU 的部分很少。b()和c()沒有直接消耗 CPU。因此,如果要調(diào)查性能問題,首先應(yīng)該調(diào)查g(),其次是i()。
另外,從圖中可知a()有兩個(gè)分支b()和h(),這表明a()里面可能有一個(gè)條件語句,而b()分支消耗的 CPU 大大高于h()。
八、局限
兩種情況下,無法畫出火焰圖,需要修正系統(tǒng)行為。
(1)調(diào)用棧不完整
當(dāng)調(diào)用棧過深時(shí),某些系統(tǒng)只返回前面的一部分(比如前10層)。
(2)函數(shù)名缺失
有些函數(shù)沒有名字,編譯器只用內(nèi)存地址來表示(比如匿名函數(shù))。
九、常見應(yīng)用的火焰圖
Node 應(yīng)用的火焰圖
Node 應(yīng)用的火焰圖就是對 Node 進(jìn)程進(jìn)行性能抽樣,與其他應(yīng)用的操作是一樣的。
$ perf record -F 99 -p `pgrep -n node` -g -- sleep 30
詳細(xì)的操作可以看這篇文章。
Chrome?瀏覽器的火焰圖
Chrome 瀏覽器可以生成頁面腳本的火焰圖,用來進(jìn)行 CPU 分析。
打開開發(fā)者工具,切換到 Performance 面板。然后,點(diǎn)擊"錄制"按鈕,開始記錄數(shù)據(jù)。這時(shí),可以在頁面進(jìn)行各種操作,然后停止"錄制"。
這時(shí),開發(fā)者工具會(huì)顯示一個(gè)時(shí)間軸。它的下方就是火焰圖。
瀏覽器的火焰圖與標(biāo)準(zhǔn)火焰圖有兩點(diǎn)差異:它是倒置的(即調(diào)用棧最頂端的函數(shù)在最下方);x 軸是時(shí)間軸,而不是抽樣次數(shù)。
?
?
?
參考資料:
https://github.com/brendangregg/FlameGraph
http://www.brendangregg.com/flamegraphs.html
https://www.jianshu.com/p/492218c163d9
http://www.ruanyifeng.com/blog/2017/09/flame-graph.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/wx170119/p/11459995.html
總結(jié)
以上是生活随笔為你收集整理的火焰图(Flame Graphs)的安装和基本用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卵泡发育不良
- 下一篇: 解决Eclipse添加新server时无