【问题标题】:Avoid copying of data between user and kernel space and vice-versa避免在用户和内核空间之间复制数据,反之亦然
【发布时间】:2010-05-12 23:12:27
【问题描述】:

我正在开发一种用于替代 TCP/IP 的并行计算的主动消息传递协议。我的目标是减少数据包的延迟。由于环境是局域网,我可以用更简单的协议替换 TCP/IP 以减少数据包延迟。我没有编写任何设备驱动程序,我只是想用更简单的东西替换 TCP/IP 堆栈。现在我想避免将数据包的数据从用户空间复制到内核空间以及反之亦然。我听说过 mmap()。这是最好的方法吗?如果是的话,如果您能提供一些示例的链接,那就太好了。我是 linux 新手,非常感谢您的帮助.. 谢谢...

谢谢, 巴拉

【问题讨论】:

  • 如果您是“linux 新手”,在尝试用“更简单”的东西替换 TCP/IP 之前,我会三思而后行。即使在 LAN 上,也不要假设您可以放弃校验和和重传等功能。
  • ya.. 但我正在学习 linux 并希望做这个项目。欢迎您提出建议...

标签: linux mmap


【解决方案1】:

您应该使用 UDP,它已经非常快了。至少它的速度足以让 W32/SQLSlammer 在整个互联网上传播。

关于您最初的问题,请参阅(vm)splicetee Linux 系统调用。

来自手册页:

三个系统调用splice(2), vmsplice(2) 和 tee(2)),提供 完全控制的用户空间程序 在任意内核缓冲区上, 在内核中使用 使用相同类型的缓冲区 为管道。总的来说,这些系统 调用执行以下任务:

拼接(2)

  moves data from the buffer to an arbitrary file descriptor, or vice

反之亦然,或者从一个缓冲区到另一个缓冲区。

三通(2)

  "copies" the data from one buffer to another.

vmsplice(2)

  "copies" data from user space into the buffer.

虽然我们谈论的是复制,但实际上 通常避免复制。这 内核通过实现一个 管道缓冲区作为一组 指向页面的引用计数指针 内核内存。内核创建 缓冲区中页面的“副本” 创建新指针(用于输出 缓冲区)引用页面,和 增加参考计数 页面:只复制指针, 不是缓冲区的页面。

【讨论】:

  • 感谢您的建议。实际上,我需要通过绕过 TCP/IP 堆栈来绝对减少网络延迟。这是我的论文实验。基本上我需要一个在内核和用户空间之间共享的缓冲区。你有什么想法吗?谢谢....
  • 你在开玩笑吗?也许您应该运行一些基准测试。您了解基于数据包和基于流的区别吗?您知道,速度需要妥协,而 UDP 的速度/延迟优势是众所周知的。
  • UDP 非常适合广播或丢失一些数据的任何其他情况。基于流的底层协议发送数据包。问题是如何管理确认/重传。
  • 我赞成,因为尽管有 UDP 建议(这可能对某些应用程序有问题),但对最近发明的系统调用的讨论非常准确,尤其是 vmsplice。
  • 谢谢,终于有人研究了我的帖子的精髓,而不是将他自己的协议偏好强加于这个问题的真正主题。
【解决方案2】:

由于环境是局域网,我可以用更简单的协议替换 TCP/IP 以减少数据包延迟

一般情况下,即使在局域网中,UDP数据包也容易丢失,如果客户端也会丢失 没有足够的时间消耗它...

所以不,不要用其他东西 (UDP) 替换 TCP。因为如果您确实需要可靠的传递,TCP 将是最快的(因为连接到确认和重新传输的所有内容都在内核空间中完成)。

一般情况下,使用 TCP 没有延迟缺点(当然不要忘记TCP_NODELAY 选项)

关于共享内存。实际上,您分配的所有内存都是使用 mmap 创建的。因此,内核在从驱动程序创建数据包时无论如何都需要以某种方式复制它。

如果您谈论的是减少复制,通常是针对文件/套接字和 sendfile() 确实可以防止在内核和用户之间复制数据。但我假设 您不需要发送文件。

【讨论】:

  • UDP 数据包不会倾向于在 LAN 中丢失。而操作系统的接收缓冲区实际上是相当大的。在否决其他人之前,您应该检查您的事实。
  • @ynpos - 是的,他们是(为了经验)。此外,缓冲区很大的事实并不能阻止任何类型的服务器由于某种原因而失去 CPU,并且缓冲区可能会变满。所以,是的,UDP 数据包不会经常丢失,但会发生这种情况。你不能转发这个。
猜你喜欢
  • 2021-09-06
  • 2015-03-27
  • 2017-08-24
  • 2017-11-29
  • 2012-03-02
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多