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