免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: dotslash
打印 上一主题 下一主题

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

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


   好东西,支持LZ!!!!

论坛徽章:
0
12 [报告]
发表于 2010-04-20 15:05 |只看该作者
不错不错哦。。。。

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:192015年迎新春徽章
日期:2015-03-04 09:57:09
13 [报告]
发表于 2010-04-20 16:57 |只看该作者
不错不错,支持楼主!

论坛徽章:
0
14 [报告]
发表于 2010-04-21 17:13 |只看该作者
zc做的挺不错的~ 官方要是能公布具体的测试平台和结果就更好了~
ryan3216_cu 该用户已被删除
15 [报告]
发表于 2010-04-21 17:17 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
16 [报告]
发表于 2010-04-21 21:53 |只看该作者
回复 14# sumireko


    测试平台有三个:
1、虚拟机,用定时器每个jiffies模拟产生报文,交给sniff程序计数、读报文头然后释放,在2.8G Macbook Pro + Vmware Fusion(2core, 4G memory, 64-bit kernel 2.6.31) 虚拟机上每秒可以做到 250*8k = 2M pps(2K以内各种大小报文对性能没有影响); 此时一个核CPU已经被内核生成包的定时器占满,另一个核跑sniff程序,大概占用了 10-20%;

2、AMD Opteron 2.0G CPU, 4核 1M cache的服务器,BCM万兆卡,kernel 没有打开irq balance;没有运行sniff之前,直接修改原生驱动程序在netif_receive 之前释放收到的报文,CPU1个核可以达到1.7M pps的收包能力,再大就因为ksoftirq占满1个CPU核而导致丢包;运行ntzc+sniff后,CPU可以达到1.1M pps的抓包能力(包括用户空间sniffer收包、计数、读报文头和释放空间),此时CPU1个核被ksoftirq线程占满,另一个核运行sniff程序,CPU占用率 <30%;

3、Intel C2D E4500的一台兼容机上,网卡是我们自己的网络业务加速卡(Semptian NSA卡,4GE业务接口),加速卡和CPU之间的接口是Intel 82575 Dual GE,流量经过双通道负载分担后上到2个CPU核后,可以达到1.5Mpps的抓包能力(包括用户空间sniffer收包、计数、读报文头和释放),每个核CPU占用率 <50%;在报文大小 >=256字节时,sniffer GE线速抓包的CPU占用率降到 10% 以内。

从2和3的情况来看,ntzc本身并没有增强对突发小包的捕获能力,但大大节省了大包到用户空间时memcpy对CPU的占用;另外,由于ntzc可以很容易支持每个核上独立管理报文内存,如果配合网卡的多通道能力,在多进(线)程用户程序处理报文时,可以最大程度减少cache在多个核间同步带来的性能损失。

论坛徽章:
0
17 [报告]
发表于 2010-04-22 17:55 |只看该作者
很不错的东西

论坛徽章:
0
18 [报告]
发表于 2010-04-25 19:44 |只看该作者
本帖最后由 止觞 于 2010-04-25 19:45 编辑

回复 1# dotslash
     对不起,我是第一次接触零拷贝,你的代码我拿来运行,为什么编译不过?
   我的测试平台是VMWARE 7.0,操作系统CentOS 5.0, 在编译驱动模块pcnet32.ko时,报错如下:
   
    我的编译方法是将zc文件夹下的文件都拷贝到了driver/net/目录下,然后make modules
    请问,是不是我的编译方法不对,楼主能不能给一个详细的使用说明?
    PS: 初学驱动,希望楼主不吝赐教~~~~非常非常感谢!

论坛徽章:
0
19 [报告]
发表于 2010-04-25 20:23 |只看该作者
回复 18# 止觞


    这样拷贝编译是可以的;其实在zc目录下直接进行 make 亦可;

    你的pcnet32代码之所以编译不过,是因为我代码里的pcnet32.c是直接拿kernel 2.6.31里面的pcnet32.c进行修改的一个示例,驱动的代码都只是作为示例程序而没有考虑版本的通用性。
  
    通常,如果你需要在一个特定内核版本中支持一个特定的NIC驱动,你可以仿照pcnet32的例子,对相应内核版本中已有的NIC驱动程序进行修改,具体而言,对skb相关的函数等进行全局替换修改,再修改发送函数,并且加上NIC到zc模块的注册函数即可。需要特别说明的是,ntzc的目的是提供一个零拷贝通用的支持框架,如果内核中原始的驱动程序本身没有考虑多版本兼容,我也就没有自己进行修改,而是需要使用者自己对驱动代码进行简单的修改。

论坛徽章:
0
20 [报告]
发表于 2010-05-01 14:38 |只看该作者
我在虚拟机里成功编译通过,但是insmod ntzc.ko时显示内存溢出,于是我增大了虚拟机的内存,并且根据作者的意见更改了源码,但是依然出现同样的错误。
    同时,我试验过在 裸机的ubuntu下insmod ntzc.ko成功装载,想问一下大家有没有人能指教到底是怎么回事?恳请高手给出意见,谢谢大家了~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP