2-4K star,一個高性能、無侵入的性能監控工具 MyPerf
背景
隨着所在公司的發展,應用服務的規模不斷擴大,原有的垂直應用架構已無法滿足產品的發展,幾十個工程師在一個項目裏並行開發不同的功能,開發效率不斷降低。
於是公司開始全面推進服務化進程,把團隊內的大部分工程師主要精力全部都集中到服務化中。服務化可以讓每個工程師僅在自己負責的子項目中進行開發,提高了開發的效率,但是服務化同時也帶來了其他問題:
-
無法知道每個服務的運行情況,例如,某一臺服務它目前的 QPS 是多少?它的平均延遲是多少,99% 的延遲是多少,99.9% 的延遲又是多少?
-
某一個接口響應時間慢,如何定位是哪個方法引起的?
-
每個服務的負載是否均衡?
-
當服務出現抖動時,如何判斷是 DB、Cache 還是下游服務引起的?
-
DB 和 Cache 響應延遲是多少?
-
如何評估服務的容量,隨着服務的調用量越來越大,這個服務需要多少機器來支撐?什麼時候應該加機器?
針對以上開發中的煩惱,今天我們介紹一個針對高併發、低延遲應用設計的高性能 Java 性能監控和統計工具——MyPerf4J。
使用場景
-
在開發環境中快速定位 Java 應用程序的性能瓶頸
-
在生產環境中長期監控 Java 應用程序的性能指標
特性
-
高性能: 單線程支持每秒 1000 萬次 響應時間的記錄,每次記錄只花費 73 納秒
-
無侵入: 採用 JavaAgent 方式,對應用程序完全無侵入,無需修改應用代碼
-
低內存: 採用內存複用的方式,整個生命週期只產生極少的臨時對象,不影響應用程序的 GC
-
高精度: 採用納秒來計算響應時間
-
高實時: 支持秒級監控,最低 1 秒!
監控指標
MyPerf4J 爲每個應用收集數十個監控指標,所有的監控指標都是實時採集和展現的。
下面是 MyPerf4J 目前支持的監控指標列表:
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 配置方式,透明化接入應用,對應用代碼完全沒有侵入。
下載
-
下載並解壓 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 啓動參數里加上以下兩個參數
-javaagent:/path/to/MyPerf4J-ASM.jar
-DMyPerf4JPropFile=/path/to/MyPerf4J.properties
運行
啓動應用,監控日誌輸出到 /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 啓動參數中去掉以下兩個參數,重啓即可卸載此工具。
-javaagent:/path/to/MyPerf4J-ASM.jar
-DMyPerf4JPropFile=/path/to/MyPerf4J.properties
開源地址
https://github.com/LinShunKang/MyPerf4J
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/XiCl5b95xi50Z9WjPt_RcA