Tomcat8随机关闭并显示AbstractProtocol.pause错误信息。

10

1. 问题

我在Tomcat上部署了一个Web应用程序,发现它随机地关闭,时间从2到3个小时到2到3天不等。 catalina.out中的日志为:

26224 2015-06-10 13:59:04.110 {http-nio-8080-exec-3} INFO  com.timediff.controller.user.UserProfileController#getUserHome - /user/profile/home done, curUid: 889
26225 10-Jun-2015 14:15:35.050 INFO [Thread-11] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"]
26226 10-Jun-2015 14:15:35.052 INFO [Thread-11] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"]
26227 10-Jun-2015 14:15:35.053 INFO [Thread-11] org.apache.catalina.core.StandardService.stopInternal Stopping service Catalina
26228 10-Jun-2015 14:15:35.058 INFO [localhost-startStop-2] org.springframework.web.context.support.XmlWebApplicationContext.doClose Closing WebApplicationContext for namespace 'timediff-dispatcher-servlet': startup date [Wed Jun 10 13:38:14 CST 2015]; root of context hierarchy
26229 10-Jun-2015 14:15:35.059 INFO [localhost-startStop-2] org.springframework.context.support.DefaultLifecycleProcessor.stop Stopping beans in phase 2147483647
26230 2015-06-10 14:15:35.061 {localhost-startStop-2} INFO  org.quartz.core.QuartzScheduler#standby - Scheduler TimediffScheduler_$_iZu1skaofy1Z1433914696931 paused.
26231 10-Jun-2015 14:15:35.072 INFO [localhost-startStop-2] org.springframework.scheduling.quartz.SchedulerFactoryBean.destroy Shutting down Quartz Scheduler
26232 2015-06-10 14:15:35.072 {localhost-startStop-2} INFO  org.quartz.core.QuartzScheduler#shutdown - Scheduler TimediffScheduler_$_iZu1skaofy1Z1433914696931 shutting down.
26233 2015-06-10 14:15:35.075 {localhost-startStop-2} INFO  org.quartz.core.QuartzScheduler#standby - Scheduler TimediffScheduler_$_iZu1skaofy1Z1433914696931 paused.
26234 2015-06-10 14:15:35.077 {localhost-startStop-2} INFO  org.quartz.core.QuartzScheduler#shutdown - Scheduler TimediffScheduler_$_iZu1skaofy1Z1433914696931 shutdown complete.
26235 10-Jun-2015 14:15:35.082 INFO [localhost-startStop-2] org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.shutdown Shutting down ExecutorService 'quartzThreadPool'
26236 2015-06-10 14:15:35.103 {localhost-startStop-2} INFO  com.timediff.listener.StopMemoryLeakListener#lambda$contextDestroyed$0 - driver: com.mysql.jdbc.Driver@7657b26d is de-registered.
26237 2015-06-10 14:15:35.104 {localhost-startStop-2} INFO  com.timediff.listener.StopMemoryLeakListener#contextDestroyed - AbandonedConnectionCleanupThread shutdown.
26238 10-Jun-2015 14:15:35.150 INFO [Thread-11] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
26239 10-Jun-2015 14:15:35.152 INFO [Thread-11] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]
26240 10-Jun-2015 14:15:35.154 INFO [Thread-11] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
26241 10-Jun-2015 14:15:35.156 INFO [Thread-11] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["ajp-nio-8009"]

在stackoverflow上,这个问题这个问题与我的情况非常相似,但我仍然被困扰。

现在我将详细描述我的问题:

2. 更多细节

2.1 tomcat和jdk版本

Tomcat: 8.0.22
JDK: 1.8.0_45

2.2 catalina.sh中的JVM选项:

CATALINA_OPTS="-server -Xms1g -Xmx1g -XX:MaxMetaspaceSize=512m -Xmn512m 
-XX:SurvivorRatio=8 
-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled 
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70 -XX:+ScavengeBeforeFullGC 
-XX:+CMSScavengeBeforeRemark
-XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails 
-Xloggc:/opt/logs/gc/timediff-gc.log 
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M
-Dsun.net.inetaddr.ttl=120  -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/logs/gc/timediff-oom.hprof  
-Djava.rmi.server.hostname=**.**.**.**
-Dcom.sun.management.jmxremote.port=1099 
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false"

2.3 我的 Web 应用程序中没有与 Tomcat 终止相关的异常日志,我确定我从未调用过 System.exit(),也没有像下面这样的代码块:

try {

} catch(Exception e) {
    // do nothing
}

当我在GC日志中找到了分配失败时:

2015-06-10T15:36:28.589+0800: 3099.795: [GC (Allocation Failure) 3099.795: [ParNew: 419780K->382K(471872K), 0.0125816 secs] 469721K->50348K(996160K), 0.0126820 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
2015-06-10T15:37:30.141+0800: 3161.347: [GC (Allocation Failure) 3161.347: [ParNew: 419838K->372K(471872K), 0.0062445 secs] 469804K->50338K(996160K), 0.0063629 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
2015-06-10T15:38:41.680+0800: 3232.886: [GC (Allocation Failure) 3232.886: [ParNew: 419828K->369K(471872K), 0.0064920 secs] 469794K->50356K(996160K), 0.0066009 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
2015-06-10T15:39:43.222+0800: 3294.428: [GC (Allocation Failure) 3294.428: [ParNew: 419825K->384K(471872K), 0.0058772 secs] 469812K->50372K(996160K), 0.0059823 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
2015-06-10T15:40:54.758+0800: 3365.964: [GC (Allocation Failure) 3365.964: [ParNew: 419840K->388K(471872K), 0.0056674 secs] 469828K->50395K(996160K), 0.0069850 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]

我认为这可能是原因,但TOP和jvisualVM的结果使其不清楚:

在此输入图片描述 在此输入图片描述

web@iZu1skaofy1Z:/usr/local/apache-tomcat-8.0.22/logs$ free -m
             total       used       free     shared    buffers     cached
Mem:          3951       3087        864          0        190        553
-/+ buffers/cache:       2343       1608
Swap:            0          0          0

top - 15:50:05 up 16 days,  5:11,  2 users,  load average: 0.33, 0.17, 0.09
Tasks: 128 total,   2 running, 126 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.8 us,  0.5 sy,  0.0 ni, 98.5 id,  0.0 wa,  0.2 hi,  0.0 si,  0.0 st
KiB Mem:   4046820 total,  3161260 used,   885560 free,   194880 buffers
KiB Swap:        0 total,        0 used,        0 free.   566984 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
27307 web       20   0 2068604 865872  22048 S   0.7 21.4  20:20.28 java
16557 web       20   0 3680756 801708  13740 S   0.0 19.8   2:02.99 java
15597 mysql     20   0 1800972 526220   6636 S   0.0 13.0  36:26.08 mysqld

我在同一台服务器上部署了另一个Tomcat,但是我更改了关闭端口和连接器端口,我认为它们不会冲突。

我已经尽力了,可能在分析过程中忘记了某些内容,请帮我提供一些提示,提前致谢!

更新(2015-07-04):当我在运行Tomcat时从用户web切换到用户root后,问题从未再次发生。因此,我怀疑Tomcat被系统杀死是由于用户权限问题,如果您有任何想法,请告诉我,谢谢!

4个回答

2

这个回答(来自您找到的问题之一)看起来很好。

有些东西正在告诉Tomcat停止。由于当Tomcat以root身份运行时不会发生这种情况,我认为原因是一些其他(非系统)进程(可能是脚本或cron作业)向Tomcat发送信号(可能是SIGTERM),例如kill <tomcat pid>。也许那个其他进程也是以用户web身份运行的 - 这就解释了为什么该进程无法杀死root的Tomcat。或者那个其他进程只是搜索要终止的进程,并且其中一个标准是“由web拥有的进程”。

我建议您仔细阅读用户rootweb的crontab,系统范围的crontab以及/etc/cron.*/文件夹中的所有内容。您还可以检查任何其他由web拥有的进程是否突然终止。按照提到的答案中的建议,从源代码构建Tomcat并添加一些跟踪似乎是个好主意。


1
谢谢你,@Roman。不仅Tomcat,Jetty也有同样的问题。所以我认为这不是Tomcat的问题,可能是线程限制、打开文件限制或类似的问题。我还在解决这个问题,你提供了很好的建议。 - Michael
1
@Daniel 我认为,如果Tomcat达到了某个限制,它不会“优雅地”关闭。至少它应该向日志打印一些错误信息。关于Jetty:当以web方式运行时,它是否也会随机关闭,并且以root方式运行时不会关闭? - Roman

0

0
在我的情况下,我已经更改了startup.sh以使用authbind,然后exec永远无法完成,因此该作业被定期重启。
也许您想要删除所有启动行或重新启动,然后自己调用startup.sh或service tomcat start。在我的情况下,我得到了:
Job for tomcat.service failed because a timeout was exceeded. See "systemctl status tomcat.service" and "journalctl -xe" for details.

0

在我的情况下,由于在HTML和WebServlet的操作中URL模式的误用而导致了相同的错误。 Java中 action="ABC" @webserlet="/ABC"。 对我来说,它运行良好。


你能否在你的回答中添加更多细节/步骤,以便OP可以尝试解决自己的问题? - David Brossard
<form method="post" action="addEmployee"> 现在在Web Servlet部分中使用相同的操作字段和“/”来表示为@WebServlet(“/addEmployee”) - Dachawar prabhakar vijaykumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接