?近期某項目, 在客戶方運行時經常莫名其妙的死機, 因此急需調查死機的原因以及盡可能的尋找解決辦法.
分析此場景, 此系統是一個Java的web系統, 使用到了EJB. 具體系統架構為:由客戶端訪問某Sun ONE Server, 系統的JSP、Servlet存在于此Sun ONE Server上, 然后Sun ONE Server上的Servlet或JavaBeans再訪問另一臺機器上的Weblogic上的EJB, 然后EJB通過DAO訪問三臺Oracle數據庫, 其中一臺Oracle數據庫中又被劃分為五個表空間, 因此在Weblogic上分別建立了七個Connection Pool以及對應的七個XA datasource. 此系統的EJB數量多達500+,?發布的J2EE應用程序以及web應用程序有200+,?總體來說, 整體結構比較復雜.
對于這樣一個系統, 要想分析一個無法再現的bug是非常不容易的, 這個也是這次具有挑戰性的地方.
首先, 我們打開了所有服務器上的日志輸出, 進而分析了所有的日志. 最后把問題定位在Weblogic連接數據庫的connection pool上. 但是在Weblogic 8.1上, 我們通過JDBC log得到的Connection Pool的信息非常有限, 那么如何能更多的得到數據庫連接的信息呢? 我們在網上發現了一個開源工具Hyperic-HQ協助我們很好地解決了這次問題.
關于Hyperic-HQ, 是一個GPL的開源產品, 可以協助我們分析在發布環境下的系統各個機能的狀態. 進而找到應用程序的問題.
要想使用Hyperic-HQ, 首先我們需要一臺Hyperic-HQ服務器, 可以用自己的PC機充當. 另外, 我們需要一臺數據庫服務器, 用來做Hyperic-HQ的數據倉庫. 我使用的是Hyperic-HQ 2.7.3版本, 這個版本支持Oracle和Postgresql作為Hyperic-HQ的后臺數據庫.
接下來, 我們從Hyperic-HQ的網站上下載Hyperic-HQ的安裝程序, 有很多版本. 一般地, 根據操作系統不同不同, 另外, 有含有JRE和非JRE的, 以及agent和installer區分. 我們第一次安裝的時候, 因為要安裝Hyperic-HQ服務器, 所以應該下載installer版本.
下載后我們在某個目錄下解壓縮, 目錄內容如圖所示.
然后我們運行setup程序, 安裝Hyperic-HQ服務器, 安裝過程中, 需要指定Hyperic-HQ服務器的后臺數據庫的信息. 一步步直到安裝完成. 安裝好后, 會有一段文字提示Hyperic-HQ服務器的運行以及訪問地址, 包括默認的賬號.
Hyperic-HQ服務器的默認訪問地址是http://localhost:7080
默認賬號是 hqadmin/hqadmin
安裝好Hyperic-HQ服務器后, 我們需要在被監視的服務器上安裝Hyperic-HQ的agent. 你可以單獨下載agent, 如果你已經下載了installer, 那么它里面就包含了agent. 和上述過程同樣, 依照提示一步一步安裝agent. 安裝agent的過程非常簡單.
全部準備完畢后, 就可以開始監視有問題的服務器了.
首先啟動Hyperic-HQ服務器, 啟動方法是運行hq-server.exe.
啟動后, 我們可以訪問Hyperic-HQ服務器的web頁面, 登錄后應該是沒有什么可用信息, 這是因為我們還未啟動任何agent.
現在就讓我們來啟動Hyperic-HQ服務器的agent. 在啟動agent的時候我們必須指定一些信息, 其中主要包括agent如何和Hyperic-HQ服務器通訊的信息.

此時, 我們再登錄Hyperic-HQ服務器的web頁面就可以看到agent管理的服務器上的資源.
然后我們在web頁面上就可以通過一些配置來配置我們所感興趣的資源. Hyperic agent就可以從被監視的服務器上定時取下我們配置的資源, 通過Hyperic-HQ服務器顯示在web頁面上. 當然也可以log到日志里.

