免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9007 | 回复: 6
打印 上一主题 下一主题

[C] Intel e1000零拷贝设计实现说明 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-17 21:36 |只看该作者 |倒序浏览
说明Intel e1000系列网卡零拷贝的设计实现。使用该实现,应用程序可以从网卡直接接收到报文,且不存在任何数据拷贝,极大得提高了抓包性能。作者: 老莱 lyxmate#gmail.com

在实际应用中,网络管理程序常常需要接收网卡的原始报文进行分析。然而,传统的报文捕获机制往往无法保证大流量的网络流的要求,从而成为系统处理的瓶颈。在Linux系统上,报文从网卡到应用层经过了多次数据拷贝,并且涉及到内核态和用户态的切换,降低了应用程序捕获报文的能力。虽然内核采用了NAPI、MMAP等机制大幅度提高了网卡到内核的接收性能,但是仍然无法满足千M网络的报文特别是小报文的处理要求。
零拷贝指的是网络接口直接将收到的报文送入应用层缓冲区,中间不涉及任何数据拷贝、系统调用、进程(线程)切换的动作,从而提高应用层接收报文性能。在网上也有相关的个人或组织研究了零拷贝实现方式,其主要的缺陷是1)通用行代码,没有针对特定网卡驱动进行优化, 2)需要重新编译内核版本,或者对内核版本特性有要求。如必须内核支持NAPI。3)千M流量下抓报率无法达到线速,性能特别是小报文的性能相差太多,64字节的小报文一般只有200~300Mbps。
本文主要阐述Linux系统下Intel e1000系列网卡零拷贝的设计实现。同时为了说明设计思路,详细说明了e1000网卡接收报文的流程,最后对应用接口也给出了简要的说明。

基本的设计思路就是:
内核和应用层程序共享一块环形内存缓冲区,内存缓冲区划分为N个slot(也可以看作可以缓存N个报文的数组),每个缓存一个报文。网卡驱动采用DMA方式向缓冲区写入报文;应用层空间从缓冲区读出数据。缓冲区有当前可以读出和写入的slot下标索引,并且每个slot有标志位,表示该slot是否为空。每个slot有一些额外的信息,例如报文长度、时间戳等。由于上层应用大多使用libpcap库接收报文,因此每个slot也包含一个pcap_header结构,这样可以保证不需要修改上层应用程序,但是会带来几个字节的额外开销。
注册一种新的socket族(PF_RING socket),实现零拷贝行为的控制,包括环形缓冲区的内存映射、接口绑定、ioctl等。新注册的socket族和e1000驱动属于同一个模块。当使用socket接口控制接口使用零拷贝机制的时候,e1000接收报文驱动就开始向环形缓冲区写入数据,而不是原始的skb机制。这时候,内核(协议族)就无法接收到网卡的报文了。
上层应用通过socket机制绑定接口、得到映射的内存后,就可以直接访问环形缓冲区数据。如果环形缓冲区没有数据,应用调用poll->PF_RING ring_poll等待报文接收。当有新的报文到来的时候,驱动程序唤醒进程继续处理报文。

lyxmate.jpg (16.79 KB, 下载次数: 38)

lyxmate.jpg

论坛徽章:
0
2 [报告]
发表于 2010-01-17 22:31 |只看该作者
顶一下

论坛徽章:
0
3 [报告]
发表于 2010-01-18 08:48 |只看该作者
有个叫lwip的开源协议栈,里面就有用0拷贝技术。

论坛徽章:
0
4 [报告]
发表于 2010-01-18 10:32 |只看该作者
pf_ring也不是严格意义上的0拷贝,  看看这个分析
http://linux.chinaunix.net/bbs/thread-1149919-1-2.html###

论坛徽章:
0
5 [报告]
发表于 2010-01-18 10:36 |只看该作者
本来想给10个小手,可是不确定是转载还是原创。

论坛徽章:
0
6 [报告]
发表于 2013-08-07 15:25 |只看该作者
我还是不知道零拷贝和libpcap库是怎么实现的,libpcap库是怎么读取这块内存中的数据啊,还有就是PF_RING socket的作用是什么啊。希望得到各位高手的指教啊

论坛徽章:
0
7 [报告]
发表于 2013-08-07 15:26 |只看该作者
您介绍的太笼统了,能不能说的详细点啊,很感谢您啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP