首先,只是一点背景:
我们的一位客户在运行我们的 Web 应用程序之一的 WebSphere 实例时遇到 CPU 使用高峰(具有其他应用程序的其他实例很好)。他们有一个测试环境和一个实时环境(都是 iSeries),它们都遇到了问题 - 每个实例设置一个应用程序。我们已经在我们自己的测试环境中本地部署了这个应用程序,也为许多其他客户部署在 iSeries 上,没有类似的问题。
实际发生了什么:
每隔一秒左右,WebSphere 进程的 CPU 使用率就会跳到任何地方7%
——20%
即使当时没有正在处理的请求。客户报告看到峰值高达30%
. 当空闲时,这些峰值平均是1.5%
CPU 的整体(通常使用的其他 WebSphere 实例0%
) 。0.1%
到目前为止我的调查
所以,我看了一下线程。测试环境中的一个线程~350
每秒使用 CPU 周期。他们实时环境中的一个类似线程~1500
每秒使用 CPU 周期(表明它具有更大的 CPU)。这些线程的调用堆栈看起来像
Type Program Statement Procedure
QLESPI QSYS 17 LE_Create_Thread2__FP12crtt >
QJVALIBJVM QSYS 7 startThread__FPv
J com/ibm/ws/util/Threa > run
J com/ibm/ws/util/Threa > run
J com/ibm/ws/util/Threa > getTask
J com/ibm/ws/util/Bound > poll
底线的整个班级名称是com/ibm/ws/util/BoundedBuffer
. 我让客户为我做一个 JVM Dump——我从中得到的唯一额外信息是线程名称:
Thread: 00002F82 Deferrable Alarm : 11
现在我的问题:
- 鉴于这些症状,你们中的任何人都能找出问题所在吗?(也许这是一个长镜头!)
- 是什么
Deferrable Alarm
?从 JVM Dump 中,我可以看到 4 个具有此名称的线程。其他三个似乎做得很好。通过调试我的本地 WebSphere(在 Windows 上)并在类中添加断点BoundedBuffer
,我看到BoudedBuffer
s 正在轮询并定期调用一些侦听器。 - 我无权访问客户机器的 WebSphere 控制台,他们也不承认对配置进行了任何更改。不过,我可以让他们帮我检查控制台——我应该让他们看什么?
- 我可以通过 telnet 访问客户邮箱,这里还有什么可以调查的吗?查看 WebSphere 配置文件等?我应该查看哪些文件?
- 因为调用堆栈和 JVM 转储没有显式引用我们的代码,所以假设这是一个配置问题是否安全?
这是一个很长的问题,所以感谢您阅读本文。
4 月 30 日更新 (1)
今天早上我注意到这种行为只发生在当天的第一个请求被处理之后(无论调用哪个 Web 服务)。这将手指指向我们的应用程序或 Apache Axis。难道这只是正常的行为?!
4 月 30 日更新 (2)
因此,这种 CPU 活动似乎是 Web 容器的某种内务活动,或者可能是 Apache Axis 中的某种活动。我现在观察到这种情况发生在几个不同服务器上的几个不同 Web 应用程序上。没有 Web 组件的应用程序不会遭受同样的额外 CPU 开销。
我想如果它是家务工作,那么“调整”它可能会适得其反——我的意思是,让 App Server 更好地空闲可能会对它可以做的“实际”工作量产生负面影响。