JBOSS 高并发出错(急)


急问!!!!!!!!!!!!!!!!!!


使用 AXIX + JBOSS +ORACLE

在30个并发下运行稳定,在50 个并发时出错

我的 jbossweb-tomcat41.sar\META-INF\jboss-service.xml 的配置为

<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
address="${jboss.bind.address}" port="9999" minProcessors="10" maxProcessors="200"
enableLookups="true" acceptCount="10" debug="0"
connectionTimeout="20000" useURIValidationHack="false"/>

该配置在 axix + Tomcat +oracle 运行环境下运行稳定

我的 JAVA_OPTS为 Set JAVA_OPTS=-Xms400m -Xmx400m,内存肯定没问题,因为 TOMCAT下只用 256就可以了。
何况JBOSS 我去掉了JMS等不用的功能

连接池我配置了 100 个,应该没问题,数据库支持200个。

错误提示如下(部分)

2004-05-24 15:53:51,352 ERROR [org.apache.axis.Message] java.io.IOException:
ClientAbortException: java.net.SocketException: Software caused connection abort: socket write error
at org.apache.coyote.tomcat4.OutputBuffer.realWriteBytes(OutputBuffer.java:404)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:428)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:348)
at org.apache.coyote.tomcat4.OutputBuffer.writeBytes(OutputBuffer.java:432)
at org.apache.coyote.tomcat4.OutputBuffer.write(OutputBuffer.java:419)
at org.apache.coyote.tomcat4.CoyoteOutputStream.write(CoyoteOutputStream.java:108)
at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:334)
at sun.nio.cs.StreamEncoder$CharsetSE.implWrite(StreamEncoder.java:394)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:134)
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:191)
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)
at java.io.BufferedWriter.write(BufferedWriter.java:206)
at java.io.Writer.write(Writer.java:126)
at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:311)
at org.apache.axis.Message.writeTo(Message.java:531)
at org.apache.axis.transport.http.AxisServlet.sendResponse(AxisServlet.java:807)
at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:683)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:339)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.jboss.web.tomcat.security.JBossSecurityMgrRealm.invoke(JBossSecurityMgrRealm.java:220)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.jboss.web.tomcat.tc4.statistics.ContainerStatsValve.invoke(ContainerStatsValve.java:76)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2417)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:65)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:197)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:781)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:549)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:605)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:677)
at java.lang.Thread.run(Thread.java:536)
2004-05-24 15:53:54,430 ERROR [org.apache.axis.Message] java.io.IOException:
ClientAbortException: java.net.SocketException: Software caused connection abort: socket write error
at org.apache.coyote.tomcat4.OutputBuffer.realWriteBytes(OutputBuffer.java:404)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:428)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:348)
at org.apache.coyote.tomcat4.OutputBuffer.writeBytes(OutputBuffer.java:432)
at org.apache.coyote.tomcat4.OutputBuffer.write(OutputBuffer.java:419)

与JBoss无关,这是Tomcat很常见的线程问题,

楼主,我在Tomcat 下使用 该配置 server.xml

<Connector port="9999"
maxThreads="200" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="10"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />

并发用户数可以到达100个

在JBOSS下 Tomcat 配置 jboss-service.xml

<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
address="${jboss.bind.address}" port="9999" minProcessors="10" maxProcessors="200"
enableLookups="true" acceptCount="10" debug="0"
connectionTimeout="20000" useURIValidationHack="false"/>

出现线程异常,是Tomcat配置错误吗?


我觉得出现这总错误 无非是三个原因:

1.数据库库连接达到极限

2.应用服务器 最大线程并发数 达到极限

3.内存耗尽

我在EAServer,Tomcat 作为中间件服务器时 碰到类似问题都是通过调整这三个参数进行解决

但是JBoss中 没有解决掉,有两个问题


1. 以上错误是否是由于上面三个原因引起,有没有其它原因

2. JBoss中如何修改上面 第二个参数

JBoss的deploy /jbosswebxxxxx目录下的META-INF/jboss-service.xml中修改,参考以前一篇有关JBoss 3.23性能优化的文章

你说得是
http://linuxintegrators.com/jbossBlog/bburke/?permalink=Optimizing+JBoss%3A+Experiences+with+SPECj2002.html

我看了这篇文章。没找到什么更好的办法解决线程问题

另外一篇文章和这篇文章有点相似,也写得挺好得

http://www.myj2ee.com/Members/Firedragon/jbosstuning

还有一个讨论JBOSS线程的帖子,也分析得不错

http://www.linux.ie/old-list/45909.html


只这些文章都说明,要提高JBOSS的并发用户数,只要改变\jboss-3.2.3\server\default\deploy\jbossweb-tomcat41.sar\META-INF\jboss-service.xml 中的最大线程数就可以

我更改的结果是
className="org.apache.coyote.tomcat4.CoyoteConnector"
address="${jboss.bind.address}" port="9999" minProcessors="10" maxProcessors="200"
enableLookups="true" acceptCount="10" debug="0"
connectionTimeout="20000" useURIValidationHack="false"/>


这样的结果单独用Tomcat 做中间件服务器是可以正常运行达到一百用户并发测试的

为什么用JBOSS做中间件服务器用户数就是上不去呢?

按道理JBOSS内嵌TOMCAT,并发数和JBOSS应该无关啊――:)

实在不明白


而错误提示抛的又是IO错误,我想是不是其它什么原因?

LOG错误提示如下

2004-05-24 15:53:51,352 ERROR [org.apache.axis.Message] java.io.IOException:
ClientAbortException: java.net.SocketException: Software caused connection abort: socket write error
at org.apache.coyote.tomcat4.OutputBuffer.realWriteBytes(OutputBuffer.java:404)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:428)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:348)
at org.apache.coyote.tomcat4.OutputBuffer.writeBytes(OutputBuffer.java:432)
at org.apache.coyote.tomcat4.OutputBuffer.write(OutputBuffer.java:419)
at org.apache.coyote.tomcat4.CoyoteOutputStream.write(CoyoteOutputStream.java:108)
at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:334)
at sun.nio.cs.StreamEncoder$CharsetSE.implWrite(StreamEncoder.java:394)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:134)
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:191)
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)
at java.io.BufferedWriter.write(BufferedWriter.java:206)
at java.io.Writer.write(Writer.java:126)
at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:311)
at org.apache.axis.Message.writeTo(Message.java:531)
at org.apache.axis.transport.http.AxisServlet.sendResponse(AxisServlet.java:807)
at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:683)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:339)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

单台性能提高有限的情况下,建议你考虑使用JBoss集群了

还有一个原因,Axis和tomcat接口,如果Axis开启tomcat一个线程后,等待tomcat-->Jboss后台处理,但是Axis等待时间太短,当tomcat将后台处理结果返回给Axis时,Axis已经关闭相应通道。

以上只是设想。仅供参考。

线程问题,真的很头疼。。。我发现门户决不能用动态页面。
我说SINA 都是些 HTML 格式。 没发现有ASP PHP JSP 。
就算有我相信,不出一个周肯定要死机。ASP,PHP 我没用过。
不过JSP 我到经历过这样的问题。就算虚拟机优化加上集群2台。
也坚持不过几个周。
真的是亲身体会。

这并非是JBOSS的问题,有兴趣的朋友可以看看我在java视线就同步问题发表的一些帖子。
我可以这样说,一般做的程序很少有能经过测试工具(如loadrunner)进行50个并发测试的。一般说来,在测试20个以内,系统比较稳定,达到30个的时候,系统就开始出错。
对于一个比较严谨的程序员来说,像数据库链接没有释放等程序问题一般是不会(更不应该)存在的,而所谓的系统又是采用好像很好的框架,如struts,hibernate,spring等。其实,抛却以上因素,通不过测试主要是两方面原因:同步没有处理好(准确地讲是不知道在哪些地方该同步,怎么样去控制同步),在处理各种开源框架的时候,自己系统的架构没有搭建好,存在先天的缺陷。
这样的问题很难给你一个好的解决方案,只能依靠你在工作中不断积累经验。

Hi Folks,
Before giving tunning suggestions, let's ask some basic questions:
what the CPU usage, thread count, db active connection count, VM GC behavior? Did you see any spike of any factors above while adding load gradually?
What is inside each invocation? what's the frequence of each test client?

acceptCount="10"
可接受连接10个!大哥怎么并发50个啊?

毫无疑问,门户不可能使用动态页面,否则应用服务器不挂,数据库系统也早挂了。门户全都是生成静态页面的。。。有没有注意每个门户的评论页非常慢?因为评论页post了请求,而且要写本地存储(数据库。。。文件。。。什么的)