【问题标题】:Why no zero-copy networking in linux kernel? [closed]为什么 Linux 内核中没有零拷贝网络? [关闭]
【发布时间】:2014-03-03 14:59:35
【问题描述】:

我想知道为什么Linux内核(或任何其他主流操作系统)没有零拷贝网络功能的原因?零复制是指,数据包/数据流不会被复制以传递给用户空间中的应用程序,但例如使用内存池类型的分配器在内核和用户空间之间共享内存。我自己提出了 3 个理论:

a) 我想存在安全问题。但是当它们只是用作缓冲区时,真的没有办法在用户空间和内核之间安全地共享内存吗?

b) 我想存在稳定性问题。但是我们不能假设谁使用零拷贝网络,例如需要为内核调用实例化并传递内存池是否知道内存管理?足够了解以避免泄漏?

c) 到目前为止还没有完成/不需要。我真的无法想象没有人要求这个功能,因为每个使用小数据包大小的人通常都会受到“慢” TCP 堆栈实现的瓶颈,并且有 3rd 方工具提供用于 0-copy 网络的特殊用途网卡。

随意发表任何猜测,但请注明您是否假设或更深入地了解保持 StackOverflow 质量的原因:-)

【问题讨论】:

  • 嗯,Linux 确实有这个功能,问题只是 a) 有些事情不是微不足道的,但他们在考虑这些细节之前实现了 something 和 b)至少可以说,文档很差。如果您有兴趣,请查看spliceteevmsplice。这些允许您在套接字、文件和管道(内核缓冲区)之间复制,复制管道(页面上的引用计数),以及通过重新映射页面在用户和内核空间之间进行复制。很好的理论就这么多,在实践中你最终会得到你可能不会触摸并且不知道何时释放的页面......和bleh。
  • 查看 haproxy 的来源。它使用splice 和管道来防止通过用户空间进行复制(由于事件循环和使用管道池,源代码有点粗糙)。我听说 haproxy 的作者正在开发用于直接拼接套接字的内核补丁,但不确定它是否真的会更快。
  • 另见RoCE

标签: linux networking linux-kernel network-programming zero-copy


【解决方案1】:

如今零拷贝网络有几种选择:

请注意,使用 TCP 进行零复制可能不方便,因为 TCP 段携带标头和有效负载,但应用程序只关心有效负载,因此必须将有效负载而不是标头复制到应用程序的连续缓冲区中。

【讨论】:

  • 段标头可能是其尚不标准的一个正当理由。但是,我不介意我的应用程序是否可以看到它们,并且我看不到有效负载复制的原因,因为它会降低我的应用程序的性能。 +1
  • @user1610743 在 C++ 中,可能有一个开箱即用的迭代器,它跳过帧头并仅迭代有效负载。
  • @PeterCordes 更新了链接。
猜你喜欢
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 2010-09-16
  • 2014-07-06
相关资源
最近更新 更多