Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 软件时空 > 软件相关 > WebLogic高cpu消耗诊断一例
【标  题】:WebLogic高cpu消耗诊断一例
【关键字】:WebLogic,cpu
【来  源】:http://www.cublog.cn/u/12331/showart.php?id=255325

WebLogic高cpu消耗诊断一例

Your Ad Here

故障分析报告

故障描述

       2007-3-6日上午,在系统监控时发现WebLogic实例的JAVA进程CPU使用率非常高,长期在60%以上,而内存消耗也较大。在1130分,WebLogic其中一个实例内存溢出,很快另外一个实例访问也异常缓慢。经过重启,系统访问正常。

发生时间

       2007-3-6 11302007-3-6 1140

故障分析

       在故障发生时,WebLogic的被管服务器mserver2gc日志出现连续FULL GC现象,如下所示:

68354.936: [Full GC 68354.936: [Tenured: 1441791K->1441791K(1441792K), 50.8704538 secs] 1823487K->1793402K(1823488K), [Perm : 122693K->122655K(131072K)], 50.8707784 secs]

68406.966: [Full GC 68406.966: [Tenured: 1441791K->1441791K(1441792K), 43.3959313 secs] 1823487K->1795107K(1823488K), [Perm : 122691K->122691K(131072K)], 43.3962451 secs]

68452.057: [Full GC 68452.057: [Tenured: 1441791K->1441791K(1441792K), 43.8102222 secs] 1823487K->1793985K(1823488K), [Perm : 122692K->122692K(131072K)], 43.8105214 secs]

68497.417: [Full GC 68497.417: [Tenured: 1441791K->1441791K(1441792K), 44.0541711 secs] 1823487K->1791516K(1823488K), [Perm : 122692K->122692K(131072K)], 44.0545032 secs]

68542.904: [Full GC 68542.904: [Tenured: 1441791K->1441791K(1441792K), 51.2142139 secs] 1823478K->1792950K(1823488K), [Perm : 122709K->122681K(131072K)], 51.2145271 secs]

由此,判断有大量对象占用了JVM的内存,并且在GC后没有释放。

同时,实例的输出日志中,发现有session复制现象,如下所示:

<Mar 6, 2007 11:36:35 AM CST> <Warning> <HTTP Session> <BEA-100074> <Primary session was removed during our attempt to retrieve secondary information from the session in the local server for the session: roid: 95421796383911755 , rsid: [ID: NdhhFsgX2JSpTzwqBWxFvllP5Qnj0wRphGJcLG23BQDLs5vT47X4 Primary: 847552361:192.168.80.17:8002:-1 Secondary: null] , primaryURL: t3://192.168.80.17:8002.>

这说明,WebLogic的被管服务器mserver2在向mserver1复制会话。

由于mserver1无法处理两个被管服务器的业务,很快也访问缓慢了。

之后,重启了WebLogic2个实例,系统恢复正常。

       在接下来的系统监控中,发现WebLogic其中一个实例的JAVA进程的CPU使用率依然非常高,针对这一现象,我们dumpCPU的使用情况,发现有些JAVA线程使用CPU资源较高,且占用时间较长,如下所示:

PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/LWPID

 27662 cncbss   2225M 1631M cpu10    0   10   0:22.46  22% java/73

 27662 cncbss   2225M 1631M cpu9     0   10   0:20.31  22% java/72

 27662 cncbss   2225M 1631M run      0   10   0:22.12  22% java/75

经过多次dump CPU使用情况,这三个线程仍然存在。

此后dump WebLogic的线程,发现是如下线程导致高消耗CPU

"ExecuteThread: '51' for queue: 'weblogic.kernel.Default'" daemon prio=5 tid=0x00ef7008 nid=0x4a runnable [0x79480000..0x79481998]

        at java.util.Vector.indexOf(Vector.java:363)

        - waiting to lock <0xa21b73f8> (a java.util.Vector)

        at java.util.Vector.contains(Vector.java:321)

        at cnc.util.FyCol.add(FyCol.java:204)

        at cnc.util.FyCol.add(FyCol.java:194)

        at cnc.util.RecordSet.<init>(RecordSet.java:199)

        at cnc.util.RecordSet.<init>(RecordSet.java:93)

        at cnc.util.FyDao.query(FyDao.java:264)

        at cnc.util.FyDao.query(FyDao.java:234)

        at listquery.ListQueryBean.getfreeList(ListQueryBean.java:404)

        at listquery.ListQuery_gq76y8_EOImpl.getfreeList(ListQuery_gq76y8_EOImpl.java:98)

        at listquery.ListQuery_gq76y8_EOImpl_WLSkel.invoke(Unknown Source)

        at weblogic.rmi.internal.ServerRequest.sendReceive(ServerRequest.java:166)

        at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:290)

        at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:248)

        at listquery.ListQuery_gq76y8_EOImpl_816_WLStub.getfreeList(Unknown Source)

        at cnc.query.list.QueryList.createExcel(QueryList.java:790)

        at cnc.query.list.ExportData.processRequest(ExportData.java:39)

        at cnc.query.list.ExportData.probe$0$doGet(ExportData.java:15)

        at cnc.query.list.ExportData.doGet(ExportData.java)

        at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)

        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

        at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1077)

        at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:465)

        at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:348)

        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:7047)

        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)

        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)

        at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3902)

        at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2773)

        at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)

        at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)

 

经判断,这是清单查询的功能。

之后,转由开发人员对清单查询代码进行分析。

总结及改进措施

       此次故障是由于个别程序性能不佳消耗CPU过高导致,在35个这样查询的情况下就会使系统出现缓慢现象,而且清单查询对JVM内存消耗也较大,如果有大量清单查询会使JVM的内存出现溢出情况。

       由于在目前情况下,1台服务器的处理能力不足,特别是在业务高峰时,WebLogic1个被管服务器并不足以支撑2个被管服务器的业务,因此其中一台服务器出现宕机、挂起等严重故障,往往另外一台也会出现相同故障。

       鉴于上述情况,我们提出下列改进意见:

1、  在第三台机器上增加一个WebLogic实例,加入到集群系统。这样在一台被管服务器出现故障时,另外两台依然可以实现负载均衡功能,宕机的可能性大大降低。

2、  将清单查询从BSS系统中移出去,目前这一项目正在进行。

3、  改良清单查询程序的性能。

 

 

 

 

 

附:

 



收集高 CPU 占用率的数据
对于有关收集高 CPU 占用率的数据的特定操作信息,请根据您的操作系统执行以下步骤。

重要说明:
这些操作系统的所有信息都基于 Sun JVM。 目前在 JRockit 中还没有办法将 PID 从说明 CPU 占用率的操作系统命令(prstattoppslist 等等)映射到 Thread Dump 中的正确线程。 从 Jrockit 的 70SP4RP2 和 81SP2RP1 以后的版本起,就可实现此映射。 例如,在 Linux 中,Thread Dump 在以后的版本中将采用如下形式(PID 显示在 Thread Dump 中):

 "ExecuteThread: '20' for queue: 'default'"  id: 0x00000e80  prio: 5  ACTIVE, DAEMON, GCABLE
    thread: 0x469b0af0  lastj: 0xac0f19c
    pt_thr: 237596 pid: 23166
    at COM.jrockit.vm.Classes.defineClass0(Native Method)@0x8b4b798
    at COM.jrockit.vm.Classes.defineClass(Unknown Source)@0x8b4b8b1
    at java.lang.ClassLoader.defineClass(Unknown Source)@0x8b4b46f

在上例中,PID 是 23166,您可以通过 Linux 或任何所在系统上的 top(或任何您需要在操作系统上使用的特定命令)输出直接关联该 PID。

转换为十六进制号码

备注:为协助您计算在本模式中讨论的十六进制值,您可以在 Shell 脚本中使用下列行将十进制号码转换为十六进制号码。如果您使用 Unix 操作系统,那么转换会很方便。

dec2hex.sh:

    printf "dec -> hex:  %d = %x \n" ${1} ${1}
用法:
   
   
$ sh dec2hex.sh 755

    dec -> hex:  755 = 2f3


Solaris
  1. 在 Java 进程中运行 prstat命令。重复几次这个操作,以便您能够看到一种模式。例如:prstat -L -p <PID> 1 1
  1. 在 Java 进程中运行 pstack命令以获得从轻量型进程 (LWP) 到 PID(进程 ID)的映射。 
示例:pstack 9499 并将输出结果重定向到一个文件。 
如果您使用 Solaris 中的常规线程库(即,在 LD_LIBRARY_PATH 中没有 /usr/lib/lwp),LWP 就不会直接映射到操作系统线程,因此您必须从进程中执行 pstack(所以检查看您是否正在使用替代线程库)。
  1. 经过一段时间后对服务器进行若干 Thread Dump,确保您执行正确的线程。 
您可以通过在 Java 进程中执行 kill -3 <PID>来达到此目的。
  1. 将 LWP ID 映射到 Java 线程 ID。 
例如,如果上述的 LWP 为“8”,它可以映射到 Java 线程“76”。然后将 76 换算为十六进制值 0x4c。 
  1. 检查 Thread Dump,找到匹配“nid= <上述标识符/值>”的线程。
在本示例中,您找到匹配“nid=0x4c”的线程,而该线程就是正在消耗 CPU 资源的那个线程。

增强WebLogic session的粘度:【上一篇】
从windows到linux -- 编程篇 -- cygwin,在win中开发linux程序(ZT):【下一篇】
【相关文章】
  • 增强WebLogic session的粘度
  • IBM ITCAM网管软件导致WebLogic JVM连续产生FULL GC的解决方法
  • POWER 5+ 双核CPU芯片
  • DMISP 进程占用了太多的 CPU
  • myeclipse 和 Weblogic ejb 错误
  • cpu cache技术学习笔记
  • 利用OLE对象取CPU序列号、硬盘序列号等
  • WebLogic运用DB的Java控件访问数据库
  • opencms 介绍及在weblogic8下的部署(原创)
  • Solaris 10 SPARC WebLogic JSP编译错误解决
  • 【随机文章】
  • 网络开发库
  • Linux 网管基本命令
  • OSPF配置任务列表
  • 总奖金15万美元的TopCoder公开赛
  • Novarg/Mydoom蠕虫及其变种分析报告
  • Visual C++ 编译器选项
  • 数据窗口中用Enter键替代Tab 键切换栏目
  • 万里开源携手MySQL公司 共建MySQL中国研发中心
  • Linux下jdk1.5的安装及中文显示问题解决方案
  • Delphi 中的属性property(适合初学delphi)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.