java - Java 套接字延迟 30 秒?

标签 java sockets tcp latency

在我用 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/

相关文章:

java - JDBC 事务未回滚 - setAutoCommit(false)

sockets - 如何在 Ada 中创建 UDP 客户端

ruby - “Connection reset by peer” 新建tcp套接字时出错

c - 为什么这个套接字/文件描述符分配无效?

sockets - PHP 套接字中的 TCP 重试

java - 从文件中读取 TreeMap(Java)?

java - 从 Fragment 中调用 MainActivity 中的方法

java - 将线旋转指定角度(Java/Android)

javascript - 创建 TCP 服务器时连接的标识符是什么?

java - OkHttp 会自动重用 HTTP1/1 连接吗?