网络数据捕获之PF_RING

Linux环境下需要监听网络数据最简单的可以使用SOCK_RAW原始套接字或者直接调用专门进行网络抓包的库接口libpcap,

但是是针对千兆网数据捕获就会有瓶颈,而且随着数据流量的增大捕获主机的CPU会有很大的负担,本人曾亲测使用原始套

接字进行千兆网数据捕获评测,i7服务器主机,网络数据全是1400Byte大包,码率加到600Mbps左右就会出现间歇性丢包

(丢包通过在发包端对数据打上连续计数值,而在接收端校验该连续计数值判断),而且CPU占用率高达40%。

明显存在性能瓶颈,不是很好的千兆网数据捕获解决方案,为此调研了一款开源的高效数据捕获框架PF_RING.


http://www.ntop.org/products/pf_ring/


该捕获方案采用在内核层开出一个比较大的环形缓冲,然后应用层通过mmap映射到内核的缓冲空间,从增加底层缓存到减少

应用层系统调用等方面做了优化,数据捕获性能有了质的提高,而且其从驱动到应用层的接口库都是开源的,例子程序也很全。


官方的测试结果:


1 Gigabit tests performed using a Core2Duo 1.86 GHz, Ubuntu Server 9.10 (kernel 2.6.31-14), and an IXIA 400 traffic generator injecting traffic at wire rate (64 byte packets, 1.48 Mpps):

e1000e
Application transparent_mode=0 transparent_mode=1 transparent_mode=2
pfcount (with -a flag) 757 Kpps 795 Kpps 843 Kpps
pfcount (without -a flag) 661 Kpps 700 Kpps 762 Kpps
pcount (with PF_RING-aware libpcap) 730 Kpps 763 Kpps 830 Kpps
pcount (with vanilla libpcap) 544 Kpps
pfcount (with PF_RING DNA) 1’170 Kpps
igb
Application transparent_mode=0 transparent_mode=1 transparent_mode=2
pfcount (with -a flag) 650 Kpps 686 Kpps 761 Kpps
pfcount (without -a flag) 586 Kpps 613 Kpps 672 Kpps
pcount (with PF_RING-aware libpcap) 613 Kpps 644 Kpps 711 Kpps
pcount (with vanilla libpcap) 544 Kpps
pfcount (with PF_RING DNA)



e1000e\igb分别为intel的两款网卡驱动,transparent_mode为PF_RING驱动加载时的参数。PF_RING效率最高的是DNA (Direct NIC Access)模式,

但是该模式代码并未全部开源,而且使用有限制。


本人亲测在Atom D525上,intel 82574网卡芯片,1400Byte大包可以达到960Mbps满速率,24小时没有任何丢包。而且CPU使用率仅为10左右。

但是官方的提供的PF_RING 5.2.3版本及以下存在一个bug,长时间运行会出现丢包问题,特别是在Atom系列这样性能比较弱的处理器上比较明显,

属于软件bug,而非框架性能瓶颈。

你可能感兴趣的:(linux,优化,socket,网络)