我运行了许多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>