[原创]weblogic客户端性能不稳定_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 7344 | 回复: 0   主题: [原创]weblogic客户端性能不稳定        下一篇 
yang.liu
注册用户
等级:少校
经验:1182
发帖:77
精华:1
注册:2014-1-3
状态:离线
发送短消息息给yang.liu 加好友    发送短消息息给yang.liu 发消息
发表于: IP:您无权察看 2014-4-14 17:38:24 | [全部帖] [楼主帖] 楼主

1.概述

这次工作主要是配合XX公司相关技术人员解决系统自上周来发现的客户端性能不稳定,容易出现处理业务缓慢的情况

2.问题描述

下午3点至5业务高峰来临时,从客户端操作层面反映订单处理响应比较慢,从后台看JMS消息队列有堵塞情况,高峰期过后堵塞情况消失

当系统运行缓慢时,相关情况如下:

1)Messages Pending数明显增大

2)Messags Reveive数暴涨,且处理速度相对缓慢

3)高峰期过后参数恢复到正常范围

4)名字为queueDate这个Queue表现较为严重

3.系统当前配置

WebLogic Version:WebLogic Server 9.2 MP3 EDT  (JDK1.5.0_12)


3.1 Datasource配置

   系统数据源配置信息如下:

DataSource                : piccDataSource-0
Initial Capacity          : 10
Maximum Capacity   :90
Capacity Increment    :5
URL                           :jdbc:oracle:thin:@XX.XX.XX.XX:1521:XXXdb2
Driver Class Name:oracle.jdbc.OracleDriver
DataSource                  :XXXDataSource-0
Initial Capacity            : 10
Maximum Capacity     :90
Capacity Increment      : 5
URL                             :jdbc:oracle:thin:@XX.XX.XX.XX:1521:XXXdb1
Driver Class Name:oracle.jdbc.OracleDriver


4.问题分析

从系统繁忙时段捕获的WeblogicJMS监控信息,相关日志文件以及利用thread dump拿到的线程分布看,基本可以定位问题的发生过程:

4.1问题发生的根源


工程师自己编写的java应用程序在调用JMS服务取得数据并写入数据库时,出现大量线程都在等待连接的状况,等待同一把锁(如下图只列出两个)数据不能及时写入数据库,导致应用不能及时从数据库取得数据显示到界面,通过与开发人员沟通了解到,程序中数据库连接池初始值没有设定,默认值为0,这样导致在数据量大时,新建数据库连接,而数据库连接是 相当占用资源的,因此导致大量线程阻塞。

"Thread-204" prio=10 tid=0x007a2f18 nid=0xf9 waiting for monitor entry [0xbf97f000..0xbf97f8f0]
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:781)
- waiting to lock <0xd84d2310> (a org.apache.commons.pool.impl.GenericObjectPool)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:96)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
at com.sinosoft.jms.common.DBSource.getConnection(DBSource.java:77)
at com.sinosoft.jms.main.blwork.MainReceiverClientBlWork.doWork(MainReceiver
ClientBlWork.java:115)
at com.sinosoft.jms.main.blwork.MainReceiverClientBlWork.run(MainReceiverClientBl
Work.java:73)at java.lang.Thread.run(Thread.java:595)
"Thread-203" prio=10 tid=0x007a2118 nid=0xf8 waiting for monitor entry [0xbfa7e000..0xbfa7f970]
at org.apache.commons.pool.impl.GenericObjectPool.returnObject(GenericObjectPool.java:916)
- waiting to lock <0xd84d2310> (a org.apache.commons.pool.impl.GenericObjectPool)
at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:87)
- locked <0xe8cd8178> (a org.apache.commons.dbcp.PoolableConnection)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close
(PoolingDataSource.java:181)
at com.sinosoft.sysframework.reference.DBManager.close(DBManager.java:135)
at com.sinosoft.prpall.indiv.ci.interf.PolicyValidEncoder.addPhData(PolicyValidEncoder.java:750)
at com.sinosoft.prpall.indiv.ci.interf.PolicyValidEncoder.addPhList(PolicyValidEncoder.java:680)
at com.sinosoft.prpall.indiv.ci.interf.PolicyValidEncoder.addBody(PolicyValidEncoder.java:136)
at com.sinosoft.prpall.indiv.ci.interf.PolicyValidEncoder.addPacket(PolicyValidEncoder.java:83)
at com.sinosoft.prpall.indiv.ci.interf.PolicyValidEncoder.encode(PolicyValidEncoder.java:61)
at com.sinosoft.jms.bl.BLProposal.sinoTBcfm(BLProposal.java:481)
at com.sinosoft.jms.bl.BLProposal.Proposal_PolicySend(BLProposal.java:285)
at com.sinosoft.jms.main.blwork.MainReceiverClientBlWork.doWork1(MainReceiverClientB
lWork.java:263)
at  com.sinosoft.jms.main.blwork.MainReceiverClientBlWork.doWork(MainReceiverClientBl
Work.java:121)
at  com.sinosoft.jms.main.blwork.MainReceiverClientBlWork.run(MainReceiverClientB1
Work.java:73)
at java.lang.Thread.run(Thread.java:595)


4.2 业务高峰期JMS servers分析


业务量小,系统运行稳定时和业务量大,系统运行缓慢时的对比可分析出:当业务量增大获取消息数明显曾多, pending数(队列内没有管理的消息数)明显增大,消息堵塞,程序员增大消费数效果依然没有改善。

4.日志分析


(1)日志报出大量如下错误,两个JMS服务的三个Queue的名字一样,理论上不会出错,经查询后得知这是weblogic9.2.3的一个bug

Caused by: javax.management.remote.JMXServerErrorException:                                   java.lang.AssertionError: Registered more than one instance with the same objectName :  com.bea:Name=JMSServer,ServerRuntime=AdminServer,Type=JMSServerRuntime new:  com.bea:Name=JMSServer,ServerRuntime=AdminServer,Location=AdminServer,Type=JMSServerRuntime existing com.bea:Name=JMSServer,ServerRuntime=AdminServer,Location=AdminServer,Type=JMSServerRuntime
at weblogic.rmi.internal.ServerRequest.sendReceive(ServerRequest.java:205)
at weblogic.rmi.internal.BasicRemoteRef.invoke(BasicRemoteRef.java:223)
at javax.management.remote.rmi.RMIConnectionImpl_923_WLStub.getAttribute(Unknown
Source)
at javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.
getAttribute (RMIConnector.java:857)
atjavax.management.MBeanServerInvocationHandler.invoke(MBeanServerInvocationHandle
r.java:175)
at  weblogic.mangement.jmx.MBeanServerInvocationHandler.doInvoke  (MB eanServerInvo
cationHandler.java:504)
at weblogic.management.jmx.MBeanServerInvocationHandler.invoke (MB eanServerInverIn
vocationHandler.java:380)
... 90 more
(2)####<2010-10-19 下午012243秒 CST> <Error> <HTTP> <V890-1> <AdminServer> <[ACTIVE] ExecuteThread: '6' for queue: 
'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1287465763371> <BEA-101083> <Connection failure.


java.net.SocketException: 打破的管道

at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at weblogic.utils.io.ChunkedOutputStream.writeTo(ChunkedOutputStream.
java:193)
at weblogic.servlet.internal.ResponseHeaders.writeHeaders(ResponseHeaders.
java:377)
at weblogic.servlet.internal.ServletResponseImpl.writeHeaders(ServletResp
onseImpl.java:1174)
at weblogic.servlet.internal.ServletOutputStreamImpl.sendHeaders(Servlet
OutputStreamImpl.java:243)
at weblogic.servlet.internal.ServletOutputStreamImpl.flush(ServletOutput
StreamImpl.java:108)
at weblogic.servlet.internal.ServletOutputStreamImpl.commit(ServletOutput
StreamImpl.java:446)
at weblogic.servlet.internal.ServletResponseImpl.send(ServletResponseImpl.
java:1336)
atweblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1375)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:181)


broken pipe该错误对应用和系统无害。该问题的发生主要是由于网络不稳定或者客户端强制停止刷新或者关闭浏览器,导致正常的通讯管道被打破,从而出现该错误。另外如果weblogic server和数据库服务器不在同一台主机,会经常有这种情况。

3####<2010-10-19 上午115711秒 CST> <Error> <netuix> <V890-1> <AdminServer> <[ACTIVE] ExecuteThread: '6' for queue: 

'weblogic.kernel.Default (self-tuning)'> <weblogic> <> <> <1287460631815> <BEA-423405> <An exception [java.lang.NoSuchMethodError: org.jdom.Element.addContent(Lorg/jdom/Element;)Lorg/jdom/Element;] was thrown while rendering the content at [null].
com.bea.portlet.adapter.scopedcontent.ActionLookupFailedException: java.lang.NoSuchMethodError: org.jdom.Element.addContent(Lorg/jdom/Element;)Lorg/jdom/Element;
atcom.bea.portlet.adapter.scopedcontent.ScopedContentCommonSupport.
executeAction(ScopedContentCommonSupport.java:699)
atcom.bea.portlet.adapter.scopedcontent.ScopedContentCommonSupport.
processActionInternal(ScopedContentCommonSupport.java:144)
atcom.bea.portlet.adapter.scopedcontent.StrutsStubImpl.processAction(
StrutsStubImpl.java:76)
atcom.bea.portlet.adapter.NetuiActionHandler.raiseScopedAction(
NetuiActionHandler.java:99)
atcom.bea.netuix.servlets.controls.content.NetuiContent.raiseScopedAction
(NetuiContent.java:180)
atcom.bea.netuix.servlets.controls.content.NetuiContent.raiseScopedAction
(NetuiContent.java:168)
atcom.bea.netuix.servlets.controls.content.NetuiContent.handlePostback
Data(NetuiContent.java:222)
at com.bea.netuix.nf.ControlLifecycle$2.visit(ControlLifecycle.java:178)
atcom.bea.netuix.nf.ControlTreeWalker.walkRecursive(ControlTree
Walker.java:351)
atcom.bea.netuix.nf.ControlTreeWalker.walkRecursive(ControlTree
Walker.java:361)
atcom.bea.netuix.nf.ControlTreeWalker.walkRecursive(ControlTree
Walker.java:361)
atcom.bea.netuix.nf.ControlTreeWalker.walkRecursive(ControlTree
Walker.java:361)
atcom.bea.netuix.nf.ControlTreeWalker.walkRecursive(ControlTree
Walker.java:361)
atcom.bea.netuix.nf.ControlTreeWalker.walkRecursive(ControlTree
Walker.java:361)
atcom.bea.netuix.nf.ControlTreeWalker.walkRecursive(ControlTree
Walker.java:361)


存在jdom的两个不同版本,程序调用到jdom某个类的方法时,调用到另外一个版本的jdom导致错误。建议查一下应用的类包和server的类包,不要把自己的jdom放到server的类库中。

(4)####<2010-10-20 上午094017秒 CST> <Error> <HTTP> <V890-1> <epiccms1> <[ACTIVE] ExecuteThread: '41' for queue: 

'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1287538817310> <BEA-101020> <[weblogic.servlet.internal.WebAppServletContext@10a59d2 - appName: 'piccallweb', name: 'piccallweb', context-path: '/piccallweb'] Servlet failed with Exception
java.lang.NumberFormatException: For input string: "undefined"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)
at java.lang.Double.parseDouble(Double.java:482)
at jsp_servlet._daa._tbcb.__uiprpoendaacaculatetax._jspService(__uiprpoen
daacaculatetax.java:190)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run
(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurity
Helper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.
run(WebAppServletContext.java:3244)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(Authenticated
Subject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebApp
ServletContext.java:2010)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServlet
Context.java:1916)
atweblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1366)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:181)


应用前端没有做数据校验,导致数据类型未定义错误

5.解决方案

5.1  针对java应用程序数据库连接池参数的优化


由于程序的数据库连接池没有用weblogic的连接池,而是手动写在程序相关的配置文件中,所有现对开发人员给出如下建议:

      (1)数据库连接池初始数值改为:20

2)数据库最大连接数改为:100

3)增加步长(即一次建立多少个连接):5

5.2 JMS Servers Consumers Curent设置建议


理论上队列中可以有多个消费,但同一时间只能有一个消费接收数据进行处理,其他消费均处于等待状态,只有一个消费完成处理后其他消费才可以继续接收数据,所以增加队列消费数对于增加系统运行速度没有太大增益,建议可取消。

5.3关于WebLogic9.2.3系统bug修订建议


   (1)增加编号  8872943 JMS 9.2 MP4 A Registered more than one instance with the same objectName exception occurs while connecting to two distributed destinations with the same JNDI name.  补丁。

    (2)增加编号 8186074 JMS 9.2 MP4 JMS performance degrades as File Store   

size increases. 补丁

系统性能会随着贮存文件的增加而有所下降,建议打上这个补丁

The system property -DWeblogic.store.MaxFileSize=size has been added to  control File Store size. The specified size will be adjusted internally to fix the proper block size multiple. The minimum size is 10485760, the maximum size is 214635072 (the default). If the File Store cannot be expanded to hold the message, a new file will be created for the message. Note that if the overall message size is greater than the specified file size, a PersistentStoreFatalException will occur.


6.系统调优建议

      经过两天的排查及今天系统运行效果看,WebLogic Server参数设置基本合理,为发现明显的需要调优的地方。现给出如下建议仅供参考:

      i.设置最小堆大小  -Xms  

             BEA 建议将最小堆大小 (-Xms) 与最大堆大小 (-Xmx) 设置为相同的值,以 

             便将垃圾收集的消耗降至最低。

      ii.设置最大堆大小  -Xmx  

              如果与活动数据量相比,最大堆大小值设置得较低,则会因强制进行频繁      

              垃圾收集而降低性能。

      iii.增加数据库连接池Statement Cache Size100

      iv.Connection pool Size AdvanceTest Connections On Reserve 选上,Test  

            Frequency600




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论