0

我有一个在 Tomcat 6 上运行 java 1.6 的旧 Java 应用程序。由于它在环境中的设置方式,很难进行任何内部诊断 - 基本上我无法触摸它 - 它是一个黑盒。

由于缺少免费连接,该应用程序正在崩溃。限制设置得很高(最多 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)由于没有读取所有数据,因此打开了另一个与数据库的连接。我对吗?

任何想法将不胜感激。

4

1 回答 1

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

为了进一步排除故障,建议获取线程和/或堆转储并分析它们。
另一个涉及 TIME_WAIT 的案例。

于 2018-07-27T16:12:02.470 回答