幹貨 | 雲智慧透視寶Java代碼性能監控實現原理
這篇圖文並茂,高端大氣上檔次,思維縝密的文章,一看就和我平時的風格不同。對了。這不是我寫的,是我家高大英俊,寫一手好代碼,炒一手好菜的男神架構師老公的大作,曾發表於技術公號,經本人授權轉載,如有技術問題,我代為請他本人解答~~
一、Java平臺體系及應用場景
從1995年Sun Microsystems公司正式推出Java,到2006年時Sun公司將其開源,迄今為止已經有了20年的歷史。Java本身已不僅僅只是一門面向對象的編程語言,而是由一系列計算機軟件和規範形成的技術體系,這個技術體系提供了完整的跨平臺開發與部署的支持,實現“一次編寫、到處運行”的目的。Java已經廣泛的應用於嵌入式、移動終端、企業服務器、大型機等各種場合。
Sun官方所定義的Java技術體系包括如下幾個組成部分:
* Java程序設計語言
* 各種硬件平臺上的Java虛擬機
* Class文件格式
* 來自商業機構和開源社區的第三方Java類庫
圖: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監控實現原理
圖:Java的執行模型
在Java的執行體系中,由.Java源碼文件編譯後的.class字節碼文件,可以理解為中間語言。
圖:透視寶Java監控實現原理
圖:透視寶Java監控實例運行圖
1、字節碼load至JVM時發生了什麽
* 回調函數註冊完畢後,凡是當有任何的class文件即將被類加載器加載前,都
會執行回調函數transform,在此方法內實現的類改變操作。
* 實現的transform方法中,我們使用的是ASM字節碼操作框架,ASM從二進制
形式的類文件中讀取、分析類的信息,然後修改改變類的行為。
* transform方法的基本代碼形式如下:
2、如何實際改變類行為
* 在依賴於ASM基礎之上,我們抽象出這樣的業務模型
* 常用的攔截探針
* 常用的運行時攔截處理器
* 支持的攔截定義過濾器規則
* 該業務模型對應的行為
定義攔截描述時,指定過濾攔截哪些類、哪些方法,然後,在這些行為的點上,可以埋入探針、處理器。重寫visitCode、visitInsn、visitMaxs分別實現方法進入、返回、異常的相關操作改寫。
四、透視寶Java監控部署流程
1、登錄雲智慧透視寶官網,點擊頁面右上角導航的“免費試用”,正確填寫免費試用的申請信息後會彈出下面的對話框,同時激活郵件會自動發送到你的郵箱中,按照流程註冊帳號即可。
2、註冊成功後,登錄透視寶,點擊配置-應用,在配置頁面中下載安裝Smart Agent。安裝成功後,Smart Agent會根據系統配置自動獲取主機信息,大致兩分鐘後,您就可以在“主機→服務器”模塊中查看該服務器的CPU、內存、網卡、磁盤及進程等性能數據。
3、如果要監控應用運行時代碼、主機中服務和數據庫性能數據,您需要進一步安裝和配置Smart Agent提供的各種插件,這是因為Smart Agent實現了一種開放式的插件式結構,對每個運行時代碼、服務和數據庫的監控都是通過相應的插件來實現的。
Smart Agent在安裝完成後,加載過程中自動發現你的應用組件,如果沒有自動監測到Java環境,也可以手動添加Java Agent。如上圖所示,點擊“管理”入口,進入“插件管理”,點擊頁面下部的“添加服務”,選擇JavaAgent後,點擊“創建”。
創建完畢後,點擊“ON”。(該ON操作只是初始化用戶的信息,以便以後采集到的信息能夠正確的回傳給該用戶。)
以上都操作完後,在{smartagent的安裝路徑}/plugins,就會看到如下形式的
在到{smartagent的安裝路徑}/plugins/JavaAgent_1442476463X1002x0/conf文件夾下,查看app.conf文件,看看該文件內的HostKey的值是否是如下類似的加密形式
以上情況,表明JavaAgent已經下載啟動初始化成功。
4、安裝JavaAgent至各種應用服務器上,如tomcat\jboss\weblogic。(該操作參考官網https://www.toushibao.com/即可)
5、只要啟動相應服務器,然後訪問您的應用url即可,該url對用的代碼執行情況即可呈現給您,一旦出現緩慢問題也一目了然。如下圖示意
五、透視寶Java代碼性能監控特點
在功能方面,透視寶無論是在Java,還是其他如.NET、PHP等主流語言的監控上,都包括:查看執行最慢的10個元素,包括元素執行次數、持續時長和占用時長百分比;查看HTTP請求參數,包括請求的響應狀態、鏈接頁面、具體的請求參數及返回結果;查看代碼執行堆棧的詳細樹狀信息,包括每個方法的計算時間、總耗時和被調用的次數,您能直接看到特殊標識的最慢方法;查看涉及SQL語句的總耗時排序,包括SQL執行總耗時、執行次數和具體的查詢語句;第三方API調用。
端到端性能監控示意圖
在性能方面,雲智慧透視寶的JavaAgent代碼監控探針包,對用戶的性能影響到底有多大?從安裝包本身來看,它非常小,僅為1.5M。在不安裝Java探針包和安裝Java探針包,分別運行應用。經過測試對比,CPU使用率差值、內存消耗差值、TPS差值均在5%以內。
幹貨 | 雲智慧透視寶Java代碼性能監控實現原理