背景技术
随着网络通信技术的发展,网络带宽迅速提高,1Gbit、10Gbit网络逐渐普及,40Gbit网络在电信运营商、大型企业级骨干网络中大规模应用。网络流量的指数级增长,对防火墙、IDS/IPS、应用网关等网络数据包分析处理类网络产品的性能提出了新的挑战。传统的网络数据包处理方法在高速网络环境下面临着丢包率高,延时大,系统负载高等问题,无法满足高速网络环境下的网络数据包实时处理。目前,业界主要有以下三种主流的方法:
1、PF_RING:是由ntop公司提出的一种高速网络数据包处理的软件解决方法。该方法通过在Linux系统网络协议栈中引入PF_RING协议族,并结合环形队列与内存映射技术,大幅提升了网络数据包的捕获速度。在1Gbit网络小包流量下,传统的基于PCAP的抓包方法,其捕包率只能达到20%左右,而采用了PF_RING之后,其捕包率能提高到70%左右。
2、DPDK:DPDK(Data Plane Development Kit,数据面开发套件)是Intel公司提出的一种高速网络数据包的软件开发套件,现已开源。前期主要支持采用Intel CPU及网卡的系统,现已支持IBM Power、ARM等其他CPU,以及部分非Intel的网卡。DPDK通过旁路Linux系统网络协议栈,直接对网卡进行读写,结合对多核CPU中不同内核的绑定,能够实现1Gbit网络小包流量下的线速收发。
3、硬件智能网卡:除了软件实现高速网络数据包处理的方法外,近几年,也出现了一些硬件解决方法。该方法主要是采用基于PCIe接口的硬件智能网卡,如基于Tilera的智能网卡,基于Cavium的智能网卡等。智能网卡上带有多核处理器、内存、物理网络接口,以及针对网络数据包处理进行特别设计的硬件加速单元等,通过智能网卡,直接实现对网络数据包的线速收发,从而能够大幅减轻智能网卡所在的宿主机的CPU负载。
网络数据包分析处理是集网络数据包捕获、分析处理、网络数据包发送于一体的综合应用。任何一个环节在性能上出现问题,都会严重影响整个应用的性能。上述的三种主流的方法中,PF_RING方法虽然大幅提升了捕包率,但还存在不少的丢包率,且CPU负载高,不能满足商业的应用需求;传统的基于DPDK方法主要侧重于数据包的线速收发,当加入对数据包的处理过程后,其性能会大幅下降,达不到数据包的线速接收、处理与发送;硬件智能网卡方法虽然能够显著降低宿主机CPU负载,但一方面需要额外配置价格昂贵的硬件智能网卡,另一方面,宿主机的CPU不能得到充分利用,浪费了资源,因此不适合普通的商业应用。
发明内容
为了解决上述技术问题,本发明提供了一种基于Intel DPDK的网络数据包并行处理方法。
为了达到上述目的,本发明所采用的技术方案是:
基于Intel DPDK的网络数据包并行处理方法,包括以下步骤,
步骤一,构建Intel DPDK运行环境;
步骤二,创建内存池,创建用于接收网络数据包的RX内存环和用于发送网络数据包的TX内存环;
步骤三,设置网络数据包调度策略,准备进行网络数据包调度;
步骤四,创建多个工作线程,进行网络数据包的并行处理。
步骤一中,构建Intel DPDK运行环境的过程为,
A1)启动配置;
包括设置Linux内核启动参数和设置huge page内存;
A2)加载Linux系统UIO驱动框架模块,加载Intel网卡 UIO内核驱动模块;
其中,驱动采用Poll模式来获取网卡数据包;
A3)绑定当前物理网口到Intel UIO驱动,使得当前物理网口脱离Linux内核网络协议栈;
A4) 加载hugetlbfs文件系统,利用hugetlbfs文件实现对huge page内存映射操作;
A5)获取Linux系统信息;
Linux系统信息包括CPU颗粒数、内存通道及容量、每颗CPU的核心数以及DPDK可使用的网络接口。
所述内存池为创建在huge page内存中若干内存块,内存块部分空间用于存储内存块自身信息,其余空间用于存储网络数据包;
内存环采用无锁结构设计,内存环中存储的是网络数据包所在内存块的指针地址。
网络数据包调度策略包括,
a、按VLAN号分配:根据网络数据包中的VLAN号,将接收到的网络数据包分配给工作线程进行处理;
b、按地址分配:根据网络数据包的源地址和目的地址,识别出通信双方,保证同一源地址和目的地址的网络数据包被分配到同一工作线程;
c、按流分配:根据网络数据包的源地址、目的地址、源端口、目的端口及传输协议,识别出会话数据流,保证同一会话数据流被分配到同一工作线程。
当Intel网卡硬件支持RSS时,网络数据包调度为硬件调度;当Intel网卡硬件不支持RSS时,网络数据包调度为软件调度。
工作线程与CPU核一对一绑定,每一个工作线程都分配有一个RX内存环和一个TX内存环,同一网络数据包的处理均在同一个工作线程中完成。
本发明所达到的有益效果:本发明提出的基于Intel DPDK的网络数据包并行处理方法,充分利用多核CPU的性能优势,通过无锁的数据结构设计,并行的网络处理框架,高效的网络数据包分发,实现网络数据包在多个CPU核上的并行处理,该方法减少了不必要的数据拷贝,提升了cache命中率,消除了系统调用、网卡中断带来的切换损耗,大幅提升了整机的处理性能,从而能够在千兆网络环境下,利用普通工控机实现对高速网络数据包的线速处理。
具体实施方式
下面结合附图对本发明作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。
高速网络环境下,每秒处理的网络数据包个数显著增加,尤其是小包居多时,如千兆网络下,每秒可以收发约1.48Mpps的64字节小包,如此快速的数据包速率,每一个网络数据包留给一个2GHZ的CPU核的处理时间约为1350个CPU周期,要想实现实时不丢包处理,一方面要尽量减少甚至消除在网络数据包处理时,存在的额外消耗CPU周期的事务,另一方面,在多核环境下,尽量将数据包分摊到多个CPU核进行并行处理,同时减少甚至消除核间不必要通信。基于以上思路,提出一种基于Intel DPDK的网络数据包并行处理方法,将数据面与控制面分开,控制面留给Linux系统本身,并绑定在单独的CPU核上,数据面交给应用程序,同时为数据面创造一个没有线程调度,没有系统调用,没有网卡中断的环境,实现对数据的高效分析与并行处理。如图1所示,具体步骤如下:
步骤一,构建Intel DPDK运行环境。
Intel DPDK运行环境包括硬件环境和软件环境。
硬件环境包括:
CPU:需要使用Intel的CPU,整个系统的CPU核数不少于2。
物理网卡:需要使用Intel的千兆、万兆网卡,网卡硬件带RSS支持更好。
软件环境包括:
Linux内核:支持UIO、HUGETLBFS等功能。
DPDK开发包:包括网卡驱动、DPDK库等。
构建Intel DPDK运行环境的过程如下:
A1)启动配置;
包括设置Linux内核启动参数和设置huge page内存。
设置Linux内核启动参数:
设置内核启动参数isolcpus=1-n(n为从0开始的最后一个CPU core的序号),使得Linux系统本身在进行进程调度时,只使用core0,不使用其他的CPU core,从而可以让其他的CPU core专门用来进行数据面事务的处理。
设置huge page内存:
设置huge pages个数,如hugepages=640,表示预留640×2MB=1280MB的内存空间作为大页面内存(默认一个huge page大小为2MB),当然huge pages个数也可以在Linux系统启动完成后通过命令进行设置。
A2)加载Linux系统UIO驱动框架模块,加载Intel网卡 UIO内核驱动模块;
其中,驱动采用Poll模式来获取网卡数据包,不采用中断模式,从而减少中断切换带来的CPU损耗。
A3)绑定当前物理网口到Intel UIO驱动,使得当前物理网口脱离Linux内核网络协议栈。
A4) 加载hugetlbfs文件系统,如mount -t hugetlbfs nodev /mnt/huge,利用hugetlbfs文件实现对huge page内存映射操作。
A5)获取Linux系统信息;
Linux系统信息包括CPU颗粒数、内存通道及容量、每颗CPU的核心数以及DPDK可使用的网络接口。这些Linux系统信息作为后续CPU核绑定,内存分配,网口使用的基础。
步骤二,创建内存池,创建用于接收网络数据包的RX内存环和用于发送网络数据包的TX内存环。
内存池为创建在huge page内存中若干内存块,内存块部分空间用于存储内存块自身信息,包括自身状态、特性等,其余空间用于存储网络数据包。内存池在程序启动的时候创建,程序运行过程中不进行内存的分配、释放操作,以提升性能。
内存环采用无锁结构设计,通过CAS(Compare And Swap)原子操作,实现多生产者和多消费者并发访问,内存环中存储的是网络数据包所在内存块的指针地址。
步骤三,设置网络数据包调度策略,准备进行网络数据包调度。
网络数据包调度策略包括:
a、按VLAN号分配:根据网络数据包中的VLAN号,将接收到的网络数据包分配给工作线程进行处理;
b、按地址分配:根据网络数据包的源地址和目的地址,识别出通信双方,保证同一源地址和目的地址的网络数据包被分配到同一工作线程;
c、按流分配:根据网络数据包的源地址、目的地址、源端口、目的端口及传输协议,识别出会话数据流,保证同一会话数据流被分配到同一工作线程。
网络数据包调度包括硬件调度和软件调度。当Intel网卡硬件支持RSS时,网络数据包调度为硬件调度,通过配置网卡硬件RSS相关寄存器,绑定内存环,实现网络数据包的硬件调度。当Intel网卡硬件不支持RSS时,网络数据包调度为软件调度,通过软件调度进行网络数据包分发,具体为:创建软件调度线程,并绑定到单独的一个CPU核;接收时,软件调度线程按照设置的调度策略将网络数据包快速分类,根据分类结果将网络数据包所在内存块的内存指针地址写入相应工作线程的RX内存环;发送时,相关工作线程将待发送网络数据包所在内存块的内存指针地址写入到自身对应的TX内存环,并启动发送。
步骤四,创建多个工作线程,进行网络数据包的并行处理。
工作线程为网络数据包的处理线程,负责网络数据包的接收、处理与发送。工作线程与CPU核一对一绑定,即一个工作线程绑定到一个CPU核,不同工作线程绑定到不同CPU核,被绑定的CPU核只运行绑定的工作线程,不参与Linux进程调度,同一网络数据包的处理均在同一个工作线程中完成,多个工作线程并行处理,互不干扰。
每一个工作线程都分配有一个RX内存环和一个TX内存环,RX内存环用于存放接收到的网络数据包所在内存块的内存指针地址,TX内存环用于存放待发送的网络数据包所在内存块的内存指针地址,根据调度策略,通过RSS硬件调度方法或软件调度方法,将接收到的网络数据包分发给相应的工作线程,将相应网络数据包所在内存块的内存指针地址写入到相应工作线程的RX内存环的内存单元中,工作线程不断从RX内存环中获取待处理的网络数据包所在内存块的内存指针地址,定位到相关网络数据包的内容并进行处理,处理完成后,或者进行发送,或者丢弃。
工作线程的网络数据包处理流程如图2所述,具体的处理流程如下:
1、获取当前时间戳,并检查发送定时器是否超时。时间戳从CPU的TSC(Time StampCounter,时间戳计数器)获取。
2、如果发送定时器超时,则检查TX内存环是否有网络数据包需要发送,如果有,则进行批量发送,发送完成后,将已发送网络数据包所占用的内存空间释放到内存池。
3、从RX内存环获取新网络数据包所在内存块的内存指针地址。如果没有新网络数据包,则循环检查,不休眠。如果RX内存环中有大量新网络数据包,则一次批量处理一部分。
4、根据从RX内存环获取的新网络数据包所在内存块的内存指针地址,定位到新网络数据包的内容区域,进行相应的内容处理。根据不同应用场景,处理网络数据包的方法不同,但是需要在原来的内存块中完成数据包的处理,避免内存申请、复制操作。如果处理网络数据包后,网络数据包长度会增加,则在内存池创建的时候,需要为每个内存块预留一定的空间。
5、处理完成后,如果不需要发送网络数据包,则直接丢弃,并将已丢弃的网络数据包所占用的内存空间释放到内存池。
6、如果需要发送网络数据包,则将待发送网络数据包所在内存块的内存指针地址写入TX内存环。
7、检查是否需要立即发送。如果TX内存环中待发送网络数据包个数达到设定的数量,则立即批量发送网络数据包。
8、释放已发送的网络数据包所占内存空间到内存池。
上述基于Intel DPDK的网络数据包并行处理方法,充分利用多核CPU的性能优势,通过无锁的数据结构设计,并行的网络处理框架,高效的网络数据包分发,实现网络数据包在多个CPU核上的并行处理,减少了不必要的数据拷贝,提升了cache命中率,消除了系统调用、网卡中断带来的切换损耗,大幅提升了整机的处理性能,从而能够在千兆网络环境下,利用普通工控机实现对高速网络数据包的线速处理。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。