【问题标题】:MacOS: strange delay between UDP/TCP packetsMacOS:UDP/TCP 数据包之间的奇怪延迟
【发布时间】:2011-05-21 10:58:50
【问题描述】:

我正在开发一个应用程序,它使用 AsyncUDPSocket 类将每个 UDP 的数据发送到 Mac 和 Windows 上的另一个客户端。数据包立即到达非常重要。

问题是每个大约。 1000 个数据包我收到数据包时延迟大约 2 秒。 100-200 毫秒的延迟是可以的,但 2 秒会产生糟糕的用户体验。

我在一个单独的线程中进行 UDP 通信,因此它几乎不受用户与 UI 等交互的影响。我已经尝试过更快、更慢、不同的数据包大小发送数据包:延迟一直存在。尝试使用 TCP 而不是 UDP - 结果相同:(

在 Windows 客户端上似乎不会发生这种情况。 也许MacOS中有一些系统缓冲区,每次它有N个数据包或N个字节的数据时都需要刷新??? 有谁知道如何防止延迟发生?

【问题讨论】:

  • 检查您的 DNS 设置。如果通过主机名连接,延迟可能是由名称解析引起的。
  • 我使用 IP 地址连接,因此不需要 DNS 查找
  • 以防万一涉及 DNS,在对等 B(遇到延迟的那个)的 /etc/hosts 中添加对等 A 的 IP 地址,看看是否有区别。
  • 这个问题解决了吗?我在 Linux 系统上看到了同样的效果。

标签: objective-c cocoa macos tcp udp


【解决方案1】:

有很多事情可以暂时减慢网络程序的速度,很难知道从哪里开始。您是否在多个网络上尝试过此操作?无线和以太网网络?你有什么样的开关?这会发生在不同的 OS X 计算机上,还是只发生在一台计算机上?你能用更简单的命令行程序重现延迟吗?你在使用垃圾收集吗? (这里抓着稻草……)

出于好奇,我测试了从我的 Mac 发送到同一 LAN 上的另一台计算机的 UDP 回显数据包的往返时间。在 60,000 多个 1,000 字节负载的 UDP 数据包中,没有一个花费超过 32 毫秒,平均往返时间为 0.6 毫秒,样本偏差为 0.21。

(我也很好奇你为什么需要这么低的延迟。)

【讨论】:

  • 我已经使用不同的计算机在无线和以太网网络上进行了尝试。所有计算机都使用路由器连接(也尝试了多个路由器)。我没有使用垃圾收集,但我会重新检查是否忘记禁用它。我可以用一个简单的应用程序重现这种延迟,但不是命令行应用程序(也会尝试这个)。客户端之间发送的数据实际上是鼠标移动,所以我需要低延迟才能使这些鼠标移动平滑......
  • @Nostradamus:从netcat.sourceforge.net 尝试 netcat 进行命令行测试。值得在您的工具箱中使用。另外,请查看线程的调度策略。
  • 谢谢你的信息,我会试试 netcat。线程以正常优先级运行,当我禁用与主线程、计时器等的任何通信时也会发生延迟。可能是AsyncUDPSocket的问题???
  • 您是否有一个发送队列过多?在 Linux 中(您不使用但我更熟悉)有一些可调参数会影响 UDP 发送/接收队列的大小。值得一试...另外,请考虑合并其中一些鼠标事件。
猜你喜欢
  • 2014-07-20
  • 1970-01-01
  • 2020-12-23
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 2014-07-31
  • 2023-03-20
相关资源
最近更新 更多