Tomcat本身closures

我在CentOS 6.5 64位和OpenJDK 1.7 64上运行Tomcat 7.0.53。

偶尔有几台服务器 – 像每周一次随机的 – Tomcat只会优雅地closures。 我一直在看这个月,找不到原因。 唯一的模式似乎是closures的一段长时间没有进行。

  • 我已经升级到最新版本的底层工具(Tomcat,Java等)
  • 我正在运行默认的内存设置
  • 我已经禁用server.xml中的SHUTDOWN
  • 我已经将MySQL移动到另一个框,以确保Tomcat是唯一的实质应用程序(服务器也运行nginx)
  • 我已经validation,我没有System.exit()在我的任何代码。 我没有扫描库,因为我不知道如何做到这一点。 我也不指望我会在那里find任何东西。 为什么图书馆会退出?
  • 我已经启用垃圾回收日志logging。 但是他们看起来相当快 – 就像在0.15s的全面GC

这是其中一台服务器的内存使用情况。 大量的RAM免费。

total used free shared buffers cached Mem: 2006 771 1234 0 176 281 -/+ buffers/cache: 313 1692 Swap: 2047 0 2047 

以下是Catalina.out中的其中一项活动。 你可以看到它开始,然后几个小时没有什么令人兴奋的。 然后优雅地关上,仿佛被告知。

我已经研究这个死亡,并没有蜜蜂能够处理这一点。

有人能为我提出一个行动计划吗?

谢谢

从Server.xml中:

  <Server port="-1" shutdown="__SHUTDOWN__"> 

来自Catalina.out:

 Apr 28, 2014 5:34:50 PM org.apache.tomcat.util.digester.SetPropertiesRule begin WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Valve} Setting property 'remoteIpProxiesHeader' to 'x-forwarded-by' did not find a matching property. Apr 28, 2014 5:34:50 PM org.apache.coyote.AbstractProtocol init INFO: Initializing ProtocolHandler ["http-apr-8080"] Apr 28, 2014 5:34:50 PM org.apache.coyote.AbstractProtocol init INFO: Initializing ProtocolHandler ["ajp-apr-8009"] Apr 28, 2014 5:34:50 PM org.apache.catalina.startup.Catalina load INFO: Initialization processed in 3247 ms Apr 28, 2014 5:34:50 PM org.apache.catalina.core.StandardService startInternal INFO: Starting service Catalina Apr 28, 2014 5:34:50 PM org.apache.catalina.core.StandardEngine startInternal INFO: Starting Servlet Engine: Apache Tomcat/7.0.53 Apr 28, 2014 5:34:59 PM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["http-apr-8080"] Apr 28, 2014 5:34:59 PM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["ajp-apr-8009"] Apr 28, 2014 5:34:59 PM org.apache.catalina.startup.Catalina start INFO: Server startup in 8278 ms Apr 28, 2014 5:41:53 PM org.apache.jasper.compiler.TldLocationsCache tldScanJar INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. Apr 28, 2014 10:32:32 PM org.apache.coyote.AbstractProtocol pause INFO: Pausing ProtocolHandler ["http-apr-8080"] Apr 28, 2014 10:32:32 PM org.apache.coyote.AbstractProtocol pause INFO: Pausing ProtocolHandler ["ajp-apr-8009"] Apr 28, 2014 10:32:32 PM org.apache.catalina.core.StandardService stopInternal INFO: Stopping service Catalina Apr 28, 2014 10:32:32 PM org.apache.coyote.AbstractProtocol stop INFO: Stopping ProtocolHandler ["http-apr-8080"] Apr 28, 2014 10:32:32 PM org.apache.coyote.AbstractProtocol stop INFO: Stopping ProtocolHandler ["ajp-apr-8009"] Apr 28, 2014 10:32:32 PM org.apache.coyote.AbstractProtocol destroy INFO: Destroying ProtocolHandler ["http-apr-8080"] Apr 28, 2014 10:32:32 PM org.apache.coyote.AbstractProtocol destroy INFO: Destroying ProtocolHandler ["ajp-apr-8009"] May 05, 2014 8:10:32 PM org.apache.catalina.core.AprLifecycleListener init INFO: Loaded APR based Apache Tomcat Native library 1.1.29 using APR version 1.3.9. May 05, 2014 8:10:32 PM org.apache.catalina.core.AprLifecycleListener init INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true]. May 05, 2014 8:10:32 PM org.apache.tomcat.util.digester.SetPropertiesRule begin 

Solutions Collecting From Web of "Tomcat本身closures"

有事告诉Tomcat关闭。

Tomcat在“有问题”时(内存不足或其他)不能正常关闭。 当内存不足时,Linux不会正常关闭进程,但会使用kill -9来阻止进程,从而不会在Tomcat日志中留下任何痕迹。

  • kill -15将通过关闭钩子优雅地关闭tomcat。 (答案先前说kill -3这里,这只是导致线程转储。)

  • 一个内部出口()也会优雅地关闭,再次通过关闭钩子。

  • 它可以通过JMX关闭,当然还有Catalina的关闭命令。

所以,有人在某个地方告诉Tomcat这样做。 这不是一些未知的内部“问题”。 这些东西直接杀死tomcat,他们不礼貌地问。

你可能会尝试的一件事是启用DEBUG记录,看看你得到什么闲谈。 如果你得到太多,你可以尝试org.apache.catalina.core.StandardContextorg.apache.catalina.core.StandardContext 。 这可能不会给你比已经记录更多,但它可能会告诉你一些东西。

之后,如果有这样的动机,并继续,我建议你自己建立Tomcat,并插入一些堆栈跟踪转储。

例如,在org.apache.coyote.AbstractProtcol ,可以添加:

 Exception e = new Exception("Shut down trace"); getLog().info("Shutting down protocol", e); 

stop()方法。

这将给你一个坚实的堆栈跟踪,以了解从哪里来。 Tomcat实际上并不是一个只是随机消息而已的恶性事件风暴。 关机非常同步。 所以,这个堆栈跟踪会给你们开始派对的方式带来很大的帮助。 那么你可以从那里看看怎么可能发生。

Tomcat中有大量的接口和抽象,但实际上只有一些实现,所以它不是难以理解的。 有一个烟囱痕迹将有助于巨大的压制下来。

在v7.0.55之前的Tomcat版本中有一个已知的(并且是固定的bug):

https://bz.apache.org/bugzilla/show_bug.cgi?id=56684

该线程是非常好的阅读,但我可以为你总结。 当你启动Tomcat时,有一个等待状态开始等待关机命令。 这是正常的,但这些版本中的错误是等待约50天的隐含超时。 当等待状态超时时,Tomcat将关闭。

所以在Tomcat和NO中发生了一些奇怪的事情,你并不疯狂。 这发生在我发现这个错误之前,我维护了一年多的SOLR集群,并通过升级修复了它。 从来没有人注意到,因为它花了很长时间才能崩溃,所有这一切都可以很容易地刷过去找到根本原因。 最简单的就是重启Tomcat,忘记曾经发生过。

我希望这个答案可以帮助你。 我看到你正在运行一个有这个bug的版本。

祝你好运!

你的Tomcat是如何启动的? 如果有父进程,则发送给父进程的信号可能是干净关闭的原因。