我有一个旧的Java应用程序正在Tomcat 6上的Java 1.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的另一个连接。我说的对吗?
任何想法都会受到赞赏。
答案 0 :(得分:1)
1)应用程序如何处理读取的数据?可能是因为它无法写入磁盘,正在等待其他条件,有线程锁等。
2)打开新连接,因为无论recvQ为何,这些连接仍在使用中。
关于连接数,您也应该计算一半关闭的连接,这些TCP状态表示连接仍处于活动状态
已建立
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
为进一步解决问题,建议获取线程和/或堆转储并对其进行分析。
Another case涉及TIME_WAIT。