5

首先,只是一点背景:

我们的一位客户在运行我们的 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,我看到BoudedBuffers 正在轮询并定期调用一些侦听器。
  • 我无权访问客户机器的 WebSphere 控制台,他们也不承认对配置进行了任何更改。不过,我可以让他们帮我检查控制台——我应该让他们看什么?
  • 我可以通过 telnet 访问客户邮箱,这里还有什么可以调查的吗?查看 WebSphere 配置文件等?我应该查看哪些文件?
  • 因为调用堆栈和 JVM 转储没有显式引用我们的代码,所以假设这是一个配置问题是否安全?

这是一个很长的问题,所以感谢您阅读本文。

4 月 30 日更新 (1)

今天早上我注意到这种行为只发生在当天的第一个请求被处理之后(无论调用哪个 Web 服务)。这将手指指向我们的应用程序或 Apache Axis。难道这只是正常的行为?!

4 月 30 日更新 (2)

因此,这种 CPU 活动似乎是 Web 容器的某种内务活动,或者可能是 Apache Axis 中的某种活动。我现在观察到这种情况发生在几个不同服务器上的几个不同 Web 应用程序上。没有 Web 组件的应用程序不会遭受同样的额外 CPU 开销。

我想如果它是家务工作,那么“调整”它可能会适得其反——我的意思是,让 App Server 更好地空闲可能会对它可以做的“实际”工作量产生负面影响。

4

7 回答 7

1

我建议遵循 IBM 提供的必须收集的文档,并在您自己的调查中提出 PMR。你可能怀疑的事情:

  • 垃圾收集(不太可能在应用程序利用率低的情况下)
  • 定时器或任务(如 java.util.Timer 或 commonj 工作管理器)
  • 具有复杂 SQL 查询的预测试连接(在 DataSource 的 WebSphere Application Server 数据源属性中)

我还建议使用分析器来确定原因,YourKit 分析器是一个相当不错的分析器。

于 2010-01-31T22:08:19.560 回答
1

您可以尝试分析应用程序并进行堆转储,这可以回答一些与内存和 cpu 使用相关的问题。

于 2010-01-29T01:45:40.867 回答
0

我也遇到了同样的问题,[Deferrable Alarm:x] 与 BoundedBuffer 一起使用。我唯一的区别是这是在 Windows 7 64 位机器上。绝对没有 Tvioli 或其他批处理进程在运行,没有发出请求,单个实例只是空闲。

我可以在 DEBUG 模式下运行应用程序并暂停可延迟警报线程,CPU 峰值停止、恢复并再次启动。

我检查了磁盘活动、网络活动,但那里没有发生任何事情。

我正在运行 WebSphere 6.1.0.27 。

于 2010-04-07T09:34:03.197 回答
0

非常本能地(不熟悉 iSeries 平台)我会查看与磁盘 IO 相关的问题。你能描述一下磁盘子系统吗?您能否查看您的应用程序是否在 iowait 中花费了异常多的时间?

于 2009-04-29T15:42:28.787 回答
0

我知道这不完全符合你的问题。但如果您在 WAS 6.1 补丁 17 之前运行,可能值得一看。

http://www-01.ibm.com/support/docview.wss?uid=swg24018437

希望这可以帮助。干杯约翰

于 2009-05-05T07:58:24.670 回答
0

我最好的猜测是它正在对实例进行某种类型的监视,例如 Tivoli 等。您是否排除了任何 GC 活动?

HTH 汤姆

于 2009-05-14T16:31:24.290 回答
0

大多数应用程序服务器都是用 java 本身实现的,WebSphere 也是如此。除了服务客户端请求之外,该服务器还必须执行其他定期工作,例如资源池管理。执行此作业将创建一些需要进行垃圾回收的临时对象。

根据您分配的堆数量、使用情况和垃圾收集器设置,将调用垃圾收集器。我会说尝试查看是否是垃圾收集器线程占用了您的 CPU。为此,将 jconsole 实用程序连接到远程 websphere 进程一天,看看堆使用量和 cpu 使用量之间是否存在任何关联。

于 2010-01-30T15:16:14.433 回答