在 WebSphere Application Server V6.1 应用程序中跟踪死锁

学习如何使用 IBM® WebSphere® Application Server V6.1 中的线程转储工具了解您的系统环境,检查是否发生死锁以及提取信息来帮助避免或解决自己应用程序的死锁情况。

引言

当两个或多个线程彼此形成循环依赖关系时,就出现了死锁。例如,如果线程 A 处于等待线程 B 的等待状态,而同时线程 B 处于等待线程 A 的等待状态,则出现了死锁。一旦形成此情况,线程 A 和线程 B 都不能有任何进展,因为这两个线程现在都无限期地挂起了。为什么会有人创建这种系统?当然,您并不会有意这么做,但由于存在大量线程和复杂事务,因此很容易出现这种情况。

本文将介绍如何使用 IBM WebSphere Application Server V6.1 的线程转储工具来对系统进行检查,以确定是否出现了死锁。为了帮助理解,文中引用和描述了一个真实的示例。在此示例中,企业应用程序在 Web 容器中运行,而 OSGi 包提供对协议的访问。当通信流量突然上升到足够的程度时,在服务器上运行的应用程序将挂起,而且情况极为严重,唯一能够执行的任务就是发出 kill -9 命令来终止进程。本文将介绍如何发现这个典型的死锁情况并加以解决,其中涉及的方法可用于避免或调试您应用程序中类似的条件。





回页首


问题

在很多协议中,使用了状态机来管理每个协议连接的状态。这些状态机有时候称为连接有限状态机(Connection Finite State Machines,CFSM)。状态机需要原子操作。这意味着无法在不同的时间对状态机的不同部分进行更新;出现更新时,必须在该操作中对整个状态机进行更新,因此下一个操作应用到新状态,以此类推。为了达到这样的方式,状态机要设计为任何时间只有一个线程能够对状态机执行操作。对状态机的访问方法全部是同步的。希望访问状态机的线程在当前访问状态机的线程完成方法调用前将被阻塞。

在此类示例协议中,任何时间收到、传输数据包或操作超时,都会更改状态。其他条件(如启动、停止和断开连接)也会导致状态机发生变化。状态机的这些输入使其成为了搜索的高风险区,特别是任意数量的线程都可能导致这些事件发生的情况下更是如此。

首次在此应用程序中出现这个问题时,应用服务器锁定情况非常严重,没有出现日志记录,甚至控制台都不能打开。实际上,WebSphere Application Server 进程没有 TCP 通信流量进出。这是死锁的典型症状。CPU 利用率为零,未发生任何事件,也没有请求被接收。唯一可用于进行调试的工具是 WebSphere Application Server 进程的线程转储。

线程转储(或核心文件)是采用以下格式的名称生成的:

javacore.date.time.id.txt

例如: javacore.20070919.204717.27050.txt

在有些情况下,会自动为 Java™ Virtual Machine (JVM) 创建线程转储,如 WebSphere Application Server 由于普通 stopserver 请求之外的其他方式停止的情况。线程转储还可以通过向 WebSphere Application Server 进程发出信号来触发。例如,为了在 UNIX® 环境中生成线程转储,则可以运行此命令:

kill -3 process_id

其中 process_id 是 WebSphere Application Server JVM 的进程 ID。线程转储还可以使用 wsadmin 创建。为了使用 wsadmin 命令提示符强制进行线程转储,请发出以下命令:

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

这将在 was_profile_root 中创建类似于 javacore.20071012.080508.4252.txt 的文件。

打开线程转储时会看到以下内容:WebSphere Application Server 中每个单线程的堆栈跟踪。但更为重要的是,其中还列出了系统中的所有锁定。很好!





回页首


线程转储内容

线程转储是简单的文本文件,可以使用任何文本编辑器打开。您可以在其中找到大量有意义而且有用的信息,具体请参见后面的描述。

环境数据

转储首先提供的是关于 WebSphere Application Server 进程的运行环境的一些信息(清单 1).其中描述操作系统级别、JRE 级别、处理器数量等等。这些信息很不错,不过与死锁并非真的相关。


清单 1
				
NULL ------------------------------------------------------------------------
0SECTION TITLE subcomponent dump routine
NULL ===============================
1TISIGINFO Dump Event "user" (00004000) received
1TIDATETIME Date: 2007/09/19 at 20:47:17
1TIFILENAME Javacore filename:
/usr/IBM/WebSphere/AppServer/profiles/AppSrv01/javacore.20070919.204717.27050.txt
NULL ------------------------------------------------------------------------
0SECTION GPINFO subcomponent dump routine
NULL ================================
2XHOSLEVEL OS Level : AIX 5.3
2XHCPUS Processors -
3XHCPUARCH Architecture : ppc
3XHNUMCPUS How Many : 4
NULL
1XHERROR2 Register dump section only produced for SIGSEGV, SIGILL or SIGFPE.
NULL
NULL ------------------------------------------------------------------------
0SECTION ENVINFO subcomponent dump routine
NULL =================================
1CIJAVAVERSION J2RE 5.0 IBM J9 2.3 AIX ppc-32 build j9vmap3223-20070426
1CIVMVERSION VM build 20070420_12448_bHdSMR
1CIJITVERSION JIT enabled - 20070419_1806_r8
1CIRUNNINGAS Running as a standalone JVM

内存数据

您可能并不急需内存转储信息,不过可能会关心堆信息。清单 2 说明堆上有大量空间可用,这表明不存在内存泄漏——或者至少当前内存泄漏不是最棘手的问题。您可以看到,可用空间的量约占 1 G 总空间的四分之三。


清单 2



本文转自IBM Developerworks中国

      请点击此处查看全文


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值