当前位置:  开发笔记 > 编程语言 > 正文

Tomcat停止响应JK请求

如何解决《Tomcat停止响应JK请求》经验,为你挑选了0个好方法。

对于挂起的负载均衡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状态管理器开始报告ERRTomcat2的状态.它只会停留在这种状态,我到目前为止找到的唯一修复是ssh框并重启Tomcat.

我还必须提到,当处于此状态的Tomcat服务器时,JK状态管理器需要花费更长的时间来刷新.

最后,JK状态管理器上卡住的Tomcat的"繁忙"计数总是很高,并且本身不会下降 - 我必须重新启动Tomcat服务器,等待,然后重置JK上的worker.

分析

由于每个Tomcat(AJP和HTTP)上有2个连接器,我仍然可以通过HTTP连接到应用程序.这个应用程序工作正常,非常非常快.这是完全正常的,因为我是唯一使用此服务器的人(因为JK停止将请求委托给此Tomcat).

为了更好地理解这个问题,我从一个没有响应的Tomcat中获取了一个线程转储,并从最近重新启动的另一个(例如,1小时前)开始.

正常响应JK的实例显示大多数处于"Runnable"状态的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工作,等待后者的繁忙计数慢慢下降,再次启动Tomcat,再次启用JK worker.

是什么导致了这个问题?我该如何进一步调查呢?我该怎么做才能解决它?

提前致谢.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有