java套接字延迟30秒?

时间:2011-10-12 05:10:18

标签: java sockets tcp latency

在我用Java编写的TCP服务器中,有时随机客户端的延迟时间为5到60秒。当发生这种情况时,服务器有足够的可用内存和cpu。发生这种情况时,套接字已经打开。

这对某些客户端是随机发生的。 java进程继续,好像数据已发送一样,但服务器不会物理地发送/接收数据。

我已禁用Nagle但我不知道Nagle如何导致这种延迟。

我不是很具体,因为我对此感到困惑。从理论上讲,这会导致什么?

另一件事:当其中一个客户端有这么糟糕的延迟时,其他客户端运行正常。它们都在服务器的同一个以太网接口上。我无法解释这样的事情。

2 个答案:

答案 0 :(得分:4)

  

理论上究竟会导致什么?

理论原因包括:

  • 客户端代码中的错误。如果不查看代码,很难说它会是什么,但我怀疑是线程,通知或同步问题。

  • 服务器代码中的错误。如上所述,很难说它会是什么。

  • JVM错误。不可能的。

  • 操作系统错误。不可能的。

  • 网络问题。也许客户端和服务器之间存在一个错误或错误配置的交换机/网关/防火墙。也许网络和虚拟化存在问题。

我认为你需要使用类似WireShark的东西,看看你是否可以看到数据包何时通过线路,等等。这应该有助于缩小范围。


  

这对某些客户端是随机发生的。 java进程继续,好像数据已发送一样,但服务器不会物理地发送/接收数据。

还有一些问题要问自己:

  • 它只发生在“某些”客户端。那么他们有什么不同呢?

  • Java进程继续“好像”发送了数据。那为什么它认为数据已被发送?

  • 服务器不“物理”发送/接收数据。 “物理”是什么意思?为什么你知道/相信这是事实?服务器线程是否在读取时被阻止?还是听不见?数据是否真的到达了服务器机器?

答案 1 :(得分:4)

忘记将OutputStream刷新到客户端可能是一个原因。 Java或底层操作系统可能会等待更多数据填充数据包。