雲智慧透視寶Java代碼性能監控實現原理

一、Java平臺體系及應用場景

從1995年Sun Microsystems公司正式推出Java,到2006年時Sun公司將其開源,迄今爲止已經有了20年的歷史。Java本身已不僅僅只是一門面向對象的編程語言,而是由一系列計算機軟件和規範形成的技術體系,這個技術體系提供了完整的跨平臺開發與部署的支持,實現“一次編寫、到處運行”的目的。Java已經廣泛的應用於嵌入式、移動終端、企業服務器、大型機等各種場合。

Sun官方所定義的Java技術體系包括如下幾個組成部分:

* Java程序設計語言

* 各種硬件平臺上的Java虛擬機

* Class文件格式

* 來自商業機構和開源社區的第三方Java類庫

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

圖:Java技術體系組件圖

Java Virtual Machine(JVM)是Java體系的基礎,負責解釋、編譯執行.class文件形式的字節碼,同時負責內存管理、熱點代碼檢測和運行時編譯優化。正是由於有了虛擬機的基礎,才使Java實現了“一次編寫、到處運行”。Java這20年的發展,其實更是虛擬機的發展過程。期間經歷了Sun、BEA公司各自開發的虛擬機,2009年之後,ORACLE將這兩家公司收購,並將這些虛擬機取長補短、合二爲一。目前還是開源的虛擬機OpenJDK,可供愛好者學習研究用。

JRE部分是支持Java程序運行的標準環境。JDK是JRE的超集,包含JRE的一切,再加上工具如編譯器、調試器等。


二、Java性能監控需求

對於一個企業的應用系統,大多數情況下,肯定是由多種編程語言開發的各種系統的集成。我們都非常關心繫統的可用性、及時響應性、資源的消耗,比如CPU、內存、各種I/O、網路帶寬等消耗情況。對於這些問題的性能瓶頸點,我們一般可以歸納爲外部服務(如第三方API)、資源讀寫、代碼異常。如果在發生這些問題時,能夠及時完整的抓拍記錄保留下來,那麼對於我們解決問題將會提供充足的證據,解決問題會變的非常容易。

對於Java應用系統來說,JVM自身提供了相應的性能監控手段和工具,經常在出現問題後,比如內存泄漏或溢出時,我們會通過jmap命令導出堆的轉儲快照,利用相應的命令jhat或其他相應的第三方內存分析工具來分析對象的佔用情況。

響應緩慢時,我們可能會用jstat監視命令、或jdk的可視化工具jconsole、visualvm來分析JVM的垃圾回收類型、回收頻率,來推測是否是垃圾回收導致的。有可能我們還要接着分析線程轉儲快照,通過jstack取出線程的棧快照,來分析是否有真死鎖、死循環導致的相應緩慢、資源負載高等情況。

當有問題出現時,許多開發人員可能都是比較盲目的用這些工具來試探性定位問題,而大多數情況下,這種試探會無功而返。因爲這些分析工具主要是側重Java單方面的分析,比如該系統調用第三方API,如果第三方API有問題,是無法監控到的。還有像文件、DB資源的訪問也是是無法監控到的。

而且,只有對Java虛擬機機制較爲熟悉的高級開發人員才能比較好的運用、理解這些工具,對於大多數普通Java開發人員來說,這些問題只會令他們束手無策。

像外部服務(如第三方API)、資源讀寫、代碼異常這些瓶頸點,需要通過代碼級別的監控才能直接、快速、有效的找到癥結所在。調用第三方API的耗時、資源訪問的耗時、代碼拋出的非預知異常,這些常見問題代碼監控完全能夠監控到,並能夠實時抓拍記錄,一旦有問題可以快速還原事故問題現場。通過代碼級別監控發現問題後,也可以在輔助利用虛擬機內置監控工具進行進一步的定位。


三、透視寶Java監控實現原理

wKioL1Yp1r7zp53fAABs1z_9f7U035.jpg

圖:Java的執行模型


在Java的執行體系中,由.Java源碼文件編譯後的.class字節碼文件,可以理解爲中間語言。

wKiom1Yp1rXQk6ExAAEqxa-o4ng264.jpg

圖:透視寶Java監控實現原理


wKioL1Yp1vLAlVcVAADWqqMtTvI140.jpg

圖:透視寶Java監控實例運行圖


1、字節碼load至JVM時發生了什麼

* 回調函數註冊完畢後,凡是當有任何的class文件即將被類加載器加載前,都

會執行回調函數transform,在此方法內實現的類改變操作。

* 實現的transform方法中,我們使用的是ASM字節碼操作框架,ASM從二進制

形式的類文件中讀取、分析類的信息,然後修改改變類的行爲。

* transform方法的基本代碼形式如下:

wKioL1Yp1wCCJEbyAAC9moJZUw8077.jpg

2、如何實際改變類行爲

* 在依賴於ASM基礎之上,我們抽象出這樣的業務模型

wKiom1Yp1tyyYmVUAAEK_bSVbnA015.jpg

* 常用的攔截探針

wKioL1Yp1xThJZUgAADDwZaFDRQ606.jpg

* 常用的運行時攔截處理器

wKiom1Yp1vGzhb2KAAGNlozp66E822.jpg

* 支持的攔截定義過濾器規則

wKioL1Yp1yjR32-HAAF6cyy45kk701.jpg

* 該業務模型對應的行爲

wKioL1Yp16awFYHbAAC-F5jvO5Y318.jpg

定義攔截描述時,指定過濾攔截哪些類、哪些方法,然後,在這些行爲的點上,可以埋入探針、處理器。重寫visitCode、visitInsn、visitMaxs分別實現方法進入、返回、異常的相關操作改寫。

wKiom1Yp14WTak4yAAFWltFYCls901.jpg

四、透視寶Java監控部署流程

1、登錄雲智慧透視寶官網,點擊頁面右上角導航的“免費試用”,正確填寫免費試用的申請信息後會彈出下面的對話框,同時激活郵件會自動發送到你的郵箱中,按照流程註冊帳號即可。

wKioL1Yp173x0zWrAACVEuffaVc627.jpg

2、註冊成功後,登錄透視寶,點擊配置-應用,在配置頁面中下載安裝Smart Agent。安裝成功後,Smart Agent會根據系統配置自動獲取主機信息,大致兩分鐘後,您就可以在“主機→服務器”模塊中查看該服務器的CPU、內存、網卡、磁盤及進程等性能數據。

wKioL1Yp19Cj8111AAD9_ElkHGg136.jpg

3、如果要監控應用運行時代碼、主機中服務和數據庫性能數據,您需要進一步安裝和配置Smart Agent提供的各種插件,這是因爲Smart Agent實現了一種開放式的插件式結構,對每個運行時代碼、服務和數據庫的監控都是通過相應的插件來實現的。

wKiom1Yp162TaoIaAADYWk2EPbg540.jpg

Smart Agent在安裝完成後,加載過程中自動發現你的應用組件,如果沒有自動監測到Java環境,也可以手動添加Java Agent。如上圖所示,點擊“管理”入口,進入“插件管理”,點擊頁面下部的“添加服務”,選擇JavaAgent後,點擊“創建”。

創建完畢後,點擊“ON”。(該ON操作只是初始化用戶的信息,以便以後採集到的信息能夠正確的回傳給該用戶。)

wKioL1Yp1-XC5YcQAACYmmC9s5c617.jpg

以上都操作完後,在{smartagent的安裝路徑}/plugins,就會看到如下形式的

wKiom1Yp18GyYLerAABK5Ej64bE278.jpg

在到{smartagent的安裝路徑}/plugins/JavaAgent_1442476463X1002x0/conf文件夾下,查看app.conf文件,看看該文件內的HostKey的值是否是如下類似的加密形式

wKioL1Yp1_nQYMqYAABzq0Jg7d8938.jpg

以上情況,表明JavaAgent已經下載啓動初始化成功。

4、安裝JavaAgent至各種應用服務器上,如tomcat\jboss\weblogic。(該操作參考官網https://www.toushibao.com/即可)

5、只要啓動相應服務器,然後訪問您的應用url即可,該url對用的代碼執行情況即可呈現給您,一旦出現緩慢問題也一目瞭然。如下圖示意

wKiom1Yp19bxTTpBAAEI3Vw6XAI807.jpg

五、透視寶Java代碼性能監控特點

在功能方面,透視寶無論是在Java,還是其他如.NET、PHP等主流語言的監控上,都包括:查看執行最慢的10個元素,包括元素執行次數、持續時長和佔用時長百分比;查看HTTP請求參數,包括請求的響應狀態、鏈接頁面、具體的請求參數及返回結果;查看代碼執行堆棧的詳細樹狀信息,包括每個方法的計算時間、總耗時和被調用的次數,您能直接看到特殊標識的最慢方法;查看涉及SQL語句的總耗時排序,包括SQL執行總耗時、執行次數和具體的查詢語句;第三方API調用。

wKiom1Yp1-HzBLUlAADuE19PsIQ838.jpg

端到端性能監控示意圖


在性能方面,雲智慧透視寶的JavaAgent代碼監控探針包,對用戶的性能影響到底有多大?從安裝包本身來看,它非常小,僅爲1.5M。在不安裝Java探針包和安裝Java探針包,分別運行應用。經過測試對比,CPU使用率差值、內存消耗差值、TPS差值均在5%以內。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章