在我用 Java 编写的 TCP 服务器中,有时随机客户端会有 5 到 60 秒的延迟。发生这种情况时,服务器有足够的可用内存和 cpu。发生这种情况时套接字已经打开。
这种情况随机发生在某些客户身上。 java 进程继续,就好像数据已发送一样,但服务器不会物理地发送/接收数据。
我已禁用 Nagle,但我不明白 Nagle 是如何导致这种延迟的。
我不是很具体,因为我对此感到困惑。理论上是什么导致了这种情况?
另一件事:当其中一个客户端出现严重滞后时,其他客户端运行良好。它们都在服务器的同一个以太网接口(interface)上。我无法解释这样的事情。
最佳答案
What could theoretically cause this ?
理论原因包括:
客户端代码中的错误。如果不查看代码就很难说它会是什么,但我怀疑是线程、通知或同步问题。
服务器代码中的错误。很难说会是什么……如上。
一个 JVM 错误。不太可能。
操作系统错误。不太可能。
网络问题。客户端和服务器之间可能存在故障或配置错误的交换机/网关/防火墙。可能网络和虚拟化存在问题。
我认为您需要使用像 WireShark 这样的工具来查看您是否可以看到数据包何时通过网络等。这应该有助于缩小范围。
This happens randomly to certain clients. The java process continues as if the data was sent, but the server doesn't send / receive the data physically.
还有一些问题要问自己:
它只会发生在“某些”客户身上。那么它们有什么不同呢?
Java 进程继续“好像”数据已发送。那为什么它认为数据已经发送呢?
服务器不会“物理地”发送/接收数据。你所说的“ body 上”是什么意思?你为什么知道/相信是这样的?服务器线程是否在读取中被阻塞?或者它被阻止在听?数据真的到达服务器机器了吗?
关于java - Java 套接字延迟 30 秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7735507/