免费注册 查看新帖 |

Chinaunix

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

支持用户空间零拷贝收发网络报文的开源项目 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-06 23:05 |只看该作者 |倒序浏览
经过一段时间的开发, 一个完整支持用户空间零拷贝收发网络报文的开源项目 Network Tapping Zero Copy (NTZC)已经趋于稳定,发布在 http://code.google.com/p/ntzc
欢迎大家访问. 下面是项目基本介绍.


用于捕获报文的零拷贝技术有很多讨论,但迄今还没有一个可用的、开源的实现。最接近的两个实现,一个是PF_RING,一个是NTA,前者仍然存在一次拷贝,后者则年代较为久远且问题多多。借鉴NTA的很多思路,NTZC这个项目基本原理如下

1、将连续的若干页mmap映射到用户空间; 2、内核模块自行管理这些页的内存,并且作为DMA地址交给网卡驱动收发包使用; 3、网卡驱动接收到的报文,如果需要交给用户空间时,该报文的描述符,即报文内存指针的页起始地址和相对偏移位置会被内核模块放到特定的缓冲区中,等待用户空间读取;相应的,报文内存引用计数会增加; 4、用户空间通过文件方式读取报文描述符,并计算出对应的用户空间地址,即可访问报文;在 报文生命周期结束后,通过写文件方式告诉内核空间减少引用计数,如果引用计数为1,内核模块则释放之。 5、用户空间发报文也采取类似的方式,只不过报文内存由用户空间发起命令,内核分配,再交由用户空间使用。

NTZC的设计中,认为既然用户空间可以以足够低的成本收发报文了,因此取消了网卡驱动和Linux 协议桟之间的交互,当然,从NTZC管理的报文内存中拷贝一份出来交给标准协议栈处理,也是很容易的事情。

由于优先考虑到不对内核打补丁,因此没有修改sk_buff的内存管理机制,相反的,实现了和sk_buff接口语义几乎相同,但内存管理机制发生变化的报文数据结构(m_buf,只是借用了BSD里面的数据结构名称,骨子里就是对sk_buff的复制)。使用这个m_buf数据结构及API,需要对网卡驱动进行修改。

正因为是个通用的零拷贝支持模块,网卡驱动的修改很容易,全局替换sk_buff的操作到m_buf的操作即可,因此,理论上任何在Linux中已经有源代码支持的NIC Driver,都很容易被改造成NTZC的NIC驱动,只是,这块网卡将不能在被Linux协议栈使用。NTZC的代码中也给出了Intel 82575改造后的驱动作为例子。

最后,提供一个配套的用户空间API代码,以帮助应用程序方便的访问零拷贝的编程接口。对应的收包和发包示例程序也包含在内。

目前,NTZC已经进行过一些基本测试,开始趋于稳定,简单测试数据表明,收包可以做到单核普通CPU上 >1M pps报文(无论大小包)不丢包且CPU占用率极低;而发包的性能则可以做到libpcap 发包 4倍左右(特别是大包)。

现在用户空间API的定义还是一个非标准的私有接口,未来可能会考虑发展成和libpcap接口一致。

NTZC的内核模块、用户空间API 和示例程序均以GPL V3授权和商业授权双许可证方式发布

NTZC零拷贝支持恒扬科技 提供的高性能网络业务加速卡,可以实现低成本、高性能、高接口密度的网络流量管理和安全网关方案,这些方案在标准Linux系统上已经有了长时间成熟的商业应用,而零拷贝的支持,将进一步扩大加速卡的应用范围。

欢迎感兴趣的同好对访问、使用甚至一起完善代码。

评分

参与人数 1可用积分 +30 收起 理由
Godbach + 30 多谢分享

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2010-04-06 23:31 |只看该作者
支持lz

论坛徽章:
0
3 [报告]
发表于 2010-04-06 23:45 |只看该作者
感谢楼主分享,先研究下先

论坛徽章:
0
4 [报告]
发表于 2010-04-07 01:29 |只看该作者
好东西

论坛徽章:
0
5 [报告]
发表于 2010-04-07 11:48 |只看该作者
本帖最后由 ShadowStar 于 2010-04-07 11:51 编辑
经过一段时间的开发, 一个完整支持用户空间零拷贝收发网络报文的开源项目 Network Tapping Zero Copy (NTZC ...
dotslash 发表于 2010-04-06 23:05


checkout代码时看见作者roccen感觉很熟悉,google到xkernel.net终于想起来了。
ricardo,是你吧?

哈哈哈

PS。你还挺闲的哦?

论坛徽章:
0
6 [报告]
发表于 2010-04-08 11:02 |只看该作者
支持,最近在做这方面的研究,遇到的最大问题在于内核与用户态的同步机制上面,可以一起研究呀。

论坛徽章:
0
7 [报告]
发表于 2010-04-08 11:09 |只看该作者
回复 1# dotslash

你好,我也正好在学习零拷贝方面的东东,大家可以交流一下。你用QQ吗?偶是6339611

论坛徽章:
0
8 [报告]
发表于 2010-04-08 12:38 |只看该作者
有 没 有 好 的 方 法把 已经 从 驱动 提交上 来 的 skb映射到 共想 内存中 呐 ?

改 驱动 累~~

论坛徽章:
0
9 [报告]
发表于 2010-04-08 13:47 |只看该作者
回复 8# Arthur_
现在标准内核的sk_buff->data 内存分配机制决定了直接映射足够困难; 如果不介意对内核打补丁的话, 用NTZC代码里面的内存管理模块把sk_buff->data的分配和释放替换掉; 就可以不改驱动程序了.
我有一个自己使用的版本就是直接修改skb, 对驱动程序仅做注册修改; 当然这样发布开源代码的话, 既要让用户打补丁/重新编译内核等等, 调试和生产应用起来又比较麻烦...

论坛徽章:
0
10 [报告]
发表于 2010-04-08 14:00 |只看该作者
回复 7# 独孤九贱


    抱歉Linux下没装Q,  我可以用gtalk和skype, 用户名都是roccen, 欢迎讨论
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP