Tomcat自行关闭

时间:2014-05-06 14:28:43

标签: java linux tomcat

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

偶尔会有几台服务器 - 比如每周随机一次 - Tomcat会优雅地关闭自己。我好几个月都在看这个,但找不到原因。唯一的模式似乎是关闭后很长时间没有任何事情发生。

  • 我已升级到最新版本的底层工具(Tomcat,Java等)
  • 我使用默认内存设置
  • 运行
  • 我已在server.xml中禁用了SHUTDOWN
  • 我已将MySQL移至另一个框以确保Tomcat是唯一的实体应用程序(服务器也运行nginx)
  • 我已经验证我的任何代码中都没有System.exit()。我没有扫描libs,因为我无法弄清楚如何做到这一点。而且我也不希望我会在那里找到任何东西。为什么图书馆会退出呢?
  • 我启用了垃圾收集的日志记录。但它们似乎很快 - 就像0.15秒的完整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

5 个答案:

答案 0 :(得分:7)

有事告诉Tomcat关闭。

Tomcat在“遇到麻烦”(内存不足或其他任何问题)时无法正常关闭。当内存不足时,Linux没有正常关闭进程,它会使用kill -9来阻止它们,这样就不会在Tomcat日志中留下任何痕迹。

  • kill -15将通过关闭挂钩正常关闭tomcat。 (之前的答案是kill -3,这只是导致线程转储。)

  • 内部退出()也将通过关闭钩子正常关闭它。

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

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

您可能尝试的一件事是启用DEBUG进行日志记录,以查看您获得的聊天内容。如果你得到太多,你可以尝试专门查看org.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中有很多接口和抽象,但实际上只有少数几个实现,所以它并不是难以理解的。吸烟堆栈的痕迹将极大地帮助将其固定下来。

答案 1 :(得分:0)

你的Tomcat是如何开始的?如果存在父进程,则发送给父进程的信号可能是干净关闭的原因。

答案 2 :(得分:0)

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

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

线程非常好读,但我可以为你总结一下。启动Tomcat时,会出现等待shutdown命令的等待状态。这是正常的,但这些版本中的错误是这个等待大约50天的隐式超时。当等待状态超时时,Tomcat将关闭。

所以Tomcat中发生了奇怪的事情,没有,你不是疯了。这种情况发生在SOLR集群中,在我发现此错误并通过升级修复之前,我维护了一年多。没有人注意到,因为崩溃需要很长时间才能完成所有这一切,因此很容易找到根本原因。最简单的事情就是重新启动Tomcat并忘记它曾发生过。

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

祝你好运!

答案 3 :(得分:0)

DC / OS中的案例

最近我们发生了类似事件。我们的tomcat作为DC/OS环境中的服务在docker中运行。 stderr刚刚说tomcat被杀了,tomcat的任何日志文件都没有有用的痕迹。

原来,原因很简单,我们没有为服务分配足够的内存。更多调试建议是here,但我们使用的关键技术是检查内核日志:

# journalctl -f _TRANSPORT=kernel
...
Mar 29 15:09:09 host-17 kernel: Memory cgroup out of memory: Kill process 7935 (java) score 1021 or sacrifice child
Mar 29 15:09:09 host-17 kernel: Killed process 7906 (java) total-vm:11583840kB, anon-rss:1032860kB, file-rss:30924kB, shmem-rss:0kB
...

一旦我们发现了,我们增加了DC / OS中服务的内存分配,问题就解决了。

答案 4 :(得分:0)

您的Tomcat如何启动?如果存在父进程,则发送到父进程的信号可能是干净关闭的原因。我建议将div[contenteditable]:empty:before { content: '-'; } div[contenteditable]:focus:before { color: transparent; } 选项添加到set -m中。