WebSphere 应用程序挂起

WebSphere Application Hang

如果 WebSphere 应用程序在 z/OS 上挂起,应采取哪些步骤来查找原因?

到目前为止,我进行了堆转储、Java 核心转储和系统转储。

None 个线程处于死锁状态,没有内存问题,线程似乎也不多。 (只有 ~50,这很正常。)

整个应用程序无法访问。我的意思是,任何连接到它的网页的尝试都会挂起并超时。

这会导致什么?我正在考虑高 CPU 事件,但不确定如何追溯检查。

我收到与此类似的错误消息 30 次。

BBOO0221W: WSVR0605W: Thread "WebSphere WLM Dispatch Thread t=008b74f8" (00000075) has been active for 720962 milliseconds and may be hung.  There is/are 30 thread(s) in total in the server that may be hung.
at sun.reflect.GeneratedMethodAccessor617.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:611)
    at com.sun.faces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:126)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:72)
    at javax.faces.component.UICommand.broadcast(UICommand.java:312)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:267)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:381)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:75)
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:90)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1230)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:779)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:136)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:97)
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:97)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
(truncated)

"hung"线程本身似乎没有任何真正的模式,它们只是正常的activity,不应该挂起。

应用程序没有响应,因为您的所有调度线程(显然是 30 个)都已占用。新请求只是堆积在 WLM 队列中,直到触发超时。 WAS z/OS 中的调度超时最终会异常终止服务区域,WLM 将启动一个新服务区域(除非您已关闭超时)。 z/OS 上有一篇关于 WAS 超时管理的好文章:http://www-03.ibm.com/support/techdocs/atsmastr.nsf/WebIndex/WP102510

不幸的是,这仍然不能解释为什么它会卡在第一位。

z/OS 的最佳功能之一是诊断功能 - 您永远不必猜测...几乎总是可以准确地找出正在发生的事情。

就个人而言,我将从您的系统转储和 IPCS 开始。当然,现在这是一项非常罕见的技能,所以如果这不是你的事,第一步可能是找一个有良好转储阅读能力的人。如果你完全卡住了,这里有一个很好的介绍 here

首先确保您的转储具有您认为的内容...很大一部分系统转储最终包括错误的地址 spaces 或错误的数据区域,这些几乎都是无用。如果您处于这种情况,是时候准确设计您想要的转储选项,以便在下次出现问题时捕获您需要的内容。

通过使用 WebSphere IPCS 转储格式化程序,您可以很好地了解 WebSphere 内部发生的事情 - 概述是 here

在 WebSphere 地址 space(s) 中,将有许多线程,这些线程将具有 z/OS 个 TCB(任务控制块)。检查每一个最后的 TCB(在 IPCS 中,SUMM FORMAT 命令或等效命令)并了解它是 运行(可能循环)还是等待。我敢打赌,线程正在等待某事或其他……锁、外部信号、对 DB2 的调用、某些供应商软件等——一个好的目标是列出所有线程以及每个线程的确切内容一个正在等待。

大体上,找到等待原因是通过 TCB/RB 结构在等待时找到 PSW 和寄存器...这会告诉您正在等待的模块,您很可能可以从这里弄清楚发生了什么。

如果在您进行转储之前系统没有挂起很长时间,您还可以检查系统跟踪 table。它会给你地址 space 一直在做什么的历史,尽管如果时间很长,那里可能没有太多数据。

此外,由于 WebSphere 是一个巨大的 UNIX 服务应用程序,如果您的转储中有 OMVSDATA,请不要忘记查看它。

不要忘记,您始终可以寻求 IBM 支持 - 您在 WebSphere 等软件上花费了大量资金,因此请他们解释发生了什么当然是更好的主意之一。

祝你好运!