我有一个在 Windows(Citrix 机器)上运行的 Java 程序,它向 Linux 上的 Java 应用程序服务器发送请求;这种调度机制都是自定义的。
Windows Java 程序(我们称之为它W
)打开一个监听套接字到操作系统给定的端口,比如 1234 以接收结果。然后它通过“业务请求”调用服务器上的“调度”服务。该服务将请求拆分并发送到其他服务器(我们称之为它们S1 ... Sn
),并将作业数量同步返回给客户端。
在我的测试中,有 13 个作业被分派到多个服务器,并且在 2 秒内,所有服务器都完成了它们的作业并尝试将结果发送回W
's 套接字。
我可以在日志中看到收到了 9 个作业W
(这个数字因测试而异)。所以,我试着寻找剩下的 4 个工作。如果我netstat
在这个 Windows 盒子上做一个,我看到 4 个套接字是打开的:
TCP W:4373 S5:48197 ESTABLISHED
TCP W:4373 S5:48198 ESTABLISHED
TCP W:4373 S6:57642 ESTABLISHED
TCP W:4373 S7:48295 ESTABLISHED
如果我W
执行java.net.SocketInputStream.socketRead0(Native Method)
.
如果我在每个S
框上执行 a netstat
,我会看到一些字节仍在发送队列中。此字节数在 15 分钟内不会移动。(以下是netstat
s在不同机器上的聚合):
Proto Recv-Q Send-Q Local Address Foreign Addr State
tcp 0 6385 S1:48197 W:4373 ESTABLISHED
tcp 0 6005 S1:48198 W:4373 ESTABLISHED
tcp 0 6868 S6:57642 W:4373 ESTABLISHED
tcp 0 6787 S7:48295 W:4373 ESTABLISHED
如果我对服务器进行线程转储,我会看到线程也卡在
java.net.SocketInputStream.socketRead0(Native Method)
. 我期待一个写,但也许他们正在等待一个ACK?(这里不确定;它会在 Java 中显示吗?不应该由 TCP 协议直接处理吗?)
现在,非常奇怪的是:15 分钟后(而且总是 15 分钟),收到结果,关闭套接字,一切都照常进行。
这以前总是有效的。S
服务器移动到不同的数据中心,因此不再W
位于S
同一个数据中心。此外,S
是在防火墙后面。所有端口都应该在S
和之间获得授权W
(我被告知)。谜团真的是15分钟的延迟。我认为这可能是针对 DDOS 的一些保护?
我不是网络专家,所以我寻求帮助,但没有人可以帮助我。我花了 30 分钟和一个人用 Wireshark(以前的 Ethereal)捕获数据包,但出于“安全原因”,我无法查看结果。他必须对此进行分析并回复我。我询问了防火墙日志;相同的故事。
我不是这些盒子的 root 或管理员,现在我不知道该怎么办......我不期待你们提供解决方案,但是关于如何进步的一些想法会很棒!