【问题标题】:UDP transfer is too fast, Apache Mina doesn't handle itUDP 传输太快,Apache Mina 不处理
【发布时间】:2015-12-29 12:53:10
【问题描述】:

我们决定使用 UDP 发送大量数据,例如:

  • 客户端 [C++](使用轮询)
  • 服务器 [JAVA] [Apache MINA]

我的数据报最大只有 512 字节,以避免在传输过程中产生碎片。

每个数据报都有一个我添加的标题(里面有一个ID),以便我可以监控:

  • 收到多少数据报
  • 收到了哪些

问题是我们发送数据报太快了。我们像第一个那样收到,然后有很大的损失,然后得到一些,又是大的损失。接收到的 ID 数据报的顺序类似于 [1], [2], [250], [251].....

问题也发生在本地(使用 localhost,仅 1 个网卡) 我不关心丢失数据报,但这里不是因为网络造成的简单丢失(我可以处理)

所以我的问题是:

  • 在客户端,我怎样才能得到最好的:
    • 设置,还是套接字设置?
    • 如何尽可能多地发送而不发送太多?
  • 在服务器上,Apache MINA 似乎说它自己管理~“缓冲区套接字的大小”~但是还有一些设置需要关心吗?
  • 知道我们的连接已经允许我们在下载常规文件时至少拥有这个带宽,是否有可能达到 1MB/s?

现在,当我们要传输约 4KB 的坐标信息时,我们必须添加睡眠时间,以便等待 5 分钟或更长时间才能完成,知道我们应该每分钟发送一次对我们来说是个大问题至少 10MB 坐标信息。

【问题讨论】:

  • 我会首先安装wireshark 以确认数据包正在进入盒子。也可以使用 OS UDP 缓冲区大小。听起来很可疑,即使 mina 处理它们的速度太慢,操作系统也应该缓冲。
  • "要传输约 4KB 的坐标信息,我们必须增加睡眠时间,以便等待 5 分钟或更长时间" 即每 40 秒 1 个数据包......它会更快地切换到电报和莫尔斯电码。
  • 这看起来像是一个拥塞问题,所以你需要一些拥塞控制,或者至少限制发送。但是 5 分钟的 4KB 看起来问题要大得多,可能在您的代码中。
  • @SChepurin“我的应用程序在不应该的情况下占用了我的硬盘驱动器上的 1TB”,您的答案是:“购买 2TB 硬盘驱动器”。这不是解决方案。
  • @ElderBug - 最后看到“检查”了吗?这是一个测试,而不是一个解决方案(可以建议什么没有代码的解决方案?)。

标签: c++ sockets udp mina


【解决方案1】:

如果你想要可靠的传输,你应该使用 TCP。这将使您发送的速度几乎与网络和客户端中较慢的速度一样快,而不会造成任何损失。

如果你想要一个高度优化的低延迟传输,不需要可靠,你需要UDP。这将让您发送的速度与网络可以处理的一样快,但您也可以发送得更快,或者比客户端可以读取的速度更快,然后您将丢失数据包。

如果您想要可靠的高度优化的低延迟传输和细粒度控制,您最终将在 UDP 之上实现自定义的 TCP 子集。听起来你不能或不应该这样做。

...如何才能获得最佳设置或套接字设置

通常通过实验。

如果您丢失数据包的原因是因为客户端速度较慢,您需要让客户端速度更快。较大的接收缓冲区只会购买固定数量的动态余量(例如吸收突发),但如果系统速度较慢,任何大小合理的缓冲区最终都会填满。

但请注意,这只能治疗过度或可避免的跌落。即使您的客户端可以跟上,也允许各种网络堆栈层(即使不留下一个框)丢弃数据包,因此如果没有自定义重传逻辑,您仍然不能将其视为可靠(我们回到实现 TCP) .

...如何尽可能多地发送而不发送太多?

您需要某种 ack/nack/back-pressure/throttling/congestion/任何从接收器返回到源的消息。这正是 TCP 免费为您提供的那种东西,但要自己很好地实现相对比较棘手。

是否有可能达到 1MB/s ...

我刚刚看到 8MB/s 使用 scp over loopback,所以我会说是的。它使用 TCP 并且显然选择了 AES128 来动态加密和解密文件 - 如果您只是发送纯文本,那么获得同等性能应该是微不足道的。

【讨论】:

  • 我会做一些实验。但是我今天的目标是尽可能快地传输大量数据,而不关心是否有 1% 或 30% 的丢失,但现在我的问题只是让 UDP 工作正常。我会进行更多调查,并随时通知大家。谢谢
【解决方案2】:

只有在不牺牲 QoS 的情况下可以丢失任意数量的数据报时,UDP 才是一个可行的选择。我不熟悉 Apache MINA,但所描述的场景类似于按顺序处理每个数据报的服务器。在这种情况下,所有在服务期间到达的数据报都将丢失 - 没有 UDP 数据报排队。就像我说的,我不知道 MINA 是否可以针对并行数据报处理进行调整,但如果不能,那只是工具选择错误。

【讨论】:

  • 我比较确定你是错的。操作系统会将收到的 UDP 数据包排队。
  • 由于 UDP 数据报可以达到 64KB,因此系统缓冲区几乎可以保证容纳 128 个 512 字节的数据包。即使应用程序编码错误,也很难以这种方式丢弃数据包。
  • 这是我亲眼所见,所以我坚持。
  • *NIX 通常会将数据包排入固定大小的缓冲区,然后静默丢弃不适合缓冲区的数据包。发件人没有背压或节流。所以@MK。数据包排队是正确的,而 SergeyA 数据包被丢弃是正确的。我不知道其他操作系统可能会做什么。
  • @Useless,我会修改它不是*NIX,而是执行此操作的堆栈。但是,我也承认我在这件事上的经验可能是一些奇特的堆栈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2011-01-08
  • 2015-07-01
  • 2017-10-06
  • 1970-01-01
相关资源
最近更新 更多