为什么我的TOMCAT会隔了一段时间死掉?

我在solaris上装了一个tomcat 4.1.24, 用jd2连接apache,但是,隔一段时间,tomcat就会死掉,现在只能写一个监控程序隔一段时间检查tomcat是否死掉。。。

查看日志:里面有很多broken pipe的错误,如下:
StandardWrapperValve[default]: Servlet.service() for servlet default threw exception
java.io.IOException: Broken pipe
at java.net.SocketOutputStream.socketWrite(Native Method)
at java.net.SocketOutputStream.write(SocketOutputStream.java:91)
at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:407)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:599)
at org.apache.jk.server.JkCoyoteHandler.doWrite(JkCoyoteHandler.java:216)
at org.apache.coyote.Response.doWrite(Response.java:524)
at org.apache.coyote.tomcat4.OutputBuffer.realWriteBytes(OutputBuffer.java:384)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:439)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:359)
at org.apache.coyote.tomcat4.OutputBuffer.writeBytes(OutputBuffer.java:411)
at org.apache.coyote.tomcat4.OutputBuffer.write(OutputBuffer.java:398)
at org.apache.coyote.tomcat4.CoyoteOutputStream.write(CoyoteOutputStream.java:110)
at org.apache.catalina.servlets.DefaultServlet.copyRange(DefaultServlet.java:1996)
at org.apache.catalina.servlets.DefaultServlet.copy(DefaultServlet.java:1745)
at org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:1073)
at org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:506)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
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)

请教大家有没有类似的经验和解决办法,谢谢!

我也遇到了这个问题。不知谁能回答一下。先顶一下。

你的请求数目太大造成的,你可以测下,能响应多少个请求/秒,而不出错。
www.5272.com是我的网站,有什么问题,可以去那里找我

我也遇到这个问题,其实我服务器的负载并不重,可是很奇怪,过一段就会当掉

不知道你的问题解决了没有,有没有经验可以谈谈,多谢

我这里也是这样,上网也没找到好的解决方案,总要过一段时间重启一下,都不知道是不是该写个线程监测一下,发现 Server 超过多少时间不响应了就重启

简单描述一下吧,我这里在一台 DELL 2650 2 XEON CPU + 1G RAM + 72G HD 服务器上就启了一个tomcat service, 因为公司人员也就 1k 左右,所以不想搞得太复杂,所以没搞 cluster.

最近我也发现负载不是很重的情况下,老是出现 tomcat 僵死的现象。
查 log 发现

2003-11-14 12:03:56 Broken pipe
2003-11-14 12:04:25 Broken pipe
2003-11-14 12:04:25 Connection reset
2003-11-14 12:53:41 StandardWrapper[/forum:mainservlet]: Waiting for 195 instance(s) to be deallocated
2003-11-14 12:53:41 StandardWrapper[/forum:default]: Waiting for 1138 instance(s) to be deallocated

真不知道这 1k 多的 instance 是哪来的????

我也碰到过类似的问题,并找出些问题,但是还是会隔段时间出现这种情况,不知道谁的TOMCAT服务器能够很稳定,并有之相关经验?我就先抛砖引玉吧:)。

(1)由于数据库的问题,由于事务引起数据库死锁。
这样修改程序就可以解决的。
(2)LINUX做WEB服务器时,由于它的线程机制会产生JVM出错的问题。
必须在/etc/profile 加上 export _JAVA_SR_SIGNUM = 12(或16)
(3)有时会出现“tomcat最大线程数被耗尽”类似的错误提示。
我就把TOMCAT代码里的最大线程数放大到200,不过有时还会有这样的错误提示,不过相对以前的频率感觉好多了。。。

这些就是我碰到过的问题,希望大家能把自己碰到的问题和相应的解决方法交流下:)

我做了 LoadBalance,并把线程数开到了 1000 发现问题有所缓解,但是有时服务响应很慢,于是,开始怀疑网络资源有问题~~

在一个很偶然的情况下,看到 log 里有一个连 LDAP 服务 time out 的提示,那台服务器在美国,不属于我们中国区管,于是分析,可能是因为连这个服务器时 Web 服务器的 Queue 被堵塞了,于是后面的请求就被挂起了,所以很慢~~ 于是查核,发现那台美国的 LDAP server 已经改变了 IP, 并没有通知我们,在修改 Application 的 Configuration 后,系统开始提供稳定快速的服务。

另,在这次排错过程中,因为我还注意到有一个 Connection Refused 的错误,因为深圳与其它 China site 的分公司使用了同一个管理帐号来进行数据的 search, 所以,我怀疑是不是 LDAP 服务器对同一个帐号的登录次数有所限制(我向 AD 管理员咨询,他也不是很清楚),所以,我又请管理员开了一个给我专用的帐号。

经过以上动作,现在系统没有什么大的问题了~~

这中问题,我最有体会!!!! 我们工资用TOMCAT 作了 50多个虚拟主机!!! 还有一个tomcat 做了一个虚拟主机!!!

都发现了这种情况,看到大家分析后,加上自己的问题终结:

原因如下:

资源!!! 没有完全释放!!! 用完后要父NULL 值!!
数据库连接顺序关闭!!
优化JAVA虚拟机 加入相应的内存参数!
TOMCAT 在LINUX 下不是很稳定!
String 类型使用,不符合规范!!
不要在数据库中获取大段文本!!!
JAVA 不推荐 用String 获取大量信息,造成内存溢出就是它!!!

每隔一段时间后,重新启动服务器,是必要的!!
大约2个周左右吧。。。

----------
我遇到的问题,差不多就是这些了! 欢迎指教!!

to salajon:
你说的几种情况我在linux,jrun4环境下基本都遇到过,tomcat用的不多:

1),取到连接,程序还是出错/报异常,连接没有及时释放,造成下次从池中取了相同的连接,却不可以正常使用;
--将data-source的remove-on-exceptions设成true,……
(2),俺们商用机上使用的j2se版本还停留在1.3.1版本上,有几次jrun的某个server都会自己down掉,
错误提示信息显示,java虚拟机当时的线程(Current Java Thread)出了问题;
--Sun的建议是升级J2SE到1.4;
(3),特别是高峰期,信息流量特大,连接数还是经常超支。
--app server优化的一部分

不知道Weblogic,会不会出现类似的问题,没正式商用过!

btw: export _JAVA_SR_SIGNUM = 12(或16)??这个是啥意思?请赐教!

楼上的,别客气,你问的具体说明请看下面的:

http://screaming-penguin.com/main.php?storyid=1651

--posted by: cooper
Below is a clipping from Sun on working around JVM crashes under high
thread counts in the JVM 1.3 for Linux

On Linux, use a larger signal number for hotspot thread
suspension/resumption handler. The signal number being used is
specified by environment variable _JAVA_SR_SIGNUM. Setting it to a
number larger than SIGSEGV (11) will solve the problem. A good number
to use is 12, which is SIGUSR2. Using signal 16 to work around the
problem might have potential problems. So on tcsh, "setenv
_JAVA_SR_SIGNUM 12" can solve the problem.

感谢感谢!

在SUN的网站上看到过

会不会是这个原因?

今天试验一个程序,想在java程序中实现防止盗链的功能。
想法是用filter拦截所有请求,然后检测requestURI的后缀是否为保护文件类型。
如果是则再检测该请求header中的referer变量。如果是来自本站的地址,则允许下载,否则不允许下载。
在tomcat下测试成功,但和apache整合后发现apache只把jsp等需要tomcat解释的程序文件发送给tomcat处理(在apache的http.conf中配置的类型),别的文件直接处理请求,不经过filter。所以无奈之下只好把所有的文件都让apache递交给tomcat。
结果每当请求mp3等较大的文件时,就报上面那个错(即使只有一个请求的时候)。
所以有可能也是你的apache中jk没配置正确的原因。

顶下先,我现在也碰到这类问题 tomcat无缘无故down了 后台还没报错 想请问楼主你那个监控程序怎么写的啊?