如何诊断Tomcat 6突然停止响应?

我运行了许多tomcat实例,偶尔也会停止响应请求 – 每个连接都会超时。

我在Apache 2.2中使用了mod_proxy的AJP。

我通过Apache / AJP通过Tomcat的AJP连接器获取超时,但也通过8080上的直接HTTP连接器。

我在Apache中configuration了/server-status ,它显示了16个当前正在处理的请求,4个空闲请求和200多个没有连接的空闲时隙。 我的AJP连接器configuration为:

 <Connector port="8009" address="localhost" maxThreads="250" minSpareThreads="5" maxSpareThreads="15" connectionTimeout="1000" packetSize="16384" maxHttpHeaderSize="16384" enableLookups="false" redirectPort="8443" emptySessionPath="true" URIEncoding="UTF-8" protocol="AJP/1.3"/> 

所以它应该有足够的线程来接受新的连接。

使用top我看到CPU和等待两个1%和Java进程有80%的内存。 有60M空闲内存和200M免费互换。

我使用了一个特殊的threads.jsp页面

 SystemThreadList stl = new SystemThreadList(); Thread[] allThreads = stl.getAllThreads(); 

它提供了有用的信息,但是在这个状态下它也不加载。

在catalina.log中我看到:

 Mar 07, 2014 11:53:09 AM org.apache.jk.common.ChannelSocket processConnection WARNING: processCallbacks status 2 

并从其他Web请求偶尔活动,但不是我的。

有没有从命令行的方式,或使用一个分析器获得线程和堆栈跟踪列表来找出什么是卡住?

设置Tomcat以使用以下选项启用RMI:

 -Dcom.sun.management.jmxremote.port=12346 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=myhost 

(这是一个例子,不是安全最佳实践的说明…)

使用JDK中的jconsole并连接到您的服务器。

如果Tomcat通过直接的HTTP连接器也没有响应,那么问题不在于AJP,而是在Tomcat内部。

你可以得到一个完整的线程转储写入catalina.out通过发送一个

 kill -quit <tomcat PID>