【发布时间】:2014-06-23 05:39:54
【问题描述】:
我在 CentOS 6.5 64 位和 OpenJDK 1.7 64 上运行 Tomcat 7.0.53。
我有几台服务器,偶尔——比如每周随机一次——Tomcat 会优雅地自行关闭。我已经看了几个月了,找不到原因。唯一的模式似乎是在很长一段时间内什么都没有发生,然后关闭。
- 我已升级到最新版本的底层工具(Tomcat、Java 等)
- 我正在使用默认内存设置运行
- 我在 server.xml 中禁用了 SHUTDOWN
- 我已将 MySQL 移至另一个盒子,以确保 Tomcat 是唯一的实质性应用程序(服务器也运行 nginx)
- 我已验证我的任何代码中都没有 System.exit()。我没有扫描库,因为我不知道该怎么做。而且我也不指望我会在那里找到任何东西。为什么图书馆会退出?
- 我已启用垃圾收集的日志记录。但它们看起来非常快 - 就像 0.15 秒内的完整 GC 一样
这是其中一台服务器的内存使用情况。大量可用内存。
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
【问题讨论】:
-
使用分析器实时评估应用程序。您还应该分析堆转储和线程转储,以便更好地了解应用程序中的问题。
-
很难说,但是tomcat关机一般是因为一两件事。 1)它正在泄漏 ThreadLocals,检查您的 JDBC 驱动程序,这是最常见的来源。 2) 服务器或其应用程序之一已不可恢复地崩溃(例如在本机代码中)。编辑:还明确调用关闭挂钩。 :)
-
我最初的直觉是,这不是从服务器内部发生的,而是操作系统中的某些东西导致关机。但我一点也不知道这可能是什么神奇的过程。
-
在 server.xml 中更改您的 tomcat 端口(特别是您的关闭端口)并更新您的 tomcat 脚本,该脚本在调用时关闭/开始记录并拍摄正在运行的快照。另外,您是否有多个版本的 tomcat 正在运行或其他可能会影响您的关闭侦听器端口的东西?
-
检查您的应用程序没有内存泄漏查看这里的第二个答案stackoverflow.com/questions/6470651/…