近期某项目, 在客户方运行时经常莫名其妙的死机, 因此急需调查死机的原因以及尽可能的寻找解决办法.
分析此场景, 此系统是一个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到日志里.