我有以下环境: Nginx(http) - > Apache2(AJP) - > Tomcat中。
有时候我在tomcat机器上看到netstat输出中的RecvQ已满(101 - ajp连接器中最大接受) 在这一刻,我从jvm得到了一个堆栈跟踪。我发现201个线程(ajp连接器中的最大线程数)如下所示:
Locked ownable synchronizers:
- <0x00000001198fe520>, (a java/util/concurrent/ThreadPoolExecutor$Worker)
Thread 83765: (state = IN_NATIVE)
- java.net.SocketInputStream.socketRead0(java.io.FileDescriptor, byte[], int, int, int) @bci=0 (Compiled frame; information may be imprecise)
- java.net.SocketInputStream.socketRead(java.io.FileDescriptor, byte[], int, int, int) @bci=8, line=116 (Compiled frame)
- java.net.SocketInputStream.read(byte[], int, int, int) @bci=117, line=171 (Compiled frame)
- java.net.SocketInputStream.read(byte[], int, int) @bci=11, line=141 (Compiled frame)
- org.apache.coyote.ajp.AjpProcessor.read(byte[], int, int) @bci=25, line=312 (Compiled frame)
- org.apache.coyote.ajp.AjpProcessor.readMessage(org.apache.coyote.ajp.AjpMessage) @bci=14, line=367 (Compiled frame)
- org.apache.coyote.ajp.AjpProcessor.process(org.apache.tomcat.util.net.SocketWrapper) @bci=115, line=118 (Compiled frame)
- org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(org.apache.tomcat.util.net.SocketWrapper, org.apache.tomcat.util.net.SocketStatus) @bci=248, line=637 (Compiled frame)
- org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run() @bci=106, line=316 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=95, line=1142 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=617 (Compiled frame)
- org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run() @bci=4, line=61 (Compiled frame)
- java.lang.Thread.run() @bci=11, line=748 (Compiled frame)
应用程序不会响应任何请求。问题出在哪儿? Linux内核?网络? Java的? Tomcat的?