我运行了许多 tomcat 实例,有时有些实例会停止响应请求 - 每次连接都会超时。
我在 Apache 2.2 中将 AJP 与 mod_proxy 结合使用。
我通过 Tomcat 的 AJP 连接器通过 Apache/AJP 遇到超时,但通过 8080 上的直接 HTTP 连接器也遇到超时。
我/server-status
在 Apache 中进行了配置,它显示当前正在处理 16 个请求W
,4 个空闲请求和 200 多个没有连接的开放插槽。我的 AJP 连接器配置如下:
<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
以及来自其他网络请求的偶尔活动,但不是我的。
有没有办法从命令行或使用分析器获取线程和堆栈跟踪列表来找出卡住的原因?
答案1
使用以下选项设置 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 并连接到您的服务器。
答案2
如果 Tomcat 通过直接 HTTP 连接器也没有响应,那么问题就不在于 AJP,而是 Tomcat 内部出了问题。
你可以通过发送一个完整的线程转储来将其写入 catalina.out
kill -quit <tomcat PID>