Java 平台企业修订版应用程序中的挂起线程
WebSphere® Application Server 会监视线程活动,当某一线程处于不活动状态时,它就会执行诊断操作。
当 WebSphere 检测到线程处于活动状态的时间超过了线程监视器阈值所定义的时间时,应用程序服务器将执行以下操作:
- 在 WebSphere Application Server 日志中记录一条警告,指出被挂起线程的名称及其已处于活动状态的时间。以下消息将写入日志:
其中:threadname 是 JVM 线程转储中出现的名称,hangtime 给出线程已活动时间的近似值,而 totalthreads 给出系统线程的总估计。WSVR0605W: 线程 threadname 处于活动状态的时间已达到 hangtime,可能已被挂起。服务器中总共有 totalthreads 个线程可能挂起。
- 发出 Java™ 管理扩展 (JMX) 通知。此通知启用第三方工具以获取事件并采取适当的操作,例如触发服务器的 JVM 线程转储,或者发出电子页面或电子邮件。以下 JMX 通知事件是在 com.ibm.websphere.management.NotificationConstants 类中定义的:
- TYPE_THREAD_MONITOR_THREAD_HUNG 此事件由(潜在)挂起线程的检测触发。
- TYPE_THREAD_MONITOR_THREAD_CLEAR 如果先前报告为挂起的线程完成其工作,那么此事件触发。有关更多信息,请查看有关错误警报的章节。
- 触发性能监视基础结构 (PMI) 数据计数器中的更改。这些 PMI 数据计数器由各种工具(例如 Tivoli® Performance Viewer)用于提供性能分析。
- 触发性能监视基础结构 (PMI) 数据计数器中的更改。这些 PMI 数据计数器由各种工具(例如,Tivoli Performance Viewer)用于提供性能分析。
错误警报
如果工作实际完成,那么产生第二组消息、通知和 PMI 事件以识别错误警报。以下消息将写入日志:
WSVR0606W: 先前已报告线程 threadname 被挂起,但是已经完成了。它已活动了约 hangtime。服务器中总共还有 totalthreads 个线程可能挂起。
其中 threadname 是 JVM 线程转储中出现的名称,hangtime 给出线程已活动时间的近似值,而 totalthreads 给出系统线程的总估计。挂起时间阈值的自动调整
如果线程监视器确定发出了过多错误警报(由挂起和清除消息对数确定),那么它可以自动调整阈值。当进行此调整时,会将以下消息写入日志中:
WSVR0607W: 错误报告了过多线程挂起。挂起阈值现在设置为 thresholdtime。
其中:thresholdtime 是线程被认为挂起前它可以活动的时间(以秒计)。您可以阻止 WebSphere Application Server 自动调整挂起时间阈值。请参阅配置挂起检测策略
系统警报
应用程序服务器监视在其上执行系统警报的线程的活动。当系统警报线程处于活动状态的时间超过了警报线程监视器阈值所定义的时间时,应用程序服务器将在系统日志中记录以下警告:此消息指示未响应的线程的名词、线程已处于活动状态的时间长度、线程的异常堆栈(用于标识系统组件)。
UTLS0008W: 警报线程 threadname 处于活动状态的时间已达到 n
毫秒,可能已被挂起。totalthreadsthreadstack
在此消息中,threadname 是 JVM 线程转储中出现的名称,n 是线程已活动时间长度的近似值,totalthreads 是系统线程的总估计,而 threadstack 是线程的异常堆栈。
如果警报工作最终完成,那么会将以下消息写入到系统日志中。此消息指示生成了错误警报的线程。
UTLS0009W: 警报线程 threadname 之前已报告为挂起,但是
已完成。它已活动了约 n 毫秒。
在此消息中,threadname 是 JVM 线程转储中出现的名称,而 n 是线程已活动时间长度的近似值。
通常,系统警报不会处理重负载,因为此类活动可能拖慢之后系统警报的处理,这继而又可能影响服务器行为。UTLS0008W 消息用于帮助 IBM 支持人员调查系统警报行为可能导致的问题。
所有系统警报共享一个公共警报线程池。可使用管理控制台来调整用于管理对此线程池进行监视的属性。可以通过调整警报线程监视检查间隔或阈值来降低 WebSphere 生成警报挂起线程消息的频率。请参阅主题配置挂起的检测策略以了解有关如何更改这些设置的描述。