ymind的个人空间 https://bbs.21ic.com/?643836 [收藏] [复制] [RSS]

日志

Linux上实现网口转发的五种方法,在P1010 PowerPC上

已有 3096 次阅读2013-9-14 10:53 |个人分类:P1010|系统分类:通信网络| bridge, router, NAT, Linux, netmap

因客户要测试我们的设备P1010GAP的网口转发性能,于是我不得不又新release了一版,同时也跑了一下网口转发。
    最常用的是Linux自己支持的bride,router,NAT三种方式;
    实际上在应用层也能做到,如用libpcap捕捉并转发,但性能很差,好处是在应用层实现自己的协议栈,大数据分析等,代码模型成熟和调试简单。一个改进是用netmap的网络模型,其bridge程序转发性能高,对小包也是如此。

1. Linux bridge
  内核原来没使能CONFIG_BRIDGE=y,需要使能。本质上是bridge两个不同物理网段成一个。
  # ifconfig eth0 up
  # ifconfig eth1 up
  # brctl addbr br0
  # brctl addif br0 eth0
  # brctl addif br0 eth1
  # ifconfig br0 up
  不用配IP,在另两台机器上一个跑netserver,一个跑netperf,得到约750Mbps的转发性能,这是大包。
2. Linux router
  这个我估计性能会比bridge略差一些,没测。因为要配成不同网段IP和路由,再使能ip_forward即可。
3. Linux NAT
  iptables我编译出来了,但还要内核支持。因没编译成模块,导致内核尺寸大于4MB,于是暂时放弃了。客户又不用,转发性能比router差也正常,毕竟要修改IP帧。

4. libpcap
  bridge_pcap.c核心代码如下:
void do_send(u_char *user, const struct pcap_pkthdr *h, const u_char *buf)
{        pcap_inject((pcap_t *)user, buf, h->caplen);   }
      p0 = pcap_open_live(argv[1], 0, 1, 100, NULL);
     pcap_dispatch(p0, burst, do_send, (u_char *)p1);
  但是P1010的自带网卡驱动gianfan.c某处有问题(我估计是Tx中断丢失,又没即使切换到NAPI的poll方式),导致NETDEV WATCHDOG。所以只能从gianfan网卡eth0收进来,外扩的PCIe网卡eth3发出去。
  # bridge_pcap eth0 eth3

5. netmap bridge
    netmap的核心思想是在用户层轮询网卡硬件(描述字)。大家可能知道在网络重负载的情况下,网卡中断过于频繁,可能导致系统僵死;于是Linux-2.6某版以后引入了NAPI机制,在这种情况下,及时关掉网卡中断,然后轮询处理。netmap更进一步,抛弃掉内核协议栈,直接在应用层轮询,在应用层直接处理数据;这对多核系统尤其有效,比如thread 0,1分别绑定在两个核上,thread0专门轮询,thread1专门处理分析数据 (My God, 大数据分析!)。
  遗憾我们用的P1010是单核e500v2 @800Mhz。

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)