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,而非框架性能瓶颈。