繁体   English   中英

Tomcat停止响应JK请求

[英]Tomcat stops responding to JK requests

我对挂起的负载平衡Tomcat服务器有一个讨厌的问题。 任何帮助将不胜感激。

系统

我在位于另一台充当负载平衡器的服务器后面的三台服务器上的HotSpot Server 14.3-b01(Java 1.6.0_17-b04)上运行Tomcat 6.0.26。 负载平衡器运行Apache(2.2.8-1)+ MOD_JK(1.2.25)。 所有服务器都在运行Ubuntu 8.04。

Tomcat的配置有2个连接器:一个AJP和一个HTTP。 AJP将与负载均衡器一起使用,而HTTP由开发团队使用以直接连接到选定的服务器(如果有理由的话)。

我在Tomcat服务器上安装了Lambda Probe 1.7b,可以帮助我诊断和解决即将描述的问题。

问题

问题出在这里:应用服务器启动大约1天后,JK Status Manager开始报告Tomcat2的状态ERR 它只会卡在这种状态,到目前为止,我发现的唯一解决方法是ssh并重新启动Tomcat。

我还必须提到,当有Tomcat服务器处于这种状态时,JK状态管理器需要花费很多时间来刷新。

最后,在JK Status Manager上卡住的Tomcat的“忙碌”计数始终很高,并且本身不会下降-我必须重新启动Tomcat服务器,等待,然后在JK上重置工作服务器。

分析

由于每个Tomcat(AJP和HTTP)上都有2个连接器,因此我仍然可以通过HTTP连接到应用程序。 这样的应用程序运行得很好,非常非常快。 这是完全正常的,因为我是唯一使用此服务器的服务器(因为JK停止将请求委派给该Tomcat)。

为了更好地理解问题,我从不再响应的Tomcat和最近重新启动的另一个(例如1小时前)重新启动的Tomcat中提取了一个线程转储。

正常响应JK的实例显示大多数TP-ProcessorXXX线程处于“可运行”状态,并具有以下堆栈跟踪:

java.net.SocketInputStream.socketRead0 ( native code )
java.net.SocketInputStream.read ( SocketInputStream.java:129 )
java.io.BufferedInputStream.fill ( BufferedInputStream.java:218 )
java.io.BufferedInputStream.read1 ( BufferedInputStream.java:258 )
java.io.BufferedInputStream.read ( BufferedInputStream.java:317 )
org.apache.jk.common.ChannelSocket.read ( ChannelSocket.java:621 )
org.apache.jk.common.ChannelSocket.receive ( ChannelSocket.java:559 )
org.apache.jk.common.ChannelSocket.processConnection ( ChannelSocket.java:686 )
org.apache.jk.common.ChannelSocket$SocketConnection.runIt ( ChannelSocket.java:891 )
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run ( ThreadPool.java:690 )
java.lang.Thread.run ( Thread.java:619 )

卡住的实例显示大多数(全部?)TP-ProcessorXXX线程处于“等待”状态。 这些具有以下堆栈跟踪:

java.lang.Object.wait ( native code )
java.lang.Object.wait ( Object.java:485 )
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run ( ThreadPool.java:662 )
java.lang.Thread.run ( Thread.java:619 ) 

我不了解Tomcat的内部原理,但我可以推断出“等待”线程只是位于线程池上的线程。 因此,如果它们是在线程池中等待的线程,那么Tomcat为什么不将其用于处理来自JK的请求?

编辑:我不知道这是否正常,但是Lambda探针在状态部分向我显示,有许多线程处于KeepAlive状态。 这与我遇到的问题有某种关系吗?

解?

因此,正如我之前所说的,我发现的唯一解决方法是停止Tomcat实例,停止JK worker,等待后者的忙碌计数逐渐下降,再次启动Tomcat,然后再次启用JK worker。

是什么导致此问题? 我应该如何进一步调查? 我该怎么解决?

提前致谢。

您是否配置了JVM内存设置和垃圾回收? 您可以在设置CATALINA_OPTS的位置执行此操作

例子:

CATALINA_OPTS="$CATALINA_OPTS -server -Xnoclassgc -Djava.awt.headless=true"
CATALINA_OPTS="$CATALINA_OPTS -Xms1024M -Xmx5120M -XX:MaxPermSize=256m"
CATALINA_OPTS="$CATALINA_OPTS -XX:-UseParallelGC"
CATALINA_OPTS="$CATALINA_OPTS -Xnoclassgc"

GC设置是最佳的多种哲学。 这取决于您正在执行的代码类型。 上面的配置最适合JSP密集型环境(使用标记库而不是MVC框架)。

检查您的Keepalive时间设置。 看来您正在使线程进入保持活动状态,并且它们不会超时。 看来您的服务器没有在合理的时间内检测到客户端断开连接。 有几个超时和计数变量。

首先检查您的日志文件。

我认为默认日志文件位于/var/log/daemon.log中。 (此文件不只包含来自tomcat的日志)

Weblogic也有类似的问题。 原因是太多的线程正在等待网络响应,而Weblogic的内存不足。 Tomcat的行为可能与此相同。 您可以尝试的操作有:

  • 减少连接的超时值。
  • 减少同时连接的总数,以使tomcat在达到该数量时不会启动新线程。
  • 易于修复,但不能纠正根本原因:可能是tomcat处于内存不足状态,即使它尚未显示在日志中也是如此。 如前所述增加tomcat的内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM