Java套接字延迟30秒



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

这对某些客户端随机发生。java进程继续,就好像数据已经发送了,但是服务器没有物理地发送/接收数据。

我已经禁用了Nagle,但我不明白Nagle怎么会造成这样的延迟。

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

另一件事:当一个客户端有如此严重的延迟时,其他客户端运行良好。它们都在服务器的同一个以太网接口上。我无法解释这件事。

理论上是什么导致的呢?

理论原因包括:

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

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

  • JVM bug。不可能。

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

  • 网络问题。可能在客户端和服务器之间有一个不可靠或配置错误的交换机/网关/防火墙。可能是网络和虚拟化有问题

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


这对某些客户端随机发生。java进程继续,就好像数据已经发送了,但是服务器没有物理地发送/接收数据。

还有一些问题要问你自己:

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

  • Java进程继续"好像"数据已经发送。那么为什么它认为数据已经发送了呢?

  • 服务器不"物理地"发送/接收数据。你说的"身体"是什么意思?你为什么知道/相信会是这样?服务器线程在读取时阻塞了吗?还是被堵住了?数据真的到达服务器了吗?

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

最新更新