使用dbx查找应用服务器CPU高的原因

针对应用服务器出现cpu持续异常高的情况,参照BEA工程师提供的方法,需要收集一些信息进行分析来查明是我们系统的原因还是weblogic的原因,或者是别的原因。
    目前一直观察CPU使用情况,虽然现在还没有收集到真正要的信息,但可以先将方法整理出来,供大家参考。
    操作方法:
1、在服务器上which dbx,如果有,可跳过此步,如果提供找不到,则需要安装aix第一张安装盘中的bos.adt软件包,附件中有安装的图解说明。
2、重新整理了bea提供的调整weblogic配置的地方,修改和补充的地方用颜色区分出来了,见附件weblogic改造文档(补充).doc
3、weblogic的启动文件startWebLogic.sh、startp.sh和startm.sh里要将原来加的 MEM_ARGS="-Xms768m -Xmx768m -Xrs"最后的-Xrs去掉,这个参数问过集成的李难俊,是系统信号什么的东东,具体不是很清楚,说只要不是手工发信号,去掉没什么影响。启动文件修改完,需要重启服务。
4、分析方法:见附件bea官网cpu占用高的分析 或者 去bea官方网站上的说明: http://www.bea.com.cn/support_pattern/High_CPU_Usage_Pattern.html#AIX 
   注:1、如果没有去掉启动文件中的-Xrs,执行kill -3时,会将该进程直接杀死,并在服务器上产生一个core的二进制文件,该文件几百M,而且也无法进行分析。
       2、官方网站上没说需要重复收集多次信息,用来进行比较分析,上次枣庄出现了后,只收集了一次信息,联系bea工程师,说一次不能进行比较分析,原因不一定是当时抓到的那个进程,需要多次进行比较。教训,所以大家在进行分析的时候,多执行几次
ps -mp <WLS_PID> -o THREAD 和 kill -3 <WLS_PID> ,多抛几个javacoreXXX.XXX.txt文件出来,该文件在你的域下面,如/beawlsp4/user_projects/domains/mydomain下,注意看看占用CPU高的是不是都是那(几)个进程。
5、系统使用速度慢的时候,还要同时观察数据库的情况,有时候造成cpu异常高也可能是因为开发人员写SQL的时候有些条件没有加上,或者没有有效利用索引造成的,当营销系统反应比较慢的时候,可以先查找一下数据库有没有锁表的语句:
SELECT /*+ rule */ S.USERNAME, DECODE(L.TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL)
 LOCK_LEVEL, O.OWNER, O.OBJECT_NAME, O.OBJECT_TYPE, S.SID,   S.SERIAL#,  S.TERMINAL,   S.MACHINE,   S.PROGRAM,   S.OSUSER
 FROM V$SESSION S, V$LOCK L, DBA_OBJECTS O
 WHERE L.SID = S.SID
   AND L.ID1 = O.OBJECT_ID(+)
   AND S.USERNAME IS NOT NULL;
根据锁表的SID在session中找到该进程,点sqltext就可以看见造成速度慢或者锁表的SQL语句。
或者按照李宗阳提供的方法:
  登陆数据库服务器,并切换到oracle用户
  sqlplus yykf
  @$ORACLE_HOME/rdbms/admin/addmrpt.sql
  会列出时间段,选择开始时间段和结束时间段
  Enter value for begin_snap: 开始时间段
  Begin Snapshot Id specified:
  Enter value for end_snap: 截止时间段
  End   Snapshot Id specified:        
  Specify the Report Name
  ~~~~~~~~~~~~~~~~~~~~~~~
  The default report file name is addmrpt_2_3113_3114.txt.  To use this name,
  press <return> to continue, otherwise enter an alternative.
  Enter value for report_name: 输出文件名
该报告文件会将效率比较低的SQL语句分析出来。
 
注意:多执行几次ps -mp <WLS_PID> -o THREAD 和 kill -3 <WLS_PID>,BEA工程师说,执行一次并不足以能查到真正的原因,教训!!!
 
 
当应用服务器CPU一直很高时,
执行: ps -mp <WLS_PID> -o THREAD 以查找正在占用 CPU 的 tid。 
您应当查看“CP”列(表示 CPU 占用率),看其中哪些线程的此项值比较高并从中挑选一个线程。
通过执行以下命令对服务器进行 Thread Dump:
kill -3 <WLS_PID>
运行: dbx -a <WLS_PID>
在 dbx 中时,运行 dbx thread命令(以列出所有线程)。
查找与您通过 ps -mp <PID -o THREAD 命令获取的 TID 匹配的行。 
该行中的号码应当采用“$t<NUM>”格式,其中“NUM”是一个号码。
在 dbx 中时,运行 dbx 命令 th info <TID>(此 TID 来自上一步骤,该步骤在 $t<NUM>后面列出号码)以获取关于该线程的信息。
从第 3 步骤的输出中,在“general”下查找“pthread_t”,并记录该十六进制号码。
非常重要说明:在 dbx 提示符下,您需要在完成操作时在 dbx 命令行键入“detach”,否则,如果您在连接到进程时只要一退出,dbx 将终止该进程!
记下“p_thread_t”输出中的十六进制值,并在 Thread Dump 中搜索其中哪个线程的“native ID”等于该值。 
这将为您揭示造成高 CPU 占用率问题的线程。
确定为什么在您的代码中正在发生这个问题,或者,如果堆栈的最顶端输出来自 WebLogic,请与 BEA 客户支持部门联系。
下面是 AIX 系统中上述进程的一个示例:
ps -mp 250076 -o THREAD 将显示以下内容:
 
USER    PID   PPID     TID ST  CP PRI SC    WCHAN        F     TT BND COMMAND
    usera 250076 217266       - A   38  60 72        *   242011  pts/0   - /wwsl/sharedInstalls/aix/jdk130/...
       -      -      -  315593 Z    0  97  1        -   c00007      -   - -
       -      -      -  344305 S    0  60  1 f1000089c020e200   400400      -   - -
       -      -      -  499769 S    0  60  1 f1000089c0213a00   400400      -   - -
       -      -      -  540699 S    0  60  1 f100008790008440  8410400      -   - -
       -      -      -  544789 S    0  60  1 f100008790008540  8410400      -   - -
       -      -      -  548883 S    0  60  1 f100008790008640  8410400      -   - -
       -      -      -  552979 S    0  60  1 f100008790008740  8410400      -   - -
       -      -      -  565283 Z    0  60  1        -   c00007      -   - -
       -      -      -  585783 S    0  60  1 f100008790008f40  8410400      -   - -
       -      -      -  589865 Z    0  80  1        -   c00007      -   - -
       -      -      -  593959 S    1  60  1 f100008790009140  8410400      -   - -
       -      -      -  610365 S    0  60  1 f100008790009540  8410400      -   - -
       -      -      -  614453 S    0  60  1 f100008790009640  8410400      -   - -
       -      -      -  618547 S    0  60  1 f100008790009740  8410400      -   - -
       -      -      -  622645 S    0  60  1 f100008790009840  8410400      -   - -
       -      -      -  626743 S    0  60  1 f100008790009940  8410400      -   - -
       -      -      -  630841 S    0  60  1 f100008790009a40  8410400      -   - -
       -      -      -  634941 S    0  60  1 f100008790009b40  8410400      -   - -
       -      -      -  639037 S    0  60  1 f100008790009c40  8410400      -   - -
       -      -      -  643135 S    0  60  1 f100008790009d40  8410400      -   - -
       -      -      -  647233 S    0  60  1 f100008790009e40  8410400      -   - -
       -      -      -  651331 S    0  60  1 f100008790009f40  8410400      -   - -
       -      -      -  655429 S    0  60  1 f10000879000a040  8410400      -   - -
       -      -      -  659527 S    0  60  1 f10000879000a140  8410400      -   - -
       -      -      -  663625 S    0  60  1 f10000879000a240  8410400      -   - -
       -      -      -  667723 S   37  78  1 f1000089c020f150   400400      -   - -
       -      -      -  671821 S    0  60  1 f10000879000a440  8410400      -   - -
       -      -      -  675919 S    0  60  1        -   418400      -   - -
       -      -      -  680017 S    0  60  1 f10000879000a640  8410400      -   - -
       -      -      -  684115 S    0  60  1 f10000879000a740  8410400      -   - -
       -      -      -  688213 S    0  60  1 f10000879000a840  8410400      -   - -
       -      -      -  692311 S    0  60  1 f10000879000a940  8410400      -   - -
       -      -      -  696409 S    0  60  1 f10000879000aa40  8410400      -   - -
       -      -      -  712801 S    0  60  1 f10000879000ae40  8410400      -   - -
       -      -      -  716899 S    0  60  1 f10000879000af40  8410400      -   - -
       -      -      -  721011 S    0  60  1 f10000879000b040  8410400      -   - -
       -      -      -  725095 S    0  60  1 f10000879000b140  8410400      -   - -
       -      -      -  729193 S    0  60  1 f10000879000b240  8410400      -   - -
       -      -      -  733291 S    0  60  1 f10000879000b340  8410400      -   - -
       -      -      -  737389 S    0  60  1 f10000879000b440  8410400      -   - -
       -      -      -  741487 S    0  60  1 f10000879000b540  8410400      -   - -
       -      -      -  745585 S    0  60  1 f10000879000b640  8410400      -   - -
       -      -      -  749683 S    0  60  1 f10000879000b740  8410400      -   - -
       -      -      -  753781 S    0  60  1 f10000879000b840  8410400      -   - -
       -      -      -  757879 S    0  60  1 f10000879000b940  8410400      -   - -
       -      -      -  761977 S    0  60  1 f10000879000ba40  8410400      -   - -
       -      -      -  766075 S    0  60  1 f10000879000bb40  8410400      -   - -
       -      -      -  770173 S    0  60  1 f10000879000bc40  8410400      -   - -
       -      -      -  774271 Z    0  60  1        -   c00007      -   - -
       -      -      -  778373 S    0  60  1 f10000879000be40  8410400      -   - -
       -      -      -  782467 S    0  60  1 f10000879000bf40  8410400      -   - -
       -      -      -  786565 S    0  60  1 f10000879000c040  8410400      -   - -
       -      -      -  790663 S    0  60  1 f10000879000c140  8410400      -   - -
       -      -      -  794761 S    0  60  1 f10000879000c240  8410400      -   - -
       -      -      -  798859 S    0  60  1 f10000879000c340  8410400      -   - -
       -      -      -  802957 S    0  60  1 f10000879000c440  8410400      -   - -
       -      -      -  807055 S    0  60  1 f10000879000c540  8410400      -   - -
       -      -      -  811153 S    0  60  1 f10000879000c640  8410400      -   - -
       -      -      -  815253 S    0  60  1 f10000879000c740  8410400      -   - -
       -      -      -  819357 S    0  60  1 f10000879000c840  8410400      -   - -
       -      -      -  823447 S    0  60  1 f10000879000c940  8410400      -   - -
       -      -      -  827545 S    0  60  1 f10000879000ca40  8410400      -   - -
       -      -      -  831643 S    0  60  1 f10000879000cb40  8410400      -   - -
       -      -      -  835741 S    0  60  1 f10000879000cc40  8410400      -   - -
       -      -      -  839839 S    0  60  1 f10000879000cd40  8410400      -   - -
       -      -      -  843937 S    0  60  1 f10000879000ce40  8410400      -   - -
       -      -      -  848037 S    0  60  1 f10000879000cf40  8410400      -   - -
       -      -      -  852135 S    0  60  1 f10000879000d040  8410400      -   - -
       -      -      -  856257 S    0  60  1 f10000879000d140  8410400      -   - -
       -      -      -  868527 S    0  60  1 f10000879000d440  8410400      -   - -
       -      -      -  872623 S    0  60  1 f10000879000d540  8410400      -   - -
       -      -      -  876725 S    0  60  1 f10000879000d640  8410400      -   - -
通过 kill -3 <WLS_PID> 进行该 WLS_PID 的 Thread Dump
检查 ps -mp <WLS_PID> -o THREAD命令所输出的信息。
注意,TID "667723" 在 CP 列中有一个高值(它达到“37”,而其它 TID 几乎为 0)。
运行 dbx -a 250076以连接到 WebLogic Server 进程。
运行 thread 命令以列出所有本地线程。
下面只显示相关线程的一个代码片断:
thread  state-k     wchan    state-u    k-tid   mode held scope function
 .....
 $t15    wait      0xf10000879000a140 blocked   659527     k   no   sys  _event_sleep     
 $t16    wait      0xf10000879000a240 blocked   663625     k   no   sys  _event_sleep     
 $t17    run                  running   667723     k   no   sys  JVM_Send         
 $t18    wait      0xf10000879000a440 blocked   671821     k   no   sys  _event_sleep     
 $t19    wait                 running   675919     k   no   sys  poll             
 $t20    wait      0xf10000879000a640 blocked   680017     k   no   sys  _event_sleep     
 .....
运行 th info 17 命令以获取关于该本地线程的必要信息:
 
(dbx) th info 17
     thread  state-k     wchan    state-u    k-tid   mode held scope function
     $t17    run                  running   667723     k   no   sys  JVM_Send         
          general:
             pthread addr = 0x3ea55c68         size         = 0x244
             vp addr      = 0x3e69e5e0         size         = 0x2a8
             thread errno = 2
             start pc     = 0x300408b0
             joinable     = no
             pthread_t    = 1011
          scheduler:
             kernel       =
             user         = 1 (other)
          event :
             event        = 0x0
             cancel       = enabled, deferred, not pending
          stack storage:
             base         = 0x3ea15000         size         = 0x40000
             limit        = 0x3ea55c68
             sp           = 0x3ea55054
非常重要说明:在 dbx 提示符下运行“detach”以从 WebLogic 进程中分离。
记下上述“pthread_t”的数值,并用来查找 WebLogic Server 进程的 Thread Dump 中的正确线程。
从早期进行的 Thread Dump 中,您可以将十六进制号码“1011”与 Thread Dump 中在“native ID”之后的号码进行匹配。
下面是匹配此十六进制号码并造成高 CPU 占用率问题的线程示例:
 
"ExecuteThread: '11' for queue: 'default'" (TID:0x31cf86d8, sys_thread_t:0x3e5ea108, state:R, native ID:0x1011) prio=5
        at java.net.SocketOutputStream.socketWrite(Native Method)
        at java.net.SocketOutputStream.write(SocketOutputStream.java(Compiled Code))
        at weblogic.servlet.internal.ChunkUtils.writeChunkTransfer(ChunkUtils.java(Compiled Code))
        at weblogic.servlet.internal.ChunkUtils.writeChunks(ChunkUtils.java(Compiled Code))
        at weblogic.servlet.internal.ChunkOutput.flush(ChunkOutput.java(Compiled Code))
        at weblogic.servlet.internal.ChunkOutput.checkForFlush(ChunkOutput.java(Compiled Code))
        at weblogic.servlet.internal.ChunkOutput.write(ChunkOutput.java(Compiled Code))
        at weblogic.servlet.internal.ChunkOutput.write(ChunkOutput.java(Compiled Code))
        at weblogic.servlet.internal.ChunkOutputWrapper.write(ChunkOutputWrapper.java(Compiled Code))
        at weblogic.servlet.internal.ChunkWriter.write(ChunkWriter.java(Compiled Code))
        at java.io.Writer.write(Writer.java(Compiled Code))
        at java.io.PrintWriter.write(PrintWriter.java(Compiled Code))
        at java.io.PrintWriter.write(PrintWriter.java(Compiled Code))
        at java.io.PrintWriter.print(PrintWriter.java(Compiled Code))
        at java.io.PrintWriter.println(PrintWriter.java(Compiled Code))
        at examples.servlets.HelloWorldServlet.service(HelloWorldServlet.java(Compiled Code))
        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(Compiled Code))
        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(Compiled Code))
        at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:189)
         ----- Native Stack -----
        sysSend
        JVM_Send
        Java_java_net_SocketOutputStream_socketWrite
确定为什么在您的代码中正在发生这个问题,或者,如果堆栈的最顶端输出来自 WebLogic,请与 BEA 客户支持部门联系。
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值