GA黄金甲

Linux经典的几款收包引擎

本文枚举四个较量经典的 Linux 收包引擎,若是尚有其他你以为ok的可以留言。这四个划分是:

libpcap/libpcap-mmap

PF_RING

DPDK

xdp

libpcap

libpcap的包捕获机制是在数据链路层增添一个旁路处置惩罚,不滋扰系统自身的网路协议栈的处置惩罚,对发送和吸收的数据包通过Linux内核做过滤缓和冲处置惩罚,最后直接转达给上层应用程序。

数据包抵达网卡装备。

网卡装备依据设置举行DMA操作。(   「第1次拷贝」  :网卡寄存器->内核为网卡分派的缓冲区ring buffer)

网卡发送中止,叫醒处置惩罚器。

驱动软件从ring buffer中读取,填充内核skbuff结构(   「第2次拷贝」  :内核网卡缓冲区ring buffer->内核专用数据结构skbuff)

接着挪用netif_receive_skb函数:

5.1 若是有抓包程序,由网络分接口进入BPF过滤器,将规则匹配的报文拷贝到系统内核缓存 (   「第3次拷贝」  )。BPF为每一个要求效劳的抓包程序关联一个filter和两个buffer。BPF分派buffer 且通常情形下它的额度是4KB the store buffer 被使用来吸收来自适配器的数据;the hold buffer被使用来拷贝包到应用程序。

5.2 处置惩罚数据链路层的桥接功效;

5.3 凭证skb->protocol字段确定上层协议并提交给网络层处置惩罚,进入网络协议栈,举行高层处置惩罚。

libpcap绕过了Linux内核收包流程中协议栈部分的处置惩罚,使得用户空间API可以直接挪用套接字PF_PACKET从链路层驱动程序中获得数据报文的拷贝,将其从内核缓冲区拷贝至用户空间缓冲区(   「第4次拷贝」  

libpcap-mmap

libpcap-mmap是对旧的libpcap实现的刷新,新版本的libpcap基本都接纳packet_mmap机制。PACKET_MMAP通过mmap,镌汰一次内存拷贝( 「第4次拷贝没有了」 ),镌汰了频仍的系统挪用,大大提高了报文捕获的效率。

PF_RING

我们看到之前libpcap有4次内存拷贝。libpcap_mmap有3次内存拷贝。PF_RING提出的焦点解决计划即是镌汰报文在传输历程中的拷贝次数。

我们可以看到,相对与libpcap_mmap来说,pfring允许用户空间内存直接和rx_buffer做mmap。这又镌汰了一次拷贝 ( 「libpcap_mmap的第2次拷贝」:rx_buffer->skb)

PF-RING ZC实现了DNA(Direct NIC Access 直接网卡会见)手艺,将用户内存空间映射到驱动的内存空间,使用户的应用可以直接会见网卡的寄存器和数据。

通过这样的方法,阻止了在内核对数据包缓存,镌汰了一次拷贝( 「libpcap的第1次拷贝」 ,DMA到内核缓冲区的拷贝)。这就是完全的零拷贝。

其弱点是,只有一个 应用可以在某个时间翻开DMA ring(请注重,现在的网卡可以具有多个RX / TX行列,从而就可以在每个行列上同时一个应用程序),换而言之,用户态的多个应用需要相相互同才华分发数据包。

DPDK

pf-ring zc和dpdk均可以实现数据包的零拷贝,两者均旁路了内核,可是实现原理略有差别。pf-ring zc通过zc驱动(也在应用层)接受数据包,dpdk基于UIO实现。

1 UIO+mmap 实现零拷贝(zero copy)

UIO(Userspace I/O)是运行在用户空间的I/O手艺。Linux系统中一样平常的驱动装备都是运行在内核空间,而在用户空间用应用程序挪用即可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大大都功效。接纳Linux提供UIO机制,可以旁路Kernel,将所有报文处置惩罚的事情在用户空间完成。

2 UIO+PMD 镌汰中止和CPU上下文切换

DPDK的UIO驱动屏障了硬件发出中止,然后在用户态接纳自动轮询的方法,这种模式被称为PMD(Poll Mode Driver)。

与DPDK相比,pf-ring(no zc)使用的是NAPI polling和应用层polling,而pf-ring zc与DPDK类似,仅使用应用层polling。

3 HugePages 镌汰TLB miss

在操作系统引入MMU(Memory Management Unit)后,CPU读取内存的数据需要两次会见内存。第一次要盘问页表将逻辑地点转换为物理地点,然后会见该物理地点读取数据或指令。

为了镌汰页数过多,页表过大而导致的盘问时间过长的问题,便引入了TLB(Translation Lookaside Buffer),可翻译为地点转换缓冲器。TLB是一个内存治理单位,一样平常存储在寄存器中,内里存储了目今最可能被会见到的一小部分页表项。

引入TLB后,CPU会首先去TLB中寻址,由于TLB存放在寄存器中,且其只包括一小部分页表项,因此盘问速率非 ?。若TLB中寻址乐成(TLB hit),则无需再去RAM中盘问页表;若TLB中寻址失败(TLB miss),则需要去RAM中盘问页表,盘问到后,会将该页更新至TLB中。

而DPDK接纳HugePages ,在x86-64下支持2MB、1GB的页巨细,大大降低了总页个数和页表的巨细,从而大大降低TLB miss的几率,提升CPU寻址性能。

4 其它优化

SNA(Shared-nothing Architecture),软件架构去中心化,只管阻止全局共享,带来全局竞争,失去横向扩展的能力。NUMA系统下不跨Node远程使用内存。

SIMD(Single Instruction Multiple Data),从最早的mmx/sse到最新的avx2,SIMD的能力一直在增强。DPDK接纳批量同时处置惩罚多个包,再用向量编程,一个周期内对所有包举行处置惩罚。好比,memcpy就使用SIMD来提高速率。

cpu affinity:即 CPU 亲和性

XDP

xdp代表eXpress数据路径,使用ebpf 做包过滤,相关于dpdk将数据包直接送到用户态,用用户态当做快速数据处置惩罚平面,xdp是在驱动层建设了一个数据快速平面。在数据被网卡硬件dma到内存,分派skb之前,对数据包举行处置惩罚。

请注重,XDP并没有对数据包做Kernel bypass,它只是提前做了一点预检罢了。

相关于DPDK,XDP具有以下优点:

无需第三方代码库和允许

同时支持轮询式和中止式网络

无需分派大页

无需专用的CPU

无需界说新的清静网络模子

XDP的使用场景包括:

DDoS防御

防火墙

基于XDP_TX的负载平衡

网络统计

重大网络采样

高速生意平台

OK,以上就是今天的分享,若是你以为尚有其他的收包引擎,可以留言分享。

以上就是Linux经典的几款收包引擎的详细内容,更多请关注本网内其它相关文章!

免责说明:以上展示内容泉源于相助媒体、企业机构、网友提供或网络网络整理,版权争议与本站无关,文章涉及看法与看法不代表GA黄金甲滤油机网官方态度,请读者仅做参考。本文接待转载,转载请说明来由。若您以为本文侵占了您的版权信息,或您发明该内容有任何涉及有违公德、冒犯执法等违法信息,请您连忙联系GA黄金甲实时修正或删除。

相关新闻

联系GA黄金甲

18523999891

可微信在线咨询

事情时间:周一至周五,9:30-18:30,节沐日休息

QR code
【网站地图】【sitemap】