“零复制networking”与“内核旁路”?

“零复制networking”和“内核旁路”有什么区别? 他们是两个词组是相同的还是不同的? 内核是否绕过“零复制networking”中使用的技术,这是关系?

Solutions Collecting From Web of "“零复制networking”与“内核旁路”?"

“零复制网络”和“内核旁路”有什么区别? 他们是两个词组是相同的还是不同的? 内核是否绕过“零复制网络”中使用的技术,这是关系?

TL; DR – 它们是不同的概念,但很可能在内核旁路API /框架中支持零拷贝。


用户绕过

这种交流方式也应该考虑。 也许DMA和DMA交易完全不涉及CPU。 这个想法是使用splice()或类似的函数来完全避免用户空间 。 请注意,使用splice() ,整个数据流不需要绕过用户空间。 可以在用户空间读取头文件,并将数据直接传输到磁盘。 这个最常见的问题是splice()不执行校验和卸载。

零拷贝

零复制的概念只是网络缓冲区固定在位,不能移动。 在许多情况下,这不是真的有益。 大多数现代网络硬件都支持分散采集 ,也称为缓冲区描述符等。思想是网络硬件理解物理指针。 缓冲区描述符通常包括,

  1. 数据指针
  2. 长度
  3. 下一个缓冲区描述符

好处是网络头不需要并行存在, IPTCP应用程序头可以与应用程序数据物理隔离。

如果一个控制器不支持这个,那么TCP / IP头必须在用户数据之前,以便在发送到网络控制器之前填充它们。

零拷贝也意味着一些内核用户MMU设置,以便共享页面。

内核旁路

当然,你可以绕过内核。 这是pcap和其他嗅探器软件已经做了一段时间了。 然而,很难看到一个用户空间将有一个确定的胜利,除非它被绑定到特定的硬件。 一些网络控制器可能在控制器中支持分散聚集 ,而另一些则不可

有内核接口的各种化身来完成内核旁路。


把这个放在一起…

他们是两个词组是相同的还是不同的?

他们有不同的希望解释。

内核是否绕过“零复制网络”中使用的技术,这是关系?

恰恰相反。 内核旁路可以使用零拷贝,并且很可能会支持它,因为缓冲区完全在应用程序的控制之下。 另外,在内核和用户空间之间没有内存共享(意味着不需要MMU共享页面以及可能导致的任何缓存/ TLB效果)。 所以如果你使用内核旁路 ,支持零拷贝通常是有利的。 所以事情起初可能看起来一样。

如果分散收集DMA可用(大多数现代控制器),用户空间或内核都可以使用它。 零拷贝在这种情况下不是有用的。

参考:

  • OnLoad是高带宽内核旁路系统的技术参考 。
  • PF环自2.6.32(如果已配置)
  • 大卫米勒Linux内核网络缓冲区管理 。 这给出了在内核中如何管理协议头部/尾部的想法。

零复制网络

当你从不在用户空间和内核空间(我的意思是内存空间)之间复制数据时,你正在做零拷贝网络。 举例来说:

C语言recv(fd, buffer, BUFFER_SIZE, 0);

默认情况下,数据被复制:

  1. 内核从网络堆栈获取数据
  2. 内核将这些数据复制到用户空间的buffer中。

采用零拷贝方法,数据不会被复制,而是直接从网络堆栈进入用户空间。

内核旁路

内核旁路是当你管理自己,在用户空间,网络堆栈和硬件的东西。 这很难,但你会获得很多的性能(零拷贝,因为所有的数据都在用户空间)。 如果你想要更多的信息,这个链接可能会很有趣。

内核旁路和零拷贝的其他例子是DPDK和RDMA。 当应用程序使用DPDK时,它将绕过内核TCP / IP堆栈。 该应用程序正在创建以太网帧和NIC直接从用户空间内存中抓取带有DMA的帧,所以它是零拷贝,因为没有从用户空间到内核空间的副本。 应用程序可以用RDMA做类似的事情。 应用程序写入NIC直接访问和传输的队列对。 RDMA iblibverbs也在内核中使用,所以当iSER使用RDMA时,它不是内核旁路,而是零拷贝。

http://dpdk.org/

https://www.openfabrics.org/index.php/openfabrics-software.html

零拷贝:

在发送和接收数据包时,必须将所有数据包数据从用户空间缓冲区复制到内核空间缓冲区以进行发送,反之亦然。 零拷贝驱动程序通过让用户空间和驱动程序直接共享数据包缓冲存储器来避免这种情况。

用户空间中的内存区域被分配并映射到物理内存的给定区域,而不是将内核缓冲区的发送接收点指向内核空间中的缓冲区,而是在内核缓冲区和内核缓冲区之间共享内存用户空间缓冲区,然后将每个描述符缓冲区指向新分配的内存中相应的位置。