【发布时间】:2014-03-03 14:59:35
【问题描述】:
我想知道为什么Linux内核(或任何其他主流操作系统)没有零拷贝网络功能的原因?零复制是指,数据包/数据流不会被复制以传递给用户空间中的应用程序,但例如使用内存池类型的分配器在内核和用户空间之间共享内存。我自己提出了 3 个理论:
a) 我想存在安全问题。但是当它们只是用作缓冲区时,真的没有办法在用户空间和内核之间安全地共享内存吗?
b) 我想存在稳定性问题。但是我们不能假设谁使用零拷贝网络,例如需要为内核调用实例化并传递内存池是否知道内存管理?足够了解以避免泄漏?
c) 到目前为止还没有完成/不需要。我真的无法想象没有人要求这个功能,因为每个使用小数据包大小的人通常都会受到“慢” TCP 堆栈实现的瓶颈,并且有 3rd 方工具提供用于 0-copy 网络的特殊用途网卡。
随意发表任何猜测,但请注明您是否假设或更深入地了解保持 StackOverflow 质量的原因:-)
【问题讨论】:
-
嗯,Linux 确实有这个功能,问题只是 a) 有些事情不是微不足道的,但他们在考虑这些细节之前实现了 something 和 b)至少可以说,文档很差。如果您有兴趣,请查看
splice、tee和vmsplice。这些允许您在套接字、文件和管道(内核缓冲区)之间复制,复制管道(页面上的引用计数),以及通过重新映射页面在用户和内核空间之间进行复制。很好的理论就这么多,在实践中你最终会得到你可能不会触摸并且不知道何时释放的页面......和bleh。 -
查看 haproxy 的来源。它使用
splice和管道来防止通过用户空间进行复制(由于事件循环和使用管道池,源代码有点粗糙)。我听说 haproxy 的作者正在开发用于直接拼接套接字的内核补丁,但不确定它是否真的会更快。 -
另见RoCE
标签: linux networking linux-kernel network-programming zero-copy