池中没有可用连接,netstat 在 Recv-Q 中显示非零值

No connection available in pool, netstat shows non-zero values in Recv-Q

我有一个旧的 Java 应用程序在 java 1.6 上工作 Tomcat 6. 由于它在环境中的设置方式,很难做任何内部诊断 - 基本上我不能碰它 - 它是一个黑盒子。

应用程序因缺少免费连接而崩溃。限制设置得很高(最多 255 个并行连接)但是,即使打开的连接数是 60,它仍然会崩溃。

netstat显示recvQ中有大量数据(仅举个例子):

tcp    1464      0 localhost:7076 remote-host1:3120 ESTABLISHED
tcp    2512      0 localhost:7611 remote-host2:3120 ESTABLISHED
tcp    6184      0 localhost:4825 remote-host3:3120 ESTABLISHED

我找不到关于此案例的任何有用提示(类似问题在这里:https://serverfault.com/questions/672730/no-connection-available-in-pool-netstat-recvq-shows-high-number)。

题目:
1) 为什么应用程序没有读取所有接收到的数据?
2)因为没有读取到所有的数据,所以又打开了一个到DB的连接。我说的对吗?

任何想法将不胜感激。

1) 应用程序对读取的数据做了什么?可能是无法写入磁盘,正在等待其他条件,存在线程锁等。

2) 打开新连接,因为无论 recvQ 如何,这些连接仍在使用中。

关于连接数,你也应该计算半关闭连接,这些TCP状态意味着连接仍然有效

ESTABLISHED
FIN_WAIT_1
FIN_WAIT_2
TIME_WAIT

在 Linux:
netstat -ant | grep -E 'ESTABLISHED|FIN_WAIT_1|FIN_WAIT_2|TIME_WAIT' | sort -k 6,6

要进一步排除故障,建议获取线程 and/or 堆转储并分析它们。
Another case 涉及 TIME_WAIT.