使用火焰圖進行Java應用效能分析

mpsky發表於2021-09-09

作者:  
轉載標誌 【2017-11-19】

更新日誌

日期 更新內容 備註
2017-11-19 新建文章 初版
2017-12-15 參考文章實現閉環

匯入

本文主要想要記錄進行java應用效能分析的一種方式,也就是使用火焰圖來進行java應用效能分析,本文將介紹一些工具,包括如何生成profile資料,以及如何根據profile資料生成火焰圖等,本文的內容都基於Linux(Ubuntu x64)系統,這一點需要特別注意。如果你有時間的話,可以去閱讀以下,作者是Brendan Gregg大神,本文介紹的生成火焰圖的工具就出自Brendan Gregg之手。

Action

首先,我們需要收集java程式碼執行時的profile資料,本文使用的是一個叫做的工具,你需要下載lightweight-java-profiler,並且自己編譯才能使用它來進行資料收集,關於lightweight-java-profiler的更多的細節介紹,可以參考。你可以直接在github搜尋lightweight-java-profiler,並且clone到本地進行編譯,當然在編譯之前你可以進行一些資料收集的方案定製:

// Things that should probably be user-configurable// Number of times per second that we profilestatic const int kNumInterrupts = 100;// Maximum number of stack tracesstatic const int kMaxStackTraces = 3000;// Maximum number of frames to store from the stack traces sampled.static const int kMaxFramesToCapture = 128;// Location where the data are dumped.static const char kDefaultOutFile[] = "traces.txt";

上面的引數設定在globals.h檔案中可以找到,可以根據實際情況進行設定,比如kNumInterrupts的意思就是每秒鐘進行資料收集的次數,預設輸出profile資料的檔案的名字為“traces.txt”,這些你都可以做自定義修改,當改好的之後就可以進行編譯了,在64位機器上編譯可以使用下面的命令:

make BITS=64 all

如果順利的話,可以看到會生成一個build-64的資料夾,裡面有一個.so檔案叫做liblagent.so,這就是我們需要的收集profile資料的.so檔案。現在,你可以在啟動你的java應用的時候加上下面的引數:

-agentpath:${path}/lightweight-java-profiler/build-64/liblagent.so

然後就可以獲取到trace.txt檔案。接下來,就需要將java應用的執行時profile資料轉換為視覺化的火焰圖來進行效能分析了,將profile資料轉換為火焰圖的工具上文已經提到過,可以在下載,下載完成之後,就可以執行下面的命令來生成火焰圖了:

cd FlameGraph
./stackcollapse-ljp.awk  {$path}/traces.svg

現在,你應該可以得到一個火焰圖的.svg檔案了,在瀏覽器中開啟就可以看到火焰圖的細節了。關於火焰圖,可以參考下面的說明:

The y-axis is stack depth, and the x-axis spans the sample population. Each rectangle is a stack frame. Color is not important, it's randomized to differentiate frames. The ordering from left to right is also unimportant.

You look for the widest frames, from bottom up, and forks in the "flames", which indicate different code paths taken

所以,我們在看火焰圖的時候,主要關注比較寬的就可以發現效能問題了,因為越寬代表佔用的CPU時間越多,也就越是效能瓶頸,當然這種分析得結合實際的應用程式碼,下面是一張火焰圖,具體的分析就不在本文的中進行了。本文僅記錄一種分析java應用效能問題的方案,採用觀察執行時火焰圖的方式來發現應用的效能瓶頸是一種比較直觀的方法,而採集profile資料使用lightweight-java-profiler,將採集到的profile資料轉換為火焰圖使用工具FlameGraph,當未來需要對java應用進行效能最佳化的時候,可以採用這種方案來發現效能瓶頸,並及時進行最佳化。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1806/viewspace-2802564/,如需轉載,請註明出處,否則將追究法律責任。

相關文章