高性能、無侵入的 Java 性能監(jiān)控神器
背景
于是公司開始全面推進(jìn)服務(wù)化進(jìn)程,把團(tuán)隊內(nèi)的大部分工程師主要精力全部都集中到服務(wù)化中。服務(wù)化可以讓每個工程師僅在自己負(fù)責(zé)的子項目中進(jìn)行開發(fā),提高了開發(fā)的效率,但是服務(wù)化同時也帶來了其他問題:
- 無法知道每個服務(wù)的運行情況,例如,某一臺服務(wù)它目前的 QPS 是多少?它的平均延遲是多少,99% 的延遲是多少,99.9% 的延遲又是多少?
- 某一個接口響應(yīng)時間慢,如何定位是哪個方法引起的?
- 每個服務(wù)的負(fù)載是否均衡?
- 當(dāng)服務(wù)出現(xiàn)抖動時,如何判斷是 DB、Cache 還是下游服務(wù)引起的?
- DB 和 Cache 響應(yīng)延遲是多少?
- 如何評估服務(wù)的容量,隨著服務(wù)的調(diào)用量越來越大,這個服務(wù)需要多少機器來支撐?什么時候應(yīng)該加機器?
針對以上開發(fā)中的煩惱,今天我們介紹一個針對高并發(fā)、低延遲應(yīng)用設(shè)計的高性能 Java 性能監(jiān)控和統(tǒng)計工具——MyPerf4J。
使用場景
- 在開發(fā)環(huán)境中快速定位 Java 應(yīng)用程序的性能瓶頸
- 在生產(chǎn)環(huán)境中長期監(jiān)控 Java 應(yīng)用程序的性能指標(biāo)
特性
- 高性能: 單線程支持每秒 1000萬次 響應(yīng)時間的記錄,每次記錄只花費 73納秒
- 無侵入: 采用 JavaAgent 方式,對應(yīng)用程序完全無侵入,無需修改應(yīng)用代碼
- 低內(nèi)存: 采用內(nèi)存復(fù)用的方式,整個生命周期只產(chǎn)生極少的臨時對象,不影響應(yīng)用程序的GC
- 高精度: 采用納秒來計算響應(yīng)時間
- 高實時: 支持秒級監(jiān)控,最低 1 秒!
監(jiān)控指標(biāo)
MyPerf4J 為每個應(yīng)用收集數(shù)十個監(jiān)控指標(biāo),所有的監(jiān)控指標(biāo)都是實時采集和展現(xiàn)的。
下面是 MyPerf4J 目前支持的監(jiān)控指標(biāo)列表:
Method
RPS,Count,Avg,Min,Max,StdDev,TP50, TP90, TP95, TP99, TP999, TP9999, TP99999, TP100
圖片
Memory
HeapInit,HeapUsed,HeapCommitted,HeapMax,NonHeapInit,NonHeapUsed,NonHeapCommitted,NonHeapMax
圖片
JVM GC
CollectCount,CollectTime
圖片
JVM Class
Total,Loaded,Unloaded
圖片
快速啟動
MyPerf4J 采用 JavaAgent 配置方式,透明化接入應(yīng)用,對應(yīng)用代碼完全沒有侵入。
下載
- 下載并解壓 MyPerf4J-ASM.zip
- 閱讀解壓出的 README 文件
- 修改解壓出的 MyPerf4J.properties 配置文件中 app_name、metrics.log.xxx 和 filter.packages.include 的配置值
MyPerf4J-ASM.zip包:https://github.com/LinShunKang/Objects/blob/master/zips/CN/MyPerf4J-ASM-3.3.0-SNAPSHOT.zip?raw=true
配置
在 JVM 啟動參數(shù)里加上以下兩個參數(shù)
-javaagent:/path/to/MyPerf4J-ASM.jar
-DMyPerf4JPropFile=/path/to/MyPerf4J.properties
圖片
運行
啟動應(yīng)用,監(jiān)控日志輸出到 /path/to/log/method_metrics.log:
MyPerf4J Method Metrics [2020-01-01 12:49:57, 2020-01-01 12:49:58]
Method[6] Type Level TimePercent RPS Avg(ms) Min(ms) Max(ms) StdDev Count TP50 TP90 TP95 TP99 TP999 TP9999
DemoServiceImpl.getId2(long) General Service 322.50% 6524 0.49 0 1 0.50 6524 0 1 1 1 1 1
DemoServiceImpl.getId3(long) General Service 296.10% 4350 0.68 0 1 0.47 4350 1 1 1 1 1 1
DemoServiceImpl.getId4(long) General Service 164.60% 2176 0.76 0 1 0.43 2176 1 1 1 1 1 1
DemoServiceImpl.getId1(long) General Service 0.00% 8704 0.00 0 0 0.00 8704 0 0 0 0 0 0
DemoDAO.getId1(long) DynamicProxy DAO 0.00% 2176 0.00 0 0 0.00 2176 0 0 0 0 0 0
DemoDAO.getId2() DynamicProxy DAO 0.00% 2176 0.00 0 0 0.00 2176 0 0 0 0 0 0
卸載
在 JVM 啟動參數(shù)中去掉以下兩個參數(shù),重啟即可卸載此工具。
-javaagent:/path/to/MyPerf4J-ASM.jar
-DMyPerf4JPropFile=/path/to/MyPerf4J.properties
開源地址
https://github.com/LinShunKang/MyPerf4J