相關(guān)文章
JVM那點(diǎn)事—show-busy-java-threads排查CPU性能問題
JVM那點(diǎn)事—火焰圖(flame graph)性能分析
推薦閱讀
是誰在調(diào)用我聘芜?使用 arthas+jprofiler 做復(fù)雜鏈路分析
1. 什么叫做火焰圖
火焰圖(flame graph)是性能分析的利器。
y軸表示調(diào)用棧,每一層都是一個(gè)函數(shù)。調(diào)用棧越深疟呐,火焰就越高珊泳,y軸一般是從下往上看晓褪,分析占用時(shí)間比較高的方法。(請(qǐng)求由下往上訪問)好港。
x軸表示抽樣數(shù),如果一個(gè)函數(shù)在x軸占據(jù)的寬度越寬,就表示它被抽到次數(shù)多塘秦,即執(zhí)行時(shí)間長尊剔。注意挨稿,x軸不代表時(shí)間历造,而是所有棧合并后吭产,按字母順序的排序。
火焰圖就是看從下往上看的哪個(gè)函數(shù)占據(jù)的寬度最大鸭轮,只要有“平頂”臣淤,就表示該函數(shù)可能存在性能問題。
顏色沒有特殊含義窃爷,因?yàn)榛鹧鎴D表示的是 CPU 的繁忙程度邑蒋,所以一般選擇暖色調(diào)。
例如按厘,火焰圖上方占用的寬度明顯過大医吊,分析是mybatis的日志打印,我們就可以得出因?yàn)轫?xiàng)目開啟mybatis日志打印級(jí)別過低導(dǎo)致性能問題逮京。
2. Arthas打印火焰圖
2.1 啟動(dòng)profiler
開啟arthas
java -jar arthas-boot.jar
開啟火焰圖
profiler start
Started [cpu] profiling
默認(rèn)啟動(dòng)的是對(duì)CPU的收集卿堂。可以分析一個(gè)系統(tǒng)中性能耗時(shí)懒棉,占用時(shí)間比較多的方法草描。
也可以使用--event
參數(shù)指定要采樣的事件。例如:
# 對(duì)內(nèi)存進(jìn)行分析
$ profiler start --event alloc
可以使用下面命令看對(duì)event
的支持策严。
profiler list
生成的svg文件穗慕,可以使用sz
命令下載下來,直接使用瀏覽器打開妻导。
# 獲取已采集的sample的數(shù)量
$ profiler getSamples
# 查看profiler狀態(tài)
$ profiler status
2.2 關(guān)閉profiler
默認(rèn)情況下逛绵,生成的結(jié)果保存到應(yīng)用的工作目錄下的arthas-output目錄【缶拢可以通過 --file參數(shù)來指定輸出結(jié)果路徑术浪。比如:
$ profiler stop --file /tmp/output.svg
profiler output file: /tmp/output.svg
OK
3. 火焰圖的互動(dòng)性
來源:阮一峰的網(wǎng)絡(luò)日志—如何讀懂火焰圖?
火焰圖是 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ì)高亮顯示廊散。