"零复制网络"与"内核绕过"?

use*_*112 40 linux networking operating-system network-programming zero-copy

"零拷贝网络"和"内核旁路"有什么区别?它们是两个含义相同或不同的短语吗?内核绕过"零复制网络"中使用的技术,这是关系吗?

art*_*ise 39

"零拷贝网络"和"内核旁路"有什么区别?它们是两个含义相同或不同的短语吗?内核绕过"零复制网络"中使用的技术,这是关系吗?

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


用户旁路

还应考虑这种通信模式.这也许可能DMA到DMA交易不涉及CPU的.想法是使用splice()或类似的功能来完全避免用户空间.请注意,splice()整个数据流不需要绕过用户空间.可以在用户空间中读取标头,并将数据直接流式传输到磁盘.最常见的缺点是splice()不进行校验和卸载.

零拷贝

零拷贝的概念仅仅是网络缓冲区固定在适当位置,而不是到处移动.在许多情况下,这并不是真正有益的.大多数现代网络硬件都支持分散收集,也称为缓冲区描述符等.这个想法是网络硬件理解物理指针.缓冲区描述符通常包括,

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

好处是网络头不需要并排存在,并且IP,TCP应用程序头可以与应用程序数据物理分离.

如果控制器不支持此操作,则TCP/IP标头必须位于用户数据之前,以便在发送到网络控制器之前填充它们.

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

内核旁路

当然,你可以绕过内核.这就是pcap和其他嗅探软件一直在做的事情.但是,很难看到用户空间将获得明确胜利的情况,除非它与特定硬件相关联.某些网络控制器可能在控制器中支持分散聚集,而其他网络控制器则不支持.

内核接口有各种实现内核旁路的实现.


把它放在一起......

它们是两个含义相同或不同的短语吗?

他们是不同的,如上所述希望解释.

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

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

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

参考:


nou*_*ney 21

零拷贝网络

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

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

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

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

使用零拷贝方法,数据不会被复制并直接从网络堆栈进入用户空间.

内核旁路

内核旁路是指您自己管理,在用户空间,网络堆栈和硬件中.这很难,但是你会获得很多性能(零拷贝,因为所有数据都在用户空间).如果您想了解更多信息,此链接可能很有趣.

  • @nouney:...如果你做得好的话!;-) (2认同)

Ton*_*ous 6

零拷贝:

在发送和接收数据包时,必须将所有数据包数据从用户空间缓冲区复制到内核空间缓冲区以进行传输,反之亦然.甲零拷贝驱动器由具有用户空间和直接驱动共享数据包缓冲存储器避免了这种.

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


小智 5

内核绕过和零拷贝的其他示例是 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