TOMCAT崩溃事件

TOMCAT崩溃事件

TOMCAT崩溃事件

http://www.blogjava.net/tedeyang/archive/2008/06/04/205740.html

今天一大早产品一部项目经理就来找我,他们的一台服务器昨天晚上tomcat服务崩溃,还不能重启服务,最后将服务器重启才OK。
我将事件过程和分析过程记录如下:

服务器:win 2000 sp4,apache 2 + tomcat 5.0 采用mod_jk级联。内存2G,硬盘剩余空间充足,CPU基本空闲。
主要应用:J2EE 1.4,JDBC(连接另一台mysql服务器)
崩溃时间: 2008-6-3 18:37:50

一.各种日志综合如下:

   1.37分45秒,操作系统事件中诺顿杀毒软件报内存过低警报
   2.37分45秒,web应用抛出JDBC连接异常:

2008 - 06 - 03  18 : 37 : 45  cn. * .db.DBManager.getConnection(DBManager.java: 157 ) ERROR swim.db.DBManager   com.mysql.jdbc.CommunicationsException: Communications link failure due  to  underlying exception:
**  BEGIN  NESTED EXCEPTION  **
java.net.SocketException
MESSAGE: java.net.SocketException: No buffer 
space  available (maximum connections reached?): JVM_Bind


   3.37分50秒,tomcat抛出session无法save异常:

2008 - 06 - 03  18 : 37 : 50  ERROR -  IOException  while  saving persisted sessions: java.io.FileNotFoundException: "izzs"SESSIONS.ser (系统资源不足,无法完成请求的服务。)
java.io.FileNotFoundException: "izzs"SESSIONS.ser (系统资源不足,无法完成请求的服务。)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.
< init > (FileOutputStream.java: 179 )
    at java.io.FileOutputStream.
< init > (FileOutputStream.java: 70 )
    at org.apache.catalina.session.StandardManager.doUnload(StandardManager.java:
511 )
    at org.apache.catalina.session.StandardManager.unload(StandardManager.java:
485 )
    at org.apache.catalina.session.StandardManager.stop(StandardManager.java:
687 )
    at org.apache.catalina.core.StandardContext.stop(StandardContext.java:
4496 )
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:
3037 )
    at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:
4658 )
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:
1619 )
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:
1628 )
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:
1628 )
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:
1608 )
    at java.lang.Thread.run(Thread.java:
534 )


 

二.简单分析

崩溃原因:内存不足导致资源不足,引起Tomcat的session崩溃。
  这台服务器上运行着很多应用,是什么原因引起内存不足还无法确定。
初步判断罪魁祸首可能是apache,该进程平常占用500MB内存,经常会飚到1G以上。

Apache2的配置文件中:KeepAlive=On,MaxKeepAliveRequests=100,KeepAliveTimeout=15,分析aceess.log文件可以发现每个页面触发的request数量在10个以下,点击率较低,可能使连接过多。
我建议将keepAlive设为off,增加CPU负载,降低内存消耗。

三.效果

 有待观察......

参考资料:
http://www.withend.com/post/78.html

四.结局 
时隔一天,晚上九点再次崩溃,黑暗事件重演。
这一次,我才得知原来该apache还配置有其他域名,于是调出该域名下的access.log。项目经理去了机房,在轰轰地风扇声中打电话给我,让我分析分析。
仔细看访问日志,发现原来有N多Connect 443连接,443是什么?是SSL端口!HTTPS!,Connect命令则显然是代理功能!
而且这些connect的IP来自全球各地,加拿大、美国、澳洲、新西兰、北京、上海、英国、哪都有。
看来这台服务器是被人当代理服务器用了。
怪不得半夜会死机,人家西半球那时正大白天撒欢儿呢。

问题就出在apache的配置上,由于应用众多,并且这台服务器还是其他几台web服务器的对外出口,因此apache中配置了反向代理,不过不小心把正向代理(mod_proxy模块的ProxyRequests指令)也打开了。
看看apache2.0的官方文档中mod_proxy部分,里面明明白白写着:

警告
在您没有对服务器采取安全措施之前,请不要用ProxyRequests启用您的代理。一个开放的代理服务器不仅对您的网络有威胁,对整个因特网来说也同样如此。
真的是很有威胁!大量代理请求急剧消耗内存,最终造成死机!

解决办法就是把正向代理关掉: ProxyRequests Off

你可能感兴趣的:(TOMCAT崩溃事件)