一种基于DPDK的数据包处理方法及装置与流程

文档序号:19749824发布日期:2020-01-21 19:13阅读:494来源:国知局
一种基于DPDK的数据包处理方法及装置与流程

本申请涉及计算机技术领域,具体而言,涉及一种基于dpdk的数据包处理方法及装置。



背景技术:

在网络数据处理场景中,存在同一台服务器上需要将采集到的网络数据包交给多个服务进行处理的场景。目前常用的方式是通过linuxbridge网桥或者openvswitch(ovs)来构造虚拟交换设备,虚拟出多个端口,并将物理端口采集到的数据转发到虚拟端口中,每个服务绑定不同的虚拟端口,读取虚拟端口中的数据包并进行处理。但是该方式在应用时需要创建虚拟交换机,并根据需求做相应的配置,而且存在数据包多次拷贝的情况,降低收发性能。



技术实现要素:

本申请实施例的目的在于提供一种基于dpdk的数据包处理方法及装置,使用数据平面开发套件dpdk实现零拷贝的多服务数据包共享,不需要部署虚拟交换机,有效提升性能。

第一方面,本发明实施例提供一种基于dpdk的数据包处理方法,包括:在dpdk运行环境中,从至少一个网卡中读取数据包,并将所述数据包保存在mbuf中;将mbuf分别加入到预先创建的多个无锁队列中,所述多个无锁队列中的每个无锁队列分别与一个数据包处理服务绑定,以使所述数据包处理服务从绑定的无锁队列中读取所述mbuf并处理所述mbuf中的数据包。

上述方案中,在从网卡中读取到数据包后,将数据包保存在mbuf中,并将mbuf入队到已与数据包处理服务绑定的多个无锁队列中,上层应用服务通过绑定的无锁队列从队列中读包,由于每个无锁队列中存放的mbuf指针指向同一个mbuf,因此所有的无锁队列中这个mbuf是共享的,从而多个数据包处理服务可以共用mbuf中的这一数据包,实现零拷贝的多服务数据包共享。

在可选的实施方式中,在将mbuf分别加入到预先创建的多个无锁队列中之前,所述方法还包括:设定数据包的引用计数,并在所述mbuf中存储引用计数的值。

在可选的实施方式中,所述方法还包括:在mbuf中引用计数的值为0的情况下,释放所述mbuf。

在上述的两个实施方式中,通过设定引用计数使得mbuf能够被多个数据包处理服务使用,并在多个数据包处理服务处理结束后被释放。

在可选的实施方式中,在从至少一个网卡中读取数据包之前,所述方法还包括:初始化所述dpdk,以确定所述网卡的工作模式、申请内存池以及创建多个无锁队列。

在上述的初始化中,通过内存池机制能够便于dpdk更加简单的管理内存,同时,创建多个无锁队列后,通过将无锁队列与数据包处理服务绑定,使得数据包能够得到共享。

在可选的实施方式中,所述无锁队列为ring队列,所述方法还包括:当存在多余的ring队列时,且有待扩展数据包处理服务,则从所述多余的ring队列中选取与所述待扩展数据包处理服务数量相同的ring队列作为目标ring队列,并将所述目标ring队列分别与一个所述待扩展数据包处理服务进行绑定。

在上述方案中,数据包处理服务的个数可以动态扩展,当存在待扩展的数据包处理服务时,只需要将服务与预创建的多个ring队列中未使用的ring队列绑定即可,服务的动态扩展十分便捷。

第二方面,本发明实施例提供一种基于dpdk的数据包处理装置,包括:读取模块,用于在dpdk运行环境中,从至少一个网卡中读取数据包,并将所述数据包保存在mbuf中;共享模块,用于将mbuf分别加入到预先创建的多个无锁队列中,所述多个无锁队列中的每个无锁队列分别与一个数据包处理服务绑定,以使所述数据包处理服务从绑定的无锁队列中读取所述mbuf并处理所述mbuf中的数据包。

在可选的实施方式中,所述共享模块还用于:设定数据包的引用计数,并在所述mbuf中存储引用计数的值。

在可选的实施方式中,所述无锁队列为ring队列,所述装置还包括:服务扩展模块,用于在存在多余的ring队列时,且有待扩展数据包处理服务,则从所述多余的ring队列中选取与所述待扩展数据包处理服务数量相同的ring队列作为目标ring队列,并将所述目标ring队列分别与一个所述待扩展数据包处理服务进行绑定。

第三方面,本发明实施例提供一种存储介质,所述存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行如前述第一方面的实施方式所述的方法。

第四方面,本发明实施例提供一种电子设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当所述电子设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行如前述第一方面的实施方式所述的方法。

附图说明

为了更清楚地说明本申请实施例的技术方案,下面将对本申请实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1为本申请实施例提供的数据包处理方法的流程图;

图2为本申请实施例提供的数据包处理方法的示意图;

图3为本申请实施例提供的数据包处理装置的示意图;

图4为本申请实施例提供的电子设备的示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。

数据平面开发套件(dataplanedevelopmentkit,dpdk)是由intel等多家公司开发,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,提高数据平面应用程序的工作效率。本申请实施例使用dpdk为应用层的多个数据包处理服务提供零拷贝的数据包共享,以下将根据图1所示的流程图详细介绍本实施例提供的数据包处理方法。

该方法包括如下步骤:

s101:预先进行dpdk环境部署。

dpdk的环境部署包括设置运行环境与系统变量、加载驱动模块、绑定需要采集数据包的一个或者多个网卡和分配大页内存等。

首先需进行dpdk目标环境的安装,在目标环境创建完成后,将包含构建客户应用程序所需dpdk运行环境的所有库,包括dpdk的轮询驱动程序和dpdk环境头文件。在创建好目标环境之后,用户也可以通过编辑目录中的.config文件对dpdk配置进行修改。dpdk程序在运行前,将设备中使用的所有网卡绑定到uio_pci_generic,igb_uio或者是vfio-pci模块上。如果是由linux内核驱动控制的网络端口,则需先将端口从linux解绑,然后将其绑定到uio_pci_generic,igb_uio或者vfio-pci模块上供dpdk使用。dpdk通过轮询方式不断从绑定的网卡中读取数据包,未与dpdk绑定的网卡将被dpdk轮询驱动忽略,不能被dpdk程序读取。

linux的内存页默认采用4kb为一页,页越小内存越大,页表的内存占用也越大,通过分配大页内存,程序需要更少的页面,有效提升性能。大页内存的分配应当在设备系统启动时或者在设备系统启动后尽快完成,以避免物理内存碎片化。大页内存的申请可以指定申请的内存页个数和默认内存页的大小,例如分配4个1g的内存页,内存页个数为4,内存页大小为1g,则需要指定的参数如下:default_hugepagesz=1ghugepagesz=1ghugepages=4。

s102:预先初始化dpdk。

在运行dpdk之前,预先初始化dpdk,以确定网卡的工作模式、申请内存池以及创建多个无锁队列等。

一般情况下,设备网卡都工作在非混杂模式,即网卡只接受目的地址指向自己的数据包。初始化dpdk时,将网卡的工作模式设置为混杂模式,dpdk运行时,通过轮询驱动能够获取所有经过该网卡的数据包,如果网卡是工作于非混杂模式,由于网卡对网络端口中的数据包进行了目的地址的筛选,则经过网卡的数据包中存在较多数据包没有进入到网卡中,导致一些数据包被丢弃。针对网卡的工作模式可以采用任意方式将网卡设置为混杂模式,本实施例对此不做限定。

内存池提供内存的获取和释放等操作接口,dpdk通过调用不同的接口能够从内存池中获取mbuf中的数据,以及将mbuf释放,能够更加简单的管理内存。为了高效访问数据,dpdk将内存封装在mbuf(memorybuffer,存储器缓存)结构体中,即通过mbuf来封装和存放接收到的数据包。mbuf存放在创建的内存池中,能够避免频繁收发包申请mbuf内存带来的性能开销。在创建内存池时,在预先分配的大页内存中创建一个连续的大缓冲区作为内存池,在内存池中创建有多个连续的对象元素,即mbuf,mbuf用于存储dpdk从网卡中接收到的数据包。在创建内存池的同时,还会创建多个无锁队列,该无锁队列为ring队列,ring队列是将队列串接起来形成的环形的无锁队列。

上述步骤s101-s102是在实施数据包处理方法之前预先执行的,如果设备已经预先部署了dpdk的运行环境以及预先已对dpdk进行了初始化,那么上述步骤可以省略,即直接执行以下的步骤s103。

s103:dpdk从至少一个网卡中读取数据包,并将数据包保存在mbuf中。

dpdk通过轮询方式从绑定的网卡中读取到数据包,并将数据包封装在内存池中的mbuf结构体内。内存池中的多个mbuf的结构相同,均由头部、数据区域和尾部构成,dpdk将数据包封装在mbuf的数据区域。

s104:将mbuf分别加入到预先创建的多个无锁队列中,多个无锁队列中的每个无锁队列分别与一个数据包处理服务绑定。

应用层中的每一个需要对数据包进行处理的服务均从预先创建的多个无锁队列中选取一个无锁队列,进行绑定。在实际应用中,dpdk可以将mbuf分别入队到所有已与数据包处理服务绑定的无锁队列中,对于未与数据包处理服务绑定的空闲无锁队列,可以不入队,或者也可以将mbuf入队到所有已创建的无锁队列中,这样在运行时可以无需判断无锁队列是否与数据包处理服务绑定,使得逻辑上更加简洁通用,且不会影响其性能。

无锁的ring队列中存放的是mbuf的指针,而不是mbuf本身的数据拷贝。mbuf入队的所有ring队列中存放的指针指向同一个mbuf,也就是说,所有的ring队列中存储的这个mbuf是共享的,是同一个mbuf,每个数据包处理服务通过访问绑定的ring队列能够读取该mbuf中存放的数据包。由于设置了多个ring队列,且数据包处理服务与ring队列一一对应,因此即便某一个或多个数据包处理服务在读取mbuf并从ring队列中取出了mbuf的指针之后,也并不影响其他ring队列中存放的mbuf指针,其他数据包处理服务仍可从对应的ring队列中读取mbuf,从而可实现应用层中的多个数据包处理服务对mbuf中数据包的共享。

s105:应用层中的多个数据包处理服务从绑定的无锁队列中读取mbuf并处理mbuf中的数据包。

上述所指的数据包处理服务可以是应用程序的一个线程或者一个进程,每个数据包处理服务通过对应的无锁队列读取mbuf,解析读取的mbuf,并对mbuf中的数据包进行处理。

在dpdk将mbuf入队到多个ring队列之前,该方法还包括:通过dpdk设定数据包的引用计数,并在mbuf中存储引用计数的值。mbuf中除了存储从网卡中读到的数据包以外,还存储一些其他的信息,包括上述的引用计数的值。mbuf每加入到一个ring队列中引用计数的值则加1,当有数据包处理服务从ring队列中读取mbuf中的数据并处理后,mbuf引用计数的值减1。因此,如果有m个ring队列与数据包处理服务绑定,则在mbuf入队到所有ring队列后,存储的引用计数的值为m,mbuf等待数据包处理服务的读取,当所有的数据包处理服务均已读取mbuf中的数据包并进行包处理后,引用计数的值逐步减小至0。

当mbuf不再使用,即所有数据包处理服务均已读取该mbuf后,则可以释放mbuf所占用的内存空间,以便于mbuf存储新的从网卡接收到的数据包,避免mbuf资源的持续占用。因此在引用计数的值为0的情况下,即与ring队列绑定的每个数据包处理服务均已读取并处理mbuf中的数据包后,释放该mbuf。设置引用计数的目的是使mbuf能够被多个数据包处理服务使用,以及在多个数据包处理服务处理结束后被释放。

图2为本实施例中数据包处理方法的示意图,如图2所示,dpdk能够读取设备中的j个网卡上的数据包,并通过mbuf进行存储,k个ring队列分别与k个数据包处理服务一一绑定,mbuf分别入队到k个ring队列中,每个数据包处理服务通过访问对应的ring队列读取mbuf中的数据包。

需要说明的是,在实际应用场景中,针对网卡持续接收到的数据包,mbuf的入队步骤与数据包处理服务的读取步骤是异步执行的。dpdk通过轮询驱动不断从网卡读取数据包,并将每一个数据包分别保存在一个mbuf中,与此同时,数据包处理服务也通过ring队列不断从mbuf中读取数据包,两个步骤之间在严格意义上没有先后关系,为便于理解,附图中的顺序示出的是针对一个数据包,从被接收、被保存至mbuf、将mbuf入队到ring队列中、mbuf被数据包处理服务读取的一个完整顺序,不应当限定为本实施例提供的方法必须具有这样的顺序。

进一步的,在本实施例中,数据包处理服务的个数可以动态扩展,能够任意增加或减少。该方法还包括如下步骤:当存在多余的ring队列时,且有待扩展数据包处理服务,则从多余的ring队列中选取与待扩展数据包处理服务数量相同的ring队列作为目标ring队列,并将目标ring队列分别与一个待扩展数据包处理服务进行绑定;当存在待解绑数据包处理服务时,则将待解绑数据包处理服务与绑定的ring队列进行解绑。

例如,dpdk在步骤s102时预先创建有n个ring队列,并且在n个ring队列中已有m个ring队列分别与m个数据包处理服务绑定,m≤n。在n个ring队列中存在多余的ring队列且设备中有x个待扩展的数据包处理服务时,则从多余的n-m个ring队列中选取x个ring队列,并将x个ring队列分别与x个待扩展数据包处理服务对应绑定,在下一时刻,dpdk将数据包保存至mbuf后,mbuf的入队从原本的m个ring队列变为扩展后的m+x个ring队列,mbuf入队后其中引用计数的值也从原本的m变为m+x,使得新的x个数据包处理服务能够与原本的m个数据包处理服务共享数据包,从而实现服务的动态扩展。因此,当存在待扩展的数据包处理服务时,只需要将服务与预创建的多个ring队列中未使用的ring队列绑定即可,而当需要减少数据包处理服务的个数时,也只需要将待解绑数据包处理服务与对应的ring队列解绑即可,解绑后的ring队列将等待与新的数据包处理服务绑定,本实施例提供的方法使得服务的动态扩展十分便捷。

具体的,可以在数据包处理服务的启动参数或者配置脚本中预先作有相应的配置,每当一个数据包处理服务启动时,将自动从多余的ring队列中选取一个ring队列进行绑定,而在数据包处理服务退出时,则自动将其与已绑定的ring队列进行解绑,以释放mbuf资源。具体也可以向每个数据包处理服务提供应用程序编程接口api,数据包处理服务在启动或者退出时通过调用api来实现查找、绑定以及解绑的过程。

本实施例提供的数据包处理方法具有如下特点:(1)dpdk从绑定的网卡中读取数据包后,将数据包保存在内存池中的mbuf中,并将mbuf入队到已绑定的ring队列中,每个ring队列类似于虚拟交换机中的一个虚拟端口,上层应用服务通过绑定ring队列从队列中读包,由于每个ring队列中存储的mbuf是相同的,是共享的,因此多个数据包处理服务可以共用这一数据包,实现多服务间数据包的共享;(2)该方法基于dpdk收取网卡的数据包,具有高性能的数据采集特性,采集到的数据包不做转发,而是利用mbuf和多个ring队列实现共享,由于dpdk运行在用户态,绕过了linux内核态协议栈,能够减少中断,提升数据处理效率,并且区别于现有的虚拟交换机,实现数据包的零拷贝,有效提升性能。

本实施例中的数据包处理方法,通过共享大页内存、无锁ring队列、设定引用计数等,不仅能满足网络数据处理场景中多个服务共用数据包的需求,实现多线程或多进程共享数据包,而且不需要部署虚拟交换机,减少了环境配置,且使用dpdk进行数据包采集,能获得优越的性能。该方法可部署在通用服务器或者任一具有网络通信能力的电子设备上,大大减少对硬件设备的依赖。

基于同一发明构思,请参照图3,本申请实施例还提供一种基于dpdk的数据包处理装置200,装置200包括:

读取模块201,用于在dpdk运行环境中,从至少一个网卡中读取数据包,并将数据包保存在mbuf中;

共享模块202,用于将mbuf分别加入到预先创建的多个无锁队列中,多个无锁队列中的每个无锁队列分别与一个数据包处理服务绑定,以使数据包处理服务从绑定的无锁队列中读取mbuf并处理mbuf中的数据包。

可选的,共享模块202还用于:设定数据包的引用计数,并在mbuf中存储引用计数的值。

可选的,共享模块202还用于:在mbuf中引用计数的值为0的情况下,释放mbuf。

可选的,装置200还包括:初始化模块,用于初始化dpdk,以确定网卡的工作模式、申请内存池以及创建多个无锁队列。

可选的,该无锁队列为ring队列,装置200还包括:服务扩展模块,用于在存在多余的ring队列时,且有待扩展数据包处理服务,则从多余的ring队列中选取与待扩展数据包处理服务数量相同的ring队列作为目标ring队列,并将目标ring队列分别与一个待扩展数据包处理服务进行绑定。

本申请实施例所提供的基于dpdk的数据包处理装置,其实现原理及产生的技术效果和前述方法实施例相同,为简要描述,装置实施例部分未提及之处,可参考前述方法实施例中相应内容,在此不做赘述。

本申请实施例还提供一种存储介质,该存储介质上存储有计算机程序,当该计算机程序被处理器运行时执行如本申请上述实施例提供的数据包处理方法。

请参照图4,本实施例提供一种电子设备300,包括处理器301和存储器302,存储器302中存储有至少一条指令、至少一段程序、代码集或指令集,至少一条指令、至少一段程序、代码集或指令集由处理器301加载并执行,以实现上述实施例提供的数据包处理方法。电子设备300还可以包括通信总线303,其中,处理器301和存储器302通过通信总线303完成相互间的通信。存储器302可以包括高速随机存取存储器(作为缓存),还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。通信总线303是连接所描述的元素的电路并且在这些元素之间实现传输。例如,处理器301通过通信总线303从其它元素接收到命令,解码接收到的命令,根据解码的命令执行计算或数据处理。

电子设备300上安装有至少一个网卡且运行有dpdk程序,dpdk通过轮询驱动能够获取该至少一个网卡接收到的数据包,并将数据包存放在mbuf中,应用层中的多个服务通过绑定的ring队列读取mbuf中的数据包,从而电子设备300上运行的多个服务能够共享数据包。电子设备300可以包括但不限于台式计算机、个人计算机、服务器等具有网络通信能力的计算设备。

在本申请所提供的实施例中,应该理解到,所揭露装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

另外,作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

再者,在本申请各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。

需要说明的是,功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-onlymemory,rom)随机存取存储器(randomaccessmemory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。

在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。

以上所述仅为本申请的实施例而已,并不用于限制本申请的保护范围,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1