`
jerome_wang
  • 浏览: 147599 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

IBM Support Assistant

    博客分类:
  • WAS
阅读更多


使用 IBM Support Assistant 进行快速的问题诊断

 

隋 鹏飞 (suipf@cn.ibm.com ), 软件工程师, IBM 软件开发中心
隋鹏飞 :目前在 IBM 中国软件开发中心主要从事 WebSphere Serviceability 系统测试相关工作。您可以通过 suipf@cn.ibm.com 与他联系。
王 亮 (wanglcdl@cn.ibm.com ), 软件工程师, IBM 软件开发中心
王亮:目前在 IBM 中国软件开发中心主要从事 WebSphere Application Server 系统测试相关工作。您可以通过 wanglcdl@cn.ibm.com 与他联系。

简介:  本文介绍了IBM Support Assistant(ISA)及其功能,并且通过示例说明了如何利用这个工具来快速诊断WebSphere Application Server使用过程中所遇到的问题。

<!-- <p class="ibm-no-print"> <div id="dw-tag-this" class="ibm-no-print"></div> <div id="interestShow" class="ibm-no-print"></div> </p> -->

发布日期:  2007 年 12 月 15 日
级别:  中级
访问情况  500 次浏览
建议:   <!-- Rating_Area_Begin --> <!-- Ensure that div id is based on input id and ends with -widget -->

<script type="text/javascript"> // &lt;![CDATA[ // widget div id and article id as args window.artRating.init('art-rating-widget'); // ]]&gt; </script><!-- Rating_Area_End -->
<!-- dW_Summary_Area_END --> <!-- CONTENT_BODY --> <!-- MAIN_COLUMN_BEGIN --> <!-- Related_Searches_Area_And_Overlays_Begin --> <!-- MAIN_COLUMN_CONTAINER_BEGIN --> <!-- MAIN_COLUMN_CONTENT_BEGIN -->

引言

IBM Support Assistant (ISA)是IBM为客户提供支持的重要工具,它旨在通过更快地解决产品问题来帮助客户更有效地使用 IBM产品。作为一个IBM产品的用户,如果你经常为一些突如其来的问题感到无所适从或者已经厌倦了在浩如烟海的网络世界中查找问题解决方案的话,不妨尝 试一下ISA这个快捷方便的工具平台。对于那些需要IBM直接提供支持的用户,ISA也可以帮助你快速提交问题报告并且自动地收集相关的诊断数据,从而加 速解决问题的过程。

ISA简介

IBM Support Assistant 是一个公共的工作台,它所服务的对象包括多种 IBM 产品,用户可以通过选择安装相应产品的插件,来获得其对该产品的支持。到目前为止,各种资源和工具正在持续不断的整合到ISA中,ISA也逐渐成为对 IBM产品进行故障诊断和获取资源的统一入口点。


ISA的安装与更新

首先,从http://www-306.ibm.com/software/support/isa/下载ISA的最新版 本-IBM Support Assistant and Electronic Service Agent,从3.1版本开始,ISA开始与Electronic Service Agent(电子服务代理ESA)的安装文件一起打包,后者用来向ESR(电子服务请求)系统提交问题报告。用户可以选择两者同时安装,也可以单独安装其 中的一个。安装完成后,启动ISA,其界面如下图所示:


图1. ISA欢迎界面
ISA欢迎界面

正如我们前面所提到的,刚刚装好的ISA仅仅是一个框架,并不能提供我们想要的功能,这一点和eclipse有些类似,用 户需要安装相应的产品插件和工具插件来扩展工作台的功能。这些工具将作为由 ISA管理的 Web 应用程序运行。关闭 ISA时,正在运行的工具也将关闭。在ISA中安装插件的过程很简单,您只需要在程序界面上方的菜单条里单击 “更新程序”,然后选择“新插件”,如下图所示,ISA当前所支持的所有的产品和工具都会显示在左边的插件列表里。这里我们选择“WebSphere ” -> “WebSphere Application Server V6.1” 及其工具插件“IBM Guided Activity Assistant”。此外,大多数IBM产品在进行故障诊断时都会用到“公共组件工具”里面的工具插件,因此也应当一起安装。安装完所有的组件,重新启 动ISA,可以在 “工具” -> “WebSphere Application Server V6.1” 下面查看我们刚刚装好的工具组件。


图2. 安装插件
安装插件

图3. 查看工具列表
查看工具列表


ISA的主要功能介绍

作为一个工具平台,ISA的主要用途是进行资源的整合和工具的集成,其功能主要包括如下五个部分:

1. 快速链接到相关的产品页面

安装好插件以后,单击“产品信息”->“WebSphere Application Server 6.1”,就会看到与WAS61产品相关的一系列产品信息。 包括产品主页、支持页面、新闻组和论坛、技能提高和故障诊断等几部分内容。客户可以从这里了解产品的基本信息,查看最新技术说明,获取各种技术文档和进行 在线培训等等。随着各种文档资源的整合更新,其包含的内容也在不断的变化。

2.“透明搜索”

ISA的“搜索”组件 提供了联合查询功能,用户可以快速地查询多个与支持相关的信息源,客户化的定制各种查询条件,比如文档的来源,产品的版本号等。在扩大搜索范围的同时进行 精确的查找,可以帮助用户更快更好地定位到所需的产品信息。

3.“工具”集成

问题定位和故障分析是一项非常复杂的工作,通常需要借助各种分析工具。虽然IBM的支持网站中提供了许多常用的工具,但对于用户来说,自己去发现和收集这 些工具可能会有一定的困难。ISA的工具集成模块以插件的形式收集了许多常用的工具,不仅为用户管理和维护工具提供了平台,还为不同工具之间进行交互提供 了方便。在ISA中,不同的分析工具可以通过插件互相调用,从而处理一些更为复杂的分析过程,许多分析工具正是利用这一点来实现诊断过程自动化的。

4.自动的基于症状的数据收集工 具

当用户决定向 IBM 提交问题时,一个比较麻烦的工作是如何收集 IBM Support 所需的各种信息,包括系统的配置信息,日志文件和追踪文件等。之前我们通常根据MustGather 文档的要求收集各种信息,现在数据收集工具可以辅助您自动完成这一过程。

ISA帮助收集数据的方式有两种:一种是在本机上收集系统环境和产品数据。收集过程中,收集器会要求您提供本地的产品安装 目录,因此这种方式只适用于ISA与所支持的产品安装在同一台物理机器的情况;另一种方式是创建可移植的收集器。这种方式首先生成一个生成可执行jar文 件,然后将其传送到目标服务器上去执行相应的收集过程。

5.“更新程序

正如我们前面所提到的,用户可以通过添加所需的产品和工具插件来定制ISA,而“更新程序”不仅能帮助客户获得许多新的工 具,也能帮助维护现有工具的版本更新,这其中也包括ISA本身。用户可以通过“更新程序”中的“已安装的插件” 选项卡查看已经安装的工具插件,如下图所示。要卸载这些组件,首先选中相应的工具插件,然后点击“卸载”按钮。


图4 查看已安装插件
查看工具列表


案例分析

接下来让我们看看如何使用ISA解决产品使用过程中所遇到的问题吧。这里我们使用一个死锁的案例,首先创建一个动态Web项目,在servlet locker中添加如 下代码 ,根据经验我们知道,两个互相嵌套的锁在并发条件下,发生死锁的机率很大。 这里我们只要用11个客户端对这个servlet加压,就会发现应用程序长时间失去反应。


源码 1. 死锁案例servlet源码

                package test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Servlet implementation class for Servlet: locker
 *
 * @web.servlet
 *   name="locker"
 *   display-name="locker" 
 *
 * @web.servlet-mapping
 *   url-pattern="/locker"
 *  
 */
 public class locker extends javax.servlet.http.HttpServlet 
 implements javax.servlet.Servlet {
    /* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#HttpServlet()
	 */
	 final static String locker1 = "Locker1";
	 final static String locker2 = "Locker2";
	public locker() {
		super();
	}   		
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request,
	 * HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		response.getWriter().println("dead_lock_test_page_start ---- ");
		synchronized (locker1) {
			      System.out.println("lock1_start->");
				   try {
			            Thread.sleep(50);
			          } catch (InterruptedException e) {
			          } // 点[1] --> 第40行  
			   synchronized (locker2) {
				  System.out.println("lock1_end");
			   }
			  }

		synchronized (locker2) {
			       System.out.println("lock2_start->");
				   try {
			            Thread.sleep(50);
			          } catch (InterruptedException e) {
			          } // 点[2] --> 第51行 
			   synchronized (locker1) {
				   System.out.println("lock2_end");
			   }
			  }
		response.getWriter().println(" ---- dead_lock_test_page_end");

	}  	  	  	    
}
      

 


从何处入手?

当遇到类似这样的问题时,我们应该从何处入手呢?

首先,用户可以通过ISA的搜索 页面搜索相关信息

如下图所示,ISA的“搜索”组件可以透明地搜索多个知识库,并将结果组合到一起。用户不仅可以选择从哪些知识库中查找信 息,也可以指定文档的类型、产品的版本号等,这样搜索的范围就会更具针对性,更容易找到所我们需要的信息。

根据搜索结果,我们可以对可能发生的问题有一个大概的了解,但还是没有办法确定具体的问题,这时,我们还需要借助各种诊断 工具进行诊断。


图5. 搜索相关信息
图5 搜索相关信息

借助诊断工具进行诊断

诊断工具是以工具插件的形式添加到 IBM Support Assistant 中的,使用“更新程序”可以获得各种工具插件。前面我们已经安装了“WebSphere Application Server V6.1” 相关的产品插件和工具插件,在没找到一个具体的解决方案和分析工具以前,我们可以从IBM Guided Activity Assistant (Tech Preview)工具开始。IGAA是一个帮助用户进行问题诊断的工具,它可以通过向导的方式辅助我们进行故障诊断,并在适当的时候调用相应的分析工具来 帮助我们分析收集到的诊断数据。关于IGAA更详细的信息请参考权威支持专栏文章 IBM Guided Activity Assistant 介绍


分析过程

首先我们打开IBM Guided Activity Assistant工具,其初始界面如下图所示:


图6. IGAA 初始界面
图6 IGAA 初始界面

在右上角的第一个向导页面中,选中“Troubleshoot a problem”,单击“Next”按钮,进入正式的诊断过程。每一个问题的诊断过程都会被保存为一个session。 这里,我们必须输入一个字符串作为session的名字。


图7. 创建session
图7 创建session

图8. 进行高级故障诊断
图8 进行高级故障诊断

接下来,在“Select an action”面板中选择“Perform advanced troubleshooting”进行高级故障诊断。进入下一页后,需要在问题分类列表中选择问题的类型,由于我们要诊断的问题更像是应用程序阻塞的问 题,所以选择“Troubleshoot Java hang problems”。当然,如果最终我们无法定位问题的话,系统还会提示我们重新选择问题的类型。


图9. 选择诊断类型
图9 选择诊断类型

图10. 选择诊断症状断
图10 选择诊断症状

在“Identify Primary Java Hang Symptoms”面板中,选择“Client applications are timing out waiting for a response”作为问题的特征描述。点击“next”按钮,可以看到问题症状的详细说明:

                
      Client applications, such as a web browser or Java client, that are timing out
      waiting for a response may be indications of a backend server hanging. 
      This may be indicated by the following symptoms: 
?	a blank page is displayed and the brower continues to spin waiting for
the response from the server
?	a generic HTTP 400 or 500 error (when a server sending a response to
the HTTP server hangs)
?	a specific HTTP 504 Gateway Timeout error 
?	A Java client may see CORBA NO_RESPONSE or CORBA.TRANSIENT errors.



图11. 诊断方法提示
图11 诊断方法提示

按照面板上的提示,我们每隔两分钟生成一次线程转储。这里我们用通过wsadmin命令进行创建:

wsadmin>set jvm [$AdminControl completeObjectName type=JVM,process=server1,*]

wsadmin>$AdminControl invoke $jvm dumpThreads

在 WebSphere Application Server 概要文件目录中查找名称类似 javacore.date.time.id.txt 的输出文件。点击“next”,在收集故障诊断数据文件面板中将线程转储文件添加到session中。


图12. 添加诊断数据文件
图12 添加诊断数据文件

接下来的两步中,分别选择“I collected the diagnostic data files, help me analyze them”、“ThreadAnalyzer is installed, analyze the javacore files”,单击“next”


图13. 调用诊断工具
图13 调用诊断工具

在“Analyze the Javacore Files Using ThreadAnalyzer”,单击"Launch ThreadAnalyzer Tool" ,启动线程分析工具分析我们刚刚添加的javacore 文件。分析结果如下图所示:


图14. 分析诊断结果
图14 分析诊断结果


查看分析结果

1.“Overall monitor analysis”分析结果显示, 线程“WebContainer : 3” 和 "WebContainer : 0" 之间发生了死锁,两个监控锁对象分别是java/lang/String@04811AD8/04811AE4和java/lang /String@04811A98/04811AA4,并且从“Servlet engine monitor analysis”的结果中还可以可以看到其它9个servlet线程也都在等待这两个锁对象,因此,可以确认由于线程“WebContainer : 3” 和 "WebContainer : 0" 的死锁,导致所有其他servlet线程也都处于等待状态,无法继续运行。


“Overall monitor analysis”分析结果

                
 Overall monitor analysis


Deadlock detected !!!


 Thread "WebContainer : 3" (0x153A8000)

   is waiting for:

     sys_mon_t:0x14ADA0E8 infl_mon_t: 0x14ADA128:

     java/lang/String@04811AD8/04811AE4: 

   which is owned by:

 Thread "WebContainer : 0" (0x1466A900)

   which is waiting for:

     sys_mon_t:0x14BB3ED0 infl_mon_t: 0x14BB3F10:

     java/lang/String@04811A98/04811AA4: 

   which is owned by:

 Thread "WebContainer : 3" (0x153A8000)
 

 

2.展开监控对象树,查看两个锁对象的详细信息,这些信息包括监控锁对象所在的类文件、方法和行号等,对照源代码我们可以很容易的从 locker.java类文件的第40行和第51行找到发生死锁的“loker1” 和 “loker2”。这样,我们就确定了发生死锁的具体位置。接下来的工作就是要分析线程状态,从而找到解决问题的方法。


锁对象java/lang/String@04811A98 /04811AA4 详细信息

                
==Monitor dump==

      Waiters....... 10
      
      .......
      .......
      
      Thread information:

      Thread type..................... Servlet handler

      name............................ WebContainer : 0

      thread id....................... 0x1466A900

      priority........................ 5

      state........................... B

   	Waiting on monitor................ java.lang.String@04811A98/04811AA4

      Waiting for web work............. no

      Executing web or local EJB work.. yes

      Waiting for remote orb work...... no

      Stack: 

         test.locker.doGet(locker.java:51)

         javax.servlet.http.HttpServlet.service(HttpServlet.java:743)

         javax.servlet.http.HttpServlet.service(HttpServlet.java:856)

         com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:966)

        .......
        .......
      
 



锁对象java/lang/String@04811AD8 /04811AE4 详细信息

                     
==Monitor dump==

   java.lang.String@04811AD8/04811AE4

      Waiters....... 1

    Thread information:

      Thread type..................... Servlet handler

      name............................ WebContainer : 3

      thread id....................... 0x153A8000

      priority........................ 5

      state........................... B

   	Waiting on monitor................ java.lang.String@04811AD8/04811AE4

      Waiting for web work............. no

      Executing web or local EJB work.. yes

      Waiting for remote orb work...... no

      Stack: 

         test.locker.doGet(locker.java:40)

         javax.servlet.http.HttpServlet.service(HttpServlet.java:743)

         javax.servlet.http.HttpServlet.service(HttpServlet.java:856)

         com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:966)

        .......
        .......
        
 

 


分析线程状态

发生死锁时,线程 WebContainer : 3 处于程序中点[1]的位置(见源码注释第40行),因此它已经获得了 “lock1”的监控锁并且正在等待 “lock2” 的监控锁;与此同时,线程 WebContainer : 0正处于程序中点[2]的位置(见源码注释第51行) 因此它已经获得了 “lock2”的监控锁并且正在等待“lock1”的监控锁。 由于同一时间只能有一个servlet线程获得对静态对象lock1和lock2的监控锁,导致两者都处于无限的等待状态中,这正是我们的应用程序中最怕 见到的状况。 要解决这一问题需要开发人员修改应用程序,采用更加合理的逻辑结构,从而避免上述状态的发生。


总结

到现在为止,我们使用ISA的搜索和诊断功能,轻松找到了相关问题的各种文档,并在自我帮助模式中实现了问题的定位。随着 ISA功能的不断完善,相信它会为我们解决问题提供更多的便利。

<!-- CMA ID: 277410 --> <!-- Site ID: 10 --> <!-- XSLT stylesheet used to transform this file: dw-article-6.0-beta.xsl -->
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics