首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“零拷贝网络”vs“内核旁路”?

“零拷贝网络”vs“内核旁路”?
EN

Stack Overflow用户
提问于 2013-08-21 03:21:43
回答 4查看 29K关注 0票数 46

“零拷贝网络”和“内核旁路”的区别是什么?这两个短语的意思是相同的,还是不同的?内核旁路是“零拷贝网络”中使用的一种技术吗?这就是关系?

EN

回答 4

Stack Overflow用户

发布于 2013-08-21 07:26:21

“零拷贝网络”和“内核旁路”的区别是什么?这两个短语的意思是相同的,还是不同的?内核旁路是“零拷贝网络”中使用的一种技术吗?这就是关系?

它们是不同的概念,但很可能在内核绕过API/框架中支持零拷贝。

用户绕过

也应该考虑这种通信模式。完全不涉及CPU的DMA-to-DMA事务可能是可能的。这个想法是使用splice()或类似的函数来完全避免用户空间。请注意,使用splice(),整个数据流不需要绕过用户空间。标头可以在用户空间中读取,数据可以直接流式传输到磁盘。最常见的缺陷是splice()不做校验和卸载。

零拷贝

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

  1. Data pointer
  2. Length
  3. Next buffer descriptor

这样做的好处是,网络报头不需要并排存在,IPTCP应用程序报头可以在物理上与应用程序数据分离。

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

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

绕过内核

当然,您可以绕过内核。这就是和其他嗅探软件一段时间以来一直在做的事情。但是,pcap不会阻止正常的内核处理;但是其概念类似于内核绕过框架所允许的。也就是说,直接将数据包传送到用户空间,在那里将发生处理报头。

然而,很难看到用户空间会有明确的胜利,除非它与特定的硬件捆绑在一起。某些网络控制器可能在控制器中支持分散聚集,而其他网络控制器可能不支持。

有多种实现内核旁路的内核接口。困难在于接收到的数据和产生用于传输的数据会发生什么情况。这通常涉及到其他设备,因此有许多解决方案。

把这些放在一起。

他们是两个词组,意思相同,还是不同?

它们是不同的,如上所述,希望能解释。

是内核绕过“零拷贝网络”中使用的一种技术吗?这是关系吗?

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

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

参考资料:

  • Technical reference on OnLoad,一个高带宽内核旁路system.
  • PF Ring从2.6.32开始,如果是大卫·米勒写的configured
  • Linux kernel network buffer management。这让我们了解了如何在内核中管理协议头/尾部。
票数 40
EN

Stack Overflow用户

发布于 2013-08-21 03:32:30

零拷贝网络

如果您从未在用户空间和内核空间(我指的是内存空间)之间复制数据,那么您就是在进行零复制网络。举个例子:

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

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

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

使用零复制方法,数据不会直接从网络堆栈复制到用户空间。

绕过内核

当您在用户空间中管理自己、网络堆栈和硬件时,内核绕过了它。这很难,但您将获得很大的性能(零拷贝,因为所有数据都在用户空间中)。如果您想了解更多信息,此link可能会很有趣。

票数 23
EN

Stack Overflow用户

发布于 2017-08-06 22:11:03

零拷贝:

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

不是让发送接收指向内核空间中稍后需要复制的缓冲区,而是分配用户空间中的存储器区域,并将其映射到物理存储器的给定区域,以作为内核缓冲区和用户空间缓冲区之间的共享存储器,然后将每个描述符缓冲区指向其在新分配的存储器中的对应位置。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18343365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档