“零拷贝网络”和“内核绕过”有什么区别?这两个短语的意思是相同的,还是不同的?内核绕过是“零拷贝网络”中使用的一种技术吗?这就是关系吗?
4 回答
“零拷贝网络”和“内核绕过”有什么区别?这两个短语的意思是相同的,还是不同的?内核绕过是“零拷贝网络”中使用的一种技术吗?这就是关系吗?
TL;DR - 它们是不同的概念,但内核绕过 API/框架很可能支持零拷贝。
用户绕过
还应考虑这种通信方式。完全不涉及 CPU 的DMA 到 DMA事务可能是可能的。这个想法是使用splice()
或类似的功能来完全避免用户空间。请注意,使用splice()
,整个数据流不需要绕过用户空间。可以在用户空间中读取标头,并将数据直接流式传输到磁盘。最常见的缺点是splice()
不执行校验和卸载。
零拷贝
零拷贝概念只是网络缓冲区固定在适当的位置,不会四处移动。在许多情况下,这并不是真正有益的。大多数现代网络硬件支持分散聚集,也称为缓冲区描述符等。这个想法是网络硬件理解物理指针。缓冲区描述符通常包括:
- 数据指针
- 长度
- 下一个缓冲区描述符
好处是网络标头不需要并排存在,IP、TCP和应用标头可以与应用程序数据物理分离。
如果控制器不支持这一点,则TCP/IP标头必须在用户数据之前,以便在发送到网络控制器之前可以填充它们。
零拷贝还意味着一些内核用户 MMU 设置,以便共享页面。
内核绕过
当然,你可以绕过内核。这就是pcap和其他嗅探器软件一段时间以来一直在做的事情。但是,pcap 不会阻止正常的内核处理;但这个概念类似于内核绕过框架所允许的。即,直接将数据包传递到将发生处理标头的用户空间。
但是,除非它与特定硬件相关联,否则很难看到用户空间将获得明确的胜利。一些网络控制器可能在控制器中支持分散聚集,而其他网络控制器可能不支持。
有多种内核接口的化身来完成内核旁路。困难在于接收到的数据和产生用于传输的数据会发生什么。这通常涉及其他设备,因此有很多解决方案。
把这个放在一起...
这两个短语的意思是相同的,还是不同的?
它们与上面的不同,希望能解释。
内核绕过是“零拷贝网络”中使用的一种技术吗?这就是关系吗?
恰恰相反。内核绕过可以使用零拷贝,并且很可能会支持它,因为缓冲区完全在应用程序的控制之下。此外,内核和用户空间之间没有内存共享(这意味着不需要 MMU 共享页面以及可能导致的任何缓存/TLB 影响)。因此,如果您使用内核旁路,支持零拷贝通常是有利的;所以事情一开始可能看起来一样。
如果 scatter-gather DMA 可用(大多数现代控制器),用户空间或内核都可以使用它。在这种情况下,零拷贝没那么有用。
参考:
- OnLoad 的技术参考,一个高带宽内核旁路系统。
- 自 2.6.32 起的PF 环(如果已配置)
- David Miller 的Linux 内核网络缓冲区管理。这给出了如何在内核中管理协议头/尾的想法。
零拷贝网络
当您从不在用户空间和内核空间(我的意思是内存空间)之间复制数据时,您正在执行零复制网络。举例:
C语言
recv(fd, buffer, BUFFER_SIZE, 0);
默认情况下,数据被复制:
- 内核从网络栈中获取数据
- 内核将此数据复制到
buffer
用户空间中的 .
使用零复制方法,数据不会直接从网络堆栈复制到用户空间。
内核绕过
内核绕过是指您在用户空间、网络堆栈和硬件方面管理自己。这很难,但您将获得很多性能(零副本,因为所有数据都在用户空间中)。如果您想了解更多信息,此链接可能会很有趣。
零拷贝:
发送和接收数据包时,必须将所有数据包数据从用户空间缓冲区复制到内核空间缓冲区以进行发送,反之亦然以进行接收。零拷贝驱动程序通过让用户空间和驱动程序直接共享数据包缓冲存储器来避免这种情况。
不是让发送和接收指向内核空间中稍后需要复制的缓冲区,而是分配用户空间中的一个内存区域,并将其映射到给定的物理内存区域,作为内核缓冲区和内核缓冲区之间的共享内存。用户空间缓冲区,然后将每个描述符缓冲区指向其在新分配的内存中的相应位置。
内核绕过和零拷贝的其他示例是 DPDK 和 RDMA。当应用程序使用 DPDK 时,它会绕过内核 TCP/IP 堆栈。该应用程序正在创建以太网帧,而 NIC 使用 DMA 直接从用户空间内存中抓取这些帧,因此它是零拷贝,因为没有从用户空间到内核空间的拷贝。应用程序可以使用 RDMA 做类似的事情。应用程序写入 NIC 直接访问和传输的队列对。RDMA iblibverbs 也在内核内部使用,因此当 iSER 使用 RDMA 时,它不是内核绕过,而是零拷贝。
https://www.openfabrics.org/index.php/openfabrics-software.html