weblogic高CPU的分析(HP-UX)

HP-UX
HP 目前没有提供类似 prstat- 的命令来收集独立的线程 ID,以将它们转换回 Thread Dump,BEA 技术支持部门开发了一种简单的实用程序,可以显示进程 ID (PID)、与 PID 关联的轻量型进程 ID (LWPID)、用户时间和所使用的系统时间。您可以使用该程序作为一个大致指南,因为在高 CPU 占用的情况中,LWPID 使用越来越多的 CPU,您会看到用户时间在很短的时间之内便增加了。您可以使用 BEA 的 hp_prstat 实用程序,并定期测量每个 LWPID 的用户时间以了解哪一个正在随时间推移而增加。用户时间只能显示为一个整数,因为由 HP 提供的 API 在这种情况下无法进行更精细的测量。

若要收集 HP-UX 的数据:

单击 hp_prstat 以下载 BEA 技术支持部门开发的 hp_prstat 实用程序。
在 Java 进程中运行 hp_prstat命令。
通过在 Java 进程中执行以下命令对服务器进行若干 Thread Dump: kill -3 <PID>。
稍后,完成另一个 hp_prstat <PID>快照。
检查两次 hp_prstat迭代的输出结果以找到已经迅速增加用户时间的出现问题的 LWPID。
一旦您获得该号码 (LWPID),请检查 Thread Dump,以查找您已经完成的 Thread Dump 中哪一项的 lwp_id=<等于您所获得的 LWPID>。
这将匹配将要占用完 CPU 的有问题的线程。

确定为什么在您的代码中会发生这个问题,或者,如果堆栈的最顶端输出来自 WebLogic,请与 BEA 客户支持部门联系。
下面是 HP-UX 系统中上述进程的一个示例:
在 Java 进程中运行 hp_prstat 命令。
示例: hp_prstat <PID>
每隔几分钟执行一次上述操作,执行数次,同时观察发生高 CPU 占用率的情况。
下面是输出示例:

lwpid pid pri status UsrTime SysTime

285365 4426 154 1 29 3
285381 4426 154 1 0 7
285382 4426 154 1 2 7
285383 4426 154 1 0 7
285384 4426 154 1 0 7
285385 4426 168 1 0 7
285386 4426 154 1 0 7
285387 4426 154 1 0 7
285388 4426 154 1 0 7
285389 4426 154 1 30 7
285404 4426 168 1 0 7
285405 4426 154 1 0 7
285406 4426 154 1 0 7
285407 4426 154 1 0 7
285408 4426 154 1 0 7
285409 4426 154 1 0 7
285410 4426 154 1 0 7
285411 4426 154 1 0 7
285412 4426 154 1 0 7
285413 4426 154 1 0 7
285414 4426 154 1 0 7
285415 4426 154 1 0 7
285416 4426 154 1 0 7
285417 4426 154 1 0 7
285418 4426 154 1 0 7
285419 4426 154 1 0 7
285420 4426 154 1 0 7
285421 4426 154 1 0 7
285422 4426 154 1 0 7
285423 4426 154 1 0 7
285424 4426 154 1 0 7
285425 4426 154 1 0 7
285426 4426 154 1 0 7
285427 4426 154 1 0 7
285428 4426 154 1 0 7
285429 4426 154 1 0 7
285430 4426 154 1 0 7
285431 4426 154 1 0 7
285432 4426 154 1 0 7
285433 4426 154 1 0 7
285434 4426 154 1 0 7
285435 4426 154 1 0 7
285436 4426 154 1 0 7
285439 4426 154 1 0 7
285441 4426 154 1 0 7
285442 4426 154 1 0 7
285443 4426 154 1 0 7
285444 4426 154 1 0 7
285445 4426 154 1 0 7
285446 4426 154 1 0 7
285449 4426 154 1 0 7
285450 4426 154 1 0 7
285451 4426 154 1 0 7
285452 4426 154 1 0 7
285453 4426 154 1 0 7
285454 4426 154 1 0 7
285455 4426 154 1 0 7
285456 4426 154 1 0 7
285457 4426 154 1 0 7
285458 4426 154 1 0 7
285459 4426 154 1 0 7
285460 4426 154 1 0 7
285461 4426 154 1 0 7
285462 4426 154 1 0 7
285463 4426 154 1 0 7
285464 4426 168 1 0 7
285468 4426 178 4 0 7
285469 4426 154 1 0 7
285470 4426 154 1 0 7
285471 4426 154 1 0 7
285472 4426 154 1 0 7
285473 4426 154 1 0 7
285475 4426 168 1 1 7
285477 4426 154 1 0 7
285478 4426 154 1 0 7

通过在 Java 进程中执行以下命令对服务器进行 Thread Dump: kill -3 <PID>。
稍后,完成另一个 hp_prstat <PID> 快照。
注意,与第一个快照对比,两个 LWPID(285475 和 285416)比较大。

您需要检查这两个 LWPID。

lwpid pid pri status UsrTime SysTime

285365 4426 154 1 29 3
285381 4426 154 1 0 7
285382 4426 154 1 2 7
285383 4426 154 1 0 7
285384 4426 154 1 0 7
285385 4426 168 1 0 7
285386 4426 154 1 0 7
285387 4426 154 1 0 7
285388 4426 154 1 0 7
285389 4426 154 1 32 7
285404 4426 168 1 0 7
285405 4426 154 1 0 7
285406 4426 154 1 0 7
285407 4426 154 1 0 7
285408 4426 154 1 0 7
285409 4426 154 1 0 7
285410 4426 154 1 0 7
285411 4426 154 1 0 7
285412 4426 154 1 0 7
285413 4426 154 1 0 7
285414 4426 154 1 0 7
285415 4426 154 1 0 7
285416 4426 154 1 13 7
285417 4426 154 1 0 7
285418 4426 154 1 0 7
285419 4426 154 1 0 7
285420 4426 154 1 0 7
285421 4426 154 1 0 7
285422 4426 154 1 0 7
285423 4426 154 1 0 7
285424 4426 154 1 0 7
285425 4426 154 1 0 7
285426 4426 154 1 0 7
285427 4426 154 1 0 7
285428 4426 154 1 0 7
285429 4426 154 1 0 7
285430 4426 154 1 0 7
285431 4426 154 1 0 7
285432 4426 154 1 0 7
285433 4426 154 1 0 7
285434 4426 154 1 0 7
285435 4426 154 1 0 7
285436 4426 154 1 0 7
285439 4426 154 1 0 7
285441 4426 154 1 0 7
285442 4426 154 1 0 7
285443 4426 154 1 0 7
285444 4426 154 1 0 7
285445 4426 154 1 0 7
285446 4426 154 1 0 7
285449 4426 154 1 0 7
285450 4426 154 1 0 7
285451 4426 154 1 0 7
285452 4426 154 1 0 7
285453 4426 154 1 0 7
285454 4426 154 1 0 7
285455 4426 154 1 0 7
285456 4426 154 1 0 7
285457 4426 154 1 0 7
285458 4426 154 1 0 7
285459 4426 154 1 0 7
285460 4426 154 1 0 7
285461 4426 154 1 0 7
285462 4426 154 1 0 7
285463 4426 154 1 0 7
285464 4426 168 1 0 7
285468 4426 178 4 0 7
285469 4426 154 1 0 7
285470 4426 154 1 0 7
285471 4426 154 1 0 7
285472 4426 154 1 0 7
285473 4426 154 1 0 7
285475 4426 168 1 5 7
285477 4426 154 1 0 7
285478 4426 154 1 0 7

通过在 Java 进程中执行以下命令对服务器进行另一个 Thread Dump: kill -3 <PID>,确保您捕捉到占用完 CPU 资源的正确线程。
从 hp_prstat 输出中获取 LWPID,该输出在形式上与用户时间相似,且不断增大。一旦您获得该号码 (LWPID),请检查 Thread Dump,以查找您已经完成的 Thread Dump 中哪一项的 lwp_id 等于<您所获得的 LWPID>。
可以检查以下这两个 LWPID:

"Thread-6" prio=8 tid=0x0004f620 nid=75 lwp_id=285475 waiting on monitor http://0x66d5e000..0x66d5e500
at java.lang.Thread.sleep(Native Method)
at weblogic.management.deploy.GenericAppPoller.run(GenericAppPoller.java:139)

"ExecuteThread: '11' for queue: 'default'" daemon prio=10 tid=0x0004ad00 nid=23 lwp_id=285416 runnable http://0x67874000..0x67874500
at java.net.SocketOutputStream.socketWrite(Native Method)
at java.net.SocketOutputStream.write(Unknown Source)
at weblogic.servlet.internal.ChunkUtils.writeChunkTransfer(ChunkUtils.java:222)
at weblogic.servlet.internal.ChunkUtils.writeChunks(ChunkUtils.java:198)
at weblogic.servlet.internal.ChunkOutput.flush(ChunkOutput.java:285)
at weblogic.servlet.internal.ChunkOutput.checkForFlush(ChunkOutput.java:345)
at weblogic.servlet.internal.ChunkOutput.write(ChunkOutput.java:222)
at weblogic.servlet.internal.ChunkOutput.write(ChunkOutput.java:237)
at weblogic.servlet.internal.ChunkOutputWrapper.write(ChunkOutputWrapper.java:86)
at weblogic.servlet.internal.ChunkWriter.write(ChunkWriter.java:37)
at java.io.Writer.write(Unknown Source)
- locked <0x753408e8> (a weblogic.servlet.internal.ChunkWriter)
at java.io.PrintWriter.write(Unknown Source)
- locked <0x753408e8> (a weblogic.servlet.internal.ChunkWriter)
at java.io.PrintWriter.write(Unknown Source)
at java.io.PrintWriter.print(Unknown Source)
at java.io.PrintWriter.println(Unknown Source)
- locked <0x753408e8> (a weblogic.servlet.internal.ChunkWriter)
at examples.servlets.HelloWorldServlet.service(HelloWorldServlet.java:28)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1058)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:401)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:306)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:5445)
at weblogic.security.service.SecurityServiceManager.runAs(SecurityServiceManager.java:780)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3105)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2588)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:213)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:189)

显然,实际造成问题的是 LWPID 285416。
您可以检查该 Servlet 的服务方法,以查明围绕此行号发生的情况(HelloWorldServlet.java第 28 行)并确定问题所在。

posted @ 2009-01-16 12:33  徐之  阅读(1098)  评论(0编辑  收藏  举报