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

    技术2022-05-11  121

    针对应用服务器出现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语句分析出来。   bea官方网站上提供的方法: http://www.bea.com.cn/support_pattern/High_CPU_Usage_Pattern.html#AIX 注意:多执行几次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)