Java 在突然出现大量流量后,Tomcat8接受了新的连接,但没有响应
我们正在生产环境中运行Tomcat8.0.26。在常规部署之后,我们将流量切换到新部署的tomcat集群。当时每个节点上的rps大约为800。然后我们发现所有节点都运行良好,只有一个节点接受了连接,但没有响应。来自客户端的所有连接都挂起,直到超时。然后,我关闭了该节点的通信,并捕获了一些状态:Java 在突然出现大量流量后,Tomcat8接受了新的连接,但没有响应,java,multithreading,tomcat,Java,Multithreading,Tomcat,我们正在生产环境中运行Tomcat8.0.26。在常规部署之后,我们将流量切换到新部署的tomcat集群。当时每个节点上的rps大约为800。然后我们发现所有节点都运行良好,只有一个节点接受了连接,但没有响应。来自客户端的所有连接都挂起,直到超时。然后,我关闭了该节点的通信,并捕获了一些状态: 日志中未发现致命错误或异常 没有 只有几个tomcat工作线程,它们都停在那里等待新任务 http-nio2-8081-exec-613“#11568守护程序prio=5 os_prio=0 tid=0x
http-nio2-8081-exec-613“#11568守护程序prio=5 os_prio=0 tid=0x00007f710a66000 nid=0xb202等待条件[0x00007f70fee03000]
java.lang.Thread.State:等待(停车)
在sun.misc.Unsafe.park(本机方法)
-停车等待(java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
位于java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
位于java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
位于java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
位于org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:103)
位于org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:31)
位于java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
位于org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
运行(Thread.java:745)
wget
但服务器没有响应时,可以建立连接
$wget localhost:8081
--2015-09-06 19:25:39-- http://localhost:8081/
解析本地主机…::1127.0.0.1
正在连接到本地主机|:::1 |:8081…已连接。
HTTP请求已发送,正在等待响应。。。
lsof
输出:
$lsof-n-i tcp:8081
命令PID用户FD类型设备大小/关闭节点名称
java 34609 web_服务器49u IPv6 2195777660 0T0TC*:tproxy(侦听)
wget 41834 web_服务器3u IPv4 2198776305 0t0 TCP 127.0.0.1:37324->127.0.0.1:tproxy(已建立)
这就是我观察到的情况。有人能给我一些关于这个问题的提示吗?在有很多线程的地方尝试这个可能会更成功。可能它们都卡在锁上了还是什么?线程转储可能会帮助您找到线程卡在的位置。@Gray我想没有。我还检查了每个线程的状态,没有线程被锁定被什么东西挡住了。