使用火焰圖進行Java應用效能分析
作者:
轉載標誌 【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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Flame Graph 火焰圖分析 Java 效能Java
- perf及火焰圖的使用,效能分析
- 使用VisualVM進行Java應用的效能測量LVMJava
- Linux程式效能分析和火焰圖Linux
- 如何使用SAP事務碼SAT進行UI應用的效能分析UI
- 使用 Dynatrace 對 Node.js 應用的效能資料進行分析Node.js
- 使用pprof進行效能分析
- Linux火焰圖效能分析文章及視訊演示Linux
- 【譯】Google - 使用 webpack 進行 web 效能優化(三):監控和分析應用GoWeb優化
- 使用JDK自帶的VisualVM進行Java程式的效能分析JDKLVMJava
- go效能調優之火焰圖Go
- 程式設計師精進之路:效能調優利器--火焰圖程式設計師
- 使用 XDebug + Webgrind 進行 PHP 程式效能分析WebPHP
- java使用phantomjs進行截圖JavaJS
- Rust效能分析之測試及火焰圖,附(lru,lfu,arc)測試Rust
- 使用Java後端對Angular應用進行Docker化 -BhargavJava後端AngularDocker
- 利用perf進行效能分析
- [譯] 使用 Kotlin 協程改進應用效能Kotlin
- Docker中使用Xhprof 對程式碼進行效能分析Docker
- 效能工具perf的用法以及如何繪製效能火焰圖
- 又一款效能監控利器——火焰圖
- 使用python進行Oracle資料庫效能趨勢分析PythonOracle資料庫
- 使用Java和Elastic Stack進行日誌分析JavaAST
- 使用工具分析 SAP UI5 應用前端執行的效能問題UI前端
- 如何使用Java串列埠進行資料通訊及應用案例Java串列埠
- 使用 Java 進行移動應用開發的 8 個理由 - VikrantJava
- 基於PostgreSQL進行Java應用開發SQLJava
- Linux下用perf生成火焰圖方法Linux
- Chrome 火焰圖Chrome
- Golang火焰圖Golang
- 使用應用程式(Java/Python)訪問MaxCompute Lightning進行資料開發JavaPython
- 如何使用Nginx對Artifactory進行http應用NginxHTTP
- linux 效能調優工具perf + 火焰圖 常用命令Linux
- 容器化 RDS:藉助火焰圖定位Kubernetes效能問題
- Laradock 下使用 Tideways_xhprof+Xhgui 進行效能分析 —— 安裝篇IDEGUI
- 使用shouldComponentUpdate進行效能優化優化
- 使用Loadrunner進行效能測試
- SRE 彈效能力:使用 Envoy 對應用進行速率限制