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
行)并确定问题所在。