IBM相关JVM诊断工具

本文主要讨论IBM相关JVM诊断工具的使用,并结合具体应用给出示例。

随着信息技术的不断发展,计算机在各行各业得到越来越广泛的应用,应用系统结构也越来越复杂和庞大,系统的性能问题已经成了系统发挥效率的关键所在,通常处理这些问题都是软件开发人员根据其以往的开发经验,设计的好坏受人为因素影响很大,且方案因人而异。一般来说,一个系统存在瓶颈是必然的,不可能完全消除,但是合理的进行瓶颈定位,并对性能进行优化将能极大的提高系统的效率。

Java由于其具有跨平台的先天优势,以及对Web的良好支持,在分布式应用尤其是异构环境中成为首选,因此目前基于J2EE的应用与基于微软.net平台(和windows的近亲关系、及其集百家之长的特性决定了其优势)的应用已形成二分天下之势,其他语言或者平台的应用相对较少,大部分只能在两大阵营中漏下的市场中分得一杯羹。本节并不打算讨论哪种语言或者平台孰优孰劣,技术的发展日新月异,谁也不能保证是最后的王者。本节主要介绍IBM提供的相关Java诊断工具的用法:

在IBM官方网站上,我们找到了如下表所示的J2EE诊断工具,严格来说它们是JVM工具,IBM也是这样归类的,包括但不限于对Websphere服务器的性能诊断:

构件类型

问题类型

典型输入

可用的工具

Verbose Garbage Collection 日志 (verbosegGC)

· 内存泄漏

· 内存不足情况

· 诸如 native_stdout.log 等 JVM 日志文件中的 verbosegc 语句

1. IBM Monitoring and Diagnostic Tools for Java - Garbage Collection and Memory Visualizer (GCMV)

2. IBM Pattern Modeling and Analysis Tool for Java Garbage Collector (PMAT)

3. Diagnostic Tool for Java Garbage Collector

Java 转储/javacore

· 崩溃、挂起、性能瓶颈、JVM 意外终止

· javacore.*.txt

· javacorePID.*.txt

4. IBM Thread and Monitor Dump Analyzer (TMDA)

5. Thread Analyzer

线程

· 锁分析

· 到运行的 JVM 的连接

6. IBM Lock Analyzer for Java

堆转储

· 内存泄漏

· 内存不足情况

· IBM 可移植堆转储 (heapdump.phd)

· IBM 文本堆转储 (heapdump.txt)

· HPROF 堆转储格式 (hprof.txt)

7. Memory Dump Diagnostic For Java (MDD4J)

8. HeapAnalyzer

9. Heaproots

系统或核心转储

· 系统状况的一般分析;检测异常;系统状态的深入分析。

· 特殊情况:意外崩溃。

· 文件名:与操作系统相关(示例包括 core.dmp、user.dmp 或者只是“core”)。

· 在将该文件用作分析的输入之前,必须使用 jextract 工具处理该文件,从而产生 core.dmp.zip 文件(IBM JVM 5.0 及更高版本)或 core.sdff 文件 (IBM JVM 1.4.2)。

· 注意:仅适用于 IBM JVM。

IBM Monitoring and Diagnostic Tools for Java - Dump Analyzer及其在WebSphere Application Server modules for Dump Analyzer中的扩展

表一:IBM常用JVM诊断工具

虽然网上提供了各种工具的单独下载,但是笔者建议采用IBM Support Assistant(目前的最新版本是V4.1),它是IBM提供的一款免费的桌面应用程序,集成了包括工具在内的所有功能,可简化 IBM 软件的故障诊断工作(通过自助方式或在技术支持协助下进行),IBM Support Assistant 提供了四个重要功能,用于进行自助故障诊断或利用 IBM 支持流程:

  • 搜索 (Search):IBM 支持信息包含在 IBM“知识天堂”的多个位置。有时候,已经提供了关于某个问题或操作问题的回答,但尚不能访问。IBM Support Assistant 搜索组件提供简单易用的界面,可搜索很多不同的知识库,从而能更方便地找到所需要的信息。
  • 产品信息 (Product information):通过此组件,可快速访问您所感兴趣的 IBM 产品的支持资源。所列出的支持资源由 IBM 支持团队亲手挑选,可作为提高技术和进行故障诊断的信息工具使用。
  • 工具 (Tools):IBM Support Assistant 还提供了用于访问多个免费故障诊断和诊断工具的框架。这些工具不仅能帮助您使用 IBM 产品,还能够帮助您处理自己的应用程序。
  • 服务 (Service):此组件可帮助您在与 IBM 支持交互时利用其支持流程。

下面介绍如何获得IBM Support Assistant帮助:

1、 进入IBM下载页面http://www-01.ibm.com/software/support/isa/

 

2、 点击“Download”进入下载页面:

3、 这里提供了Serviceability Workbench和Enterprise Solution两个版本的下载,其中后者提供了远程问题收集解决功能,这里我们选择Serviceability Workbench,点击“Download”进入下载页面(注意IBM需要提供一个IBM帐号进行登陆,没有帐号可以在线注册):

4、 目前V4.1版提供了Linux 和Windows两个版本的下载,请根据需要选择,这里我们选择Win32版本的,选择isa.wb.410-win32.zip下载:

5、 下载到本地后解压,文件如下:

6、 运行setupwin32.exe

就可以开始安装了(注:IBM Support Assistant以及后面的相关工具是采用纯Java编写的,需要Java运行时环境支持,请确保机器上已预装JRE,经验证V4.1支持Java5.0及以上版本),安装成功后,首次运行的IBM Support Assistant面板如下,下次启动可以选择“启动活动”标签,选择相关功能即可:

 

7、 在以上的“主页”标签页中可以直观的看到,IBM Support Assistant提供了以下三个主要功能:

查找信息:轻松查找您需要的信息,包括特定于产品的信息和搜索功能;

分析问题:通过可维护性工具、一组诊断工件和通过问题确定提供的指导来诊断和分析问题;

收集和发送数据:使用自动数据收集来收集问题确定文件。使用这些文件进行自助问题确定,或者使用“服务请求”功能将这些文件随服务请求一起发送给 IBM。

8、 本节并不打算详细的介绍IBM Support Assistant的使用,更详细的信息请参考ibm.com 主页及支持主页的链接,下面主要介绍怎样获得最新的IBM工具以及如何使用。从检索工具开始,以工具“IBM Thread and Monitor Dump Analyzer”为例,IBM Support Assistant支持两种方式进行检索,第一种是直接通过“查找信息”来检索:

这种方式检索出了IBM和搜索词“IBM Thread and Monitor Dump Analyzer”相关的所有资源,当然也包括相关的文档以及Demo,笔者不建议使用这种方式,在列出的大量信息中查找工具是件极费时的事情,若是只检索工具可以采用如下方式,在面板中选择 更新–->查找新的...-->工具加载项(若是已经下载过工具,可以选择“查找对加载项的更新”选项,若是要对已下载的工具进行其他管理可选择“管理已安装的加载项”),将会列出目前IBM提供的所有工具:

9、 搜索到的工具如下:

10、 选择需要的工具“IBM Thread and Monitor Dump Analyzer”,下一步:

11、 下一步,选择“接受许可协议”:

12、 点击“完成”,开始安装工具到本地:

13、 点击“完成”,完成安装,其他工具的安装步骤和以上步骤类似。(需要重启IBM Support Assistant工作台):

14、 选择“分析问题”,找到我们刚刚安装的工具:

 

15、 在工具列表中选择“IBM Thread and Monitor Dump Analyzer”,可以看到描述里给出了该工具的简单介绍:“IBM Thread and Monitor Dump Analyzer for Java allows identification of hangs, deadlocks, resource contention, and bottlenecks in Java threads. This tool is a tech preview.”单击“启动”按钮,启动后的“IBM Thread and Monitor Dump Analyzer”工具如下:

实际上,工具都是以Java Application的方式运行的,如果不通过IBM Support Assistant工作台启动,可以直接在命令行采用”java –jar –jca37.jar”命令运行,效果是一样的。

 

16、 要分析问题,我们需要获得系统某个状态时的内存信息(一般会是系统即将宕机或者系统服务性能下降的情况),也就是内存转储或者java堆转储,以HP-UX为例(注意:Websphere在该系统上使用IBM java虚拟机才支持自动转储,这里我们采用手动转储,在IBM官方网站中有这样的描述:生成堆转储时会严重影响 WebSphere Application Server 的性能,请确定你确实需要这样做来找出问题),通过调用generateHeapDump来手动生成堆转储,输出文件:native_stdout.log。

这里介绍IBM Websphere的手动生成方式:

启动 wsadmin 脚本客户机。 要运行脚本命令,您有多个选项,这些选项包括以交互方式运行脚本命令以及在概要文件中运行脚本命令。例如,对 JVM MBean 调用 generateHeapDump 操作

查找 JVM objectName:

<wsadmin> set objectName [$AdminControl queryNames

WebSphere:type=JVM,process=<servername>,node=<nodename>,*]

对 JVM MBean 调用 generateHeapDump 操作:

<wsadmin> $AdminControl invoke $objectName generateHeapDump

其中:

$

是使用其值替换变量名的 Jacl 运算符

invoke

是命令

generateHeapDump

是要调用的操作

<servername>

是服务器的名称,将在该服务器上生成堆转储

<nodename>

是 <servername> 所属的节点

这样是从Websphere生成内存转储,而不是直接java内存转储,使用工具时请注意工具所支持的文件格式(参考表一)。

17、 故障诊断与定位,使用“IBM Thread and Monitor Dump Analyzer”打开java堆转储日志文件native_stdout.log,该工具支持Thread 和 Monitor两种模式查看,在某个项目中,我们发现了存在大量的进程等待,如下图:

 

18、 结论:经过分析,绝大多数的等待发生在同一个地方:ArrayList,难道是List()存在问题,继续跟踪,发现都这些等待都使用的是RMI方式通信,不难想象,是某种远程调用,而问题表现的恰恰是因为大量的远程调用中出现了线程等待,结合该项目的特点,我们发现,该项目的部署方式为,WEB模块+EJB模块,而两者分开部署,虽然这种方式更适合分布式的应用。问题就出在这,调用EJB时采用了大量的远程接口调用,根据EJB规范,远程调用时对象的传递需要进行序列化,正是这种序列化造成了大量的等待。

19、 建议:根据以上分析,我们找出了影响其性能的一个主要原因,WEB模块与企业逻辑EJB之间的通信存在问题,EJB2.0为了提高性能开始支持Local方式的EJB,但是LocalEJB和RemoteEJB的实现方式和调用方式都是不一样的(配置也不一样,可以通过程序自适应),RemoteEJB是通过RMI方式调用的,对象传递需要序列化,而LocalEJB是通过对象引用传递的,没有序列化,性能会高很多。所以针对该问题,建议尽量调用EJB的本地接口。该诊断最终获得客户认可,对系统的重新优化后,性能有了明显提高。

20、 以上仅仅从工具方面分析了项目中可能遇到的瓶颈问题,实际上,正如前面所说,一个完全不存在瓶颈的系统是不存在的,在这个项目中,我们实际上还发现了其他问题:比如配置的问题,对应用服务器、数据库的配置问题;另外,针对数据库的SGA命中率低的问题,我们给出了一些SQL的优化建议,这些都得到了客户的认可。

相关推荐