“零拷贝网络”和“内核绕过”有什么区别?这两个短语的意思是相同还是不同?内核绕过是“零复制网络”中使用的技术吗?这就是关系吗?
TL;DR - 它们是不同的概念,但内核旁路 API/框架内很可能支持零复制。
用户绕过
这种沟通方式也应该被考虑。也许有可能DMA 到 DMA完全不涉及CPU的事务。这个想法是使用splice()
或类似的函数来避免用户空间根本不。请注意,与splice()
,整个数据流不需要绕过用户空间。标头可以在用户空间中读取,数据可以直接流式传输到磁盘。最常见的缺点是splice()
不进行校验和卸载。
零拷贝
The 零拷贝概念只是网络缓冲区固定在适当的位置并且不会移动。在许多情况下,这并不是真正有益的。最现代的网络硬件支持分散聚集 http://en.wikipedia.org/wiki/Vectored_I/O, 也叫作缓冲区描述符等等。这个想法是网络硬件理解物理指针。缓冲区描述符通常包括:
- 数据指针
- Length
- Next 缓冲区描述符
好处是网络标头不需要存在并排 and IP, TCP, and 应用标头可以在物理上与应用数据.
如果控制器不支持此功能,则TCP/IP标头必须位于用户数据以便可以在发送到之前填写它们网络控制器.
零拷贝还意味着一些内核用户 MMU 设置,以便共享页面。
内核绕过
当然,你可以绕过内核。这是什么pcap http://en.wikipedia.org/wiki/Pcap和其他嗅探软件已经做了一段时间了。然而,pcap并不会阻止正常的内核处理;但这个概念类似于内核旁路框架所允许的。即,直接将数据包传送到将发生处理标头的用户空间。
然而,很难看到这样的案例:用户空间除非与特定硬件绑定,否则将有明确的胜利。一些网络控制器可能有分散聚集控制器支持,其他控制器可能不支持。
有多种内核接口可以实现内核旁路。困难在于接收到的数据和生成用于传输的数据会发生什么情况。通常这涉及其他设备,因此有很多解决方案。
为了把这个放在一起...
这两个短语的意思是相同还是不同?
正如上面希望解释的那样,它们是不同的。
内核绕过是“零复制网络”中使用的技术吗?这就是关系吗?
事实恰恰相反。内核绕过可以使用零拷贝并且很可能会支持它,因为缓冲区完全在应用程序的控制之下。此外,内核和用户空间之间没有内存共享(意味着不需要 MMU 共享页面以及可能导致的任何缓存/TLB 影响)。所以如果你正在使用内核绕过,支持通常是有利的零拷贝;所以一开始事情可能看起来是一样的。
如果分散-聚集 DMA 可用(大多数现代控制器),用户空间或内核都可以使用它。零拷贝在这种情况下没有那么有用。
参考:
-
OnLoad 技术参考 http://www.solarflare.com/Content/UserFiles/Documents/Solarflare_OpenOnload_IntroPaper.pdf,一个高带宽内核旁路系统。
-
PF Ring http://www.ntop.org/products/pf_ring/自 2.6.32 起(如果已配置)
-
Linux内核网络缓冲区管理 http://vger.kernel.org/%7Edavem/skb_data.html大卫·米勒着。这给出了如何在内核中管理协议头/尾的想法。