掌桥专利:专业的专利平台
掌桥专利
首页

一种基于OVS-DPDK的数据包处理方法、系统

文献发布时间:2024-01-17 01:13:28


一种基于OVS-DPDK的数据包处理方法、系统

技术领域

本公开的实施例涉及云计算技术领域,尤其涉及一种基于OVS- DPDK的数据包处理方法、系统。

背景技术

云平台网络是依靠OVS(OpenvSwitch,虚拟交换机)的内核空间实现对应用程序的数据包的处理。数据平面开发套件(DPDK,Data Plane Development Kit)为用于快速数据包处理的函数库与驱动集合。DPDK 结合OVS 后,性能变得高效且方便开发。

OVS-DPDK架构中的CT(Connection Tracking)模块存在一把保护CT跟踪链接表的全局锁,在CT流表跟踪项(后文,统称CT表项)插入删除时执行数据保护。其中,CT(Connection Tracking)模块用于连接跟踪允许跟踪所有逻辑网络连接或会话,从而关联可能构成该连接的所有数据包。DPDK 数据路径上的大部分工作通过轮询模式驱动程序(Poll Mode Driver,PMD)线程负责处理,PMD还执行诸如输入端口的连续轮询等任务。PMD一旦接收到数据包及对其进行分类,分类完成后进行处理动作。

现有处理流表的大致流程如下:在DPDK 数据路径上接收从OVS连接的某个网络设备发来的数据包,从数据包中提取源/目的IP、源/目的端口、协议号的五元组信息;基于上述五元组信息生成的哈希值进行查表,当查表获得的索引值为非空时,则无需更新流表,当查表获得的索引值为空时,则需要获取全局锁,将创建的CT表项插入CT跟踪链接表。若期间全局锁获取失败,则需等待锁释放后,才能执行查表修改操作(包括插入、删除等)。

由此可见,当多线程同时进行数据采集时必须通过解锁和写锁的方式与TCP/IP协议栈进行交互。为此,存在如下问题:(1)目前OVS的CT模块在建链上受限于多PMD进程访问同一块CT跟踪链接表,在查表和插入的全局锁是不能去掉的,这使得随着PMD进程增多时,CPS(Connection Per Second,每秒连接数)性能无法像预想的提高;受制于此,随着硬件网卡带宽(25Gbps到100Gbps)进一步提高,使得OVS-DPDK的PMD的分配策略无法通过PMD数量的增多来提高OVS的CPS。也就是说,这将造成数据包处理速度匹配不了硬件的带宽处理速度。(2)当一个线程获取锁后,执行相关的逻辑代码,执行时间过长,造成其他线程只能睡眠等待,串行处理粒度过大,造成无法充分利用CPU资源。

发明内容

本公开的实施例提供了一种基于OVS- DPDK的数据包处理方法、系统,旨在解决上述问题以及其他潜在的问题中的一个或多个。

为实现上述目的,提供以下技术方案:

根据本公开的第一方面,提供了一种基于OVS- DPDK的数据包处理方法,包括:

步骤S01,从DPDK数据路径上获取PMD数据包并将PMD数据包缓存入批处理batch中;

步骤S02,从批处理batch中获取PMD数据包进行流表处理流程;

在执行流表处理流程时,对批处理batch中的PMD数据包进行查表,当未在CT跟踪链接表查询到CT表项时,创建CT表项并根据全局锁获取情况执行不同操作:当获取全局锁成功时,将该CT表项插入CT跟踪链接表,当获取全局锁失败时,将该CT表项的指针填充入CT缓存节点中;

步骤S03,当批处理batch中的数据包取完后,执行CT缓存节点的CT表项插入流程;当CT缓存节点的CT表项插入流程执行完毕后,返回步骤S01对下一轮PMD数据包进行处理;

在执行CT缓存节点的CT表项插入流程时,当全局锁获取成功时,将CT缓存节点中指针所对应的CT表项插入CT跟踪链接表并删除该CT缓存节点。

本公开实施例的方法在建链获取锁失败时,不等待锁释放,而是利用等待锁释放的时间做其他操作,即将CT表项的指针填充入CT缓存节点中。在此过程中,无需耗费时间等待锁释放。在取完数据包后,利用CT缓存节点的CT表项插入流程,再将CT表项插入。本公开实施例降低了批量处理数据包时串行处理的时间,提高了CPS速率以及流表的卸载速度,优化了网络性能。

在一些实施例中,所述流表处理流程包括:

判断批处理batch中的数据包是否取完,若取完,则结束,若未取完,执行后续流程;

查询CT跟踪链接表,当未能查到CT表项时,创建CT表项并基于该数据包填充所述CT表项;

获取全局锁,当全局锁获取成功时,将该CT表项插入CT跟踪链接表;当全局锁获取失败时,将该CT表项的指针填充入CT缓存节点中;

逐个从批处理batch中获取数据包执行上述流程,直到取完数据包为止。

在一些实施例中,所述流表处理流程还包括:当查到CT表项时,更新该CT表项的状态,之后从批处理batch中获取下一个数据包执行流表处理流程。

在一些实施例中,所述基于该数据包填充所述CT表项的过程包括:将数据包中的源IP、目的IP、源端口、目的端口、协议号和CT表项的状态存入所述CT表项。

在一些实施例中,所述步骤S02还包括:判断CT缓存节点是否为空,当CT缓存节点为空时,从批处理batch中获取PMD数据包进行流表处理流程;当CT缓存节点不为空时,遍历线程上的所有CT缓存节点,执行CT缓存节点的CT表项插入流程。

在一些实施例中,所述CT缓存节点的CT表项插入流程包括:

获取线程上的一个CT缓存节点;

获取全局锁,当全局锁获取成功时,将CT缓存节点中指针所对应的CT表项插入CT跟踪链接表;

删除该CT缓存节点;

依次遍历线程上的所有CT缓存节点,直到所有缓存节点中指针所对应的CT表项插入CT跟踪链接表,CT缓存节点被删除后为止。

在一些实施例中,所述CT缓存节点的CT表项插入流程还包括:当CT缓存节点的CT表项插入流程执行完后,继续进行流表处理流程。

在一些实施例中,方法还包括:在步骤S01获取PMD数据包后且在执行步骤S02步骤前,创建CT缓存节点。

在一些实施例中,所述CT缓存节点的数量为步骤S01中从DPDK数据路径上获取PMD数据包的最大值。

根据本公开的第二方面,提供了一种基于OVS-DPDK的数据包处理系统,包括:

数据包获取模块,用于从DPDK数据路径上获取PMD数据包;

批处理batch模块,用于缓存所述数据包获取模块获取的PMD数据包;

流表处理模块,用于获取批处理batch模块中的PMD数据包进行流表处理流程,在执行流表处理流程时,对批处理batch中的PMD数据包进行查表,当未在CT跟踪链接表查询到CT表项时,创建CT表项并根据全局锁获取情况执行不同操作:当获取全局锁成功时,将该CT表项插入CT跟踪链接表,当获取全局锁失败时,将该CT表项的指针填充入CT缓存节点中;当批处理batch中的数据包取完后,触发所述缓存插入模块执行CT缓存节点的CT表项插入流程;当CT缓存节点的CT表项插入流程执行完毕后,触发所述数据包获取模块对下一轮PMD数据包进行处理;

缓存插入模块,用于在执行CT缓存节点的CT表项插入流程时,当全局锁获取成功时,将CT缓存节点中指针所对应的CT表项插入CT跟踪链接表并删除该CT缓存节点。

附图说明

通过参考附图阅读下文的详细描述,本公开的实施例的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例而非限制性的方式示出本公开的若干实施例。

图1示出了本公开实施例的一种基于OVS-DPDK的数据包处理方法的流程图;

图2示出了本公开实施例的一种基于OVS-DPDK的数据包处理方法的示例流程图;

图3示出了采用本公开实施例的一种基于OVS-DPDK的数据包处理方法和现有方法进行数据包处理的效果比对图。

具体实施方式

下面将参照附图更详细地描述本公开的优选实施例。虽然附图中显示了本公开的优选实施例,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。

在本文中使用的术语“包括”及其变形表示开放性包括,即“包括但不限于”。除非特别申明,术语“或”表示“和/或”。术语“基于”表示“至少部分地基于”。术语“一个示例实施例”和“一个实施例”表示“至少一个示例实施例”。术语“另一实施例”表示“至少一个另外的实施例”。

现有处理流表的流程在建链获取锁失败时,需要等待锁释放去串行更新CT跟踪链接表。此过程随着PMD进程增多,CPS性能下降。即使硬件网卡带宽提高,但数据包处理速度无法匹配硬件的带宽处理速度。

为此,本公开实施例提出了一种基于OVS-DPDK的数据包处理方法,在OVS上增加一种CT创建会话跟踪的并行处理机制,在PMD数量不多,锁竞争不激烈时,使用原有串行处理逻辑;在PMD数量增多,锁竞争激烈时,在获取锁失败后,不再等待锁释放,处理其他逻辑,即将新增表项缓存入CT缓存节点。这样通过增加并行处理的时间,减少所有任务都在等锁释放而导致的CPU算力资源的浪费。

图1示出了本公开实施例一种基于OVS-DPDK的数据包处理方法的流程图。方法包括:

步骤S01,从DPDK数据路径上获取PMD数据包并将PMD数据包缓存入批处理batch中;

步骤S02,从批处理batch中获取PMD数据包进行流表处理流程;

在执行流表处理流程时,对批处理batch中的PMD数据包进行查表,当未在CT跟踪链接表查询到CT表项时,创建CT表项并根据全局锁获取情况执行不同操作:当获取全局锁成功时,将该CT表项插入CT跟踪链接表,当获取全局锁失败时,将该CT表项的指针填充入CT缓存节点中;

步骤S03,当批处理batch中的数据包取完后,执行CT缓存节点的CT表项插入流程;当CT缓存节点的CT表项插入流程执行完毕后,返回步骤S01对下一轮PMD数据包进行处理;

在执行CT缓存节点的CT表项插入流程时,当全局锁获取成功时,将CT缓存节点中指针所对应的CT表项插入CT跟踪链接表并删除该CT缓存节点。

本公开实施例的方法应用于网卡端,网卡获取DPDK数据路径上的PMD数据包执行上述处理流程。

在步骤S01中,每次获取数据包以批量形式获取,例如一批量获取32个数据包,将32个数据包缓存入批量处理batch中。

所述步骤S02对批处理batch中所有数据包依次执行流表处理流程,直到当前批次数据包取完结束,进入下一轮新批量数据包获取以及新数据包的流表处理流程。

本公开实施例在步骤S02进行时,先预查表判断当前数据包的CT表项是否存在于CT跟踪链接表内,若不存在,则创建CT表项并需获取全局锁执行CT表项插入CT跟踪链接表的操作。在此过程中,在全局锁获取成功时,根据现有流程执行CT表项插入CT跟踪链接表的操作,当全局锁获取失败时,则不同于现有流程,即不等待全局锁释放,而是将CT表项插入到CT缓存节点的方式,等数据包处理完毕后,执行CT缓存节点的CT表项插入流程。此过程中,能解决多进程下CPS降低的问题,通过增加并行处理的时间,降低了批量处理数据包时串行处理的时间,提高了CPS速率。

具体地,所述流表处理流程包括:

A1,判断批处理batch中的数据包是否取完,若取完,则结束,若未取完,执行后续流程;

A2,查询CT跟踪链接表,查询是否有CT表项在CT跟踪链接表中。

查询时,需要基于PMD数据包计算哈希值。获取数据包中的源IP、目的IP、源端口、目的端口、协议号,将上述信息构成元组;基于元组进行哈希计算,获得哈希值。将此哈希值作为索引值查询CT跟踪链接表,若能查询到时,则返回非空。当未能查询到时,则返回Null。

当查到CT表项时,更新该CT表项的状态。所述CT表项的状态包括timewait状态、establish状态。更新的内容包括更新CT的老化时间,以及状态迁移。更新状态后对数据包进行标注,例如当查询到CT表项时,根据CT表项的状态将数据包标注为“+est(链接已建立)”,未查询到CT表项时,数据包被标注为“+new(链接待建立)”。状态更新后,从批处理batch中获取下一个数据包执行流表处理流程。

当未能查到CT表项时,创建CT表项并基于该数据包填充所述CT表项。具体地,获取数据包中的源IP、目的IP、源端口、目的端口、协议号和CT表项的状态,将上述五元组和CT表项的状态填充入新建的CT表项中。

A3,获取全局锁,以进行链表插入操作。

当全局锁获取成功时,将该CT表项插入CT跟踪链接表。当插入后,从批处理batch中获取下一个数据包执行流表处理流程。

当全局锁获取失败时,将该CT表项的指针填充入CT缓存节点中。当填充后,从批处理batch中获取下一个数据包执行流表处理流程。

逐个从批处理batch中获取数据包执行上述流程A1~A3,直到取完数据包为止。

具体地,所述CT缓存节点的CT表项插入流程包括:

B1,获取线程上的一个CT缓存节点;

B2,获取全局锁,当全局锁获取成功时,将CT缓存节点中指针所对应的CT表项插入CT跟踪链接表;当全局锁获取失败时,则需要继续等待锁释放,直到获取锁为止。

B3,在B2的插入操作结束后,删除该CT缓存节点。

依次遍历线程上的所有CT缓存节点,直到所有缓存节点中指针所对应的CT表项插入CT跟踪链接表,CT缓存节点被删除后为止。

在数据包取完后执行上述步骤,可将对流表处理过程中获取锁失败的数据包基于CT缓存节点执行CT表项插入操作。

此外,本公开实施例的方法步骤S02还包括:判断CT缓存节点是否为空,当CT缓存节点为空时,从批处理batch中获取PMD数据包进行流表处理流程;当CT缓存节点不为空时,遍历线程上的所有CT缓存节点,执行CT缓存节点的CT表项插入流程。

在执行流表处理流程前还可进行缓存节点的判断流程,当CT缓存节点为非空时,可优先处理缓存节点中的资源。本公开实施例方法在执行流表处理流程前和后均执行CT缓存节点的CT表项插入流程。但目的不同,前者用于对缓存节点中的资源进行优先处理,后者对不进行锁释放等待的表项基于CT缓存节点执行CT表项插入操作。

所述CT缓存节点的CT表项插入流程还包括:当CT缓存节点的CT表项插入流程执行完后,进入流表处理流程。当CT表项插入流程结束后,若数据包未被取完,则继续流表处理流程;当CT表项插入流程结束后,若数据包被取完,则结束当前批量处理流程,返回步骤S01执行下一轮数据包获取、处理流程。

本公开实施例的方法还包括:在步骤S01获取PMD数据包后且在执行步骤S02步骤前,创建CT缓存节点。每个PMD开辟一块缓存,以供缓存节点使用。该缓存的大小能够存储CT缓存节点的数量为PMD一次从DPDK数据路径上获取PMD数据包的最大值。

图2示出了根据本公开实施例一种基于OVS-DPDK的数据包处理方法实现的示例流程图。其中,ct_cache为缓存节点。网卡预取数据包将其缓存入batch中。先判断ct_cache是否为空,为空时,执行右边的流表处理流程;不为空时,执行下方的CT缓存节点的CT表项插入流程。当batch中数据包取完后,处理ct_cache中缓存的数据,一次遍历处理。此过程按照CT缓存节点的CT表项插入流程执行,在此未详细展开。

本公开实施例还提供一种基于OVS-DPDK的数据包处理系统,包括数据包获取模块、批处理batch模块、流表处理模块、缓存插入模块。该系统基于本公开实施例的方法实现。

所述数据包获取模块,用于从DPDK数据路径上获取PMD数据包。

所述批处理batch模块,用于缓存所述数据包获取模块获取的PMD数据包。

所述流表处理模块,用于获取批处理batch模块中的PMD数据包进行流表处理流程。在执行流表处理流程时,对批处理batch中的PMD数据包进行查表,当在CT跟踪链接表查询到CT表项时,更新CT表项的状态。当未在CT跟踪链接表查询到CT表项时,创建CT表项并根据全局锁获取情况执行不同操作:当获取全局锁成功时,将该CT表项插入CT跟踪链接表,当获取全局锁失败时,将该CT表项的指针填充入CT缓存节点中;当批处理batch中的数据包取完后,触发所述缓存插入模块执行CT缓存节点的CT表项插入流程;当CT缓存节点的CT表项插入流程执行完毕后,触发所述数据包获取模块对下一轮PMD数据包进行处理。

所述缓存插入模块,用于在执行CT缓存节点的CT表项插入流程时,当全局锁获取成功时,将CT缓存节点中指针所对应的CT表项插入CT跟踪链接表并删除该CT缓存节点。所述缓存插入模块还在全局锁获取失败时,等待锁释放直到获取锁成功。

本公开实施例的系统还包括缓存判断模块,用于判断CT缓存节点是否为空,当CT缓存节点为空时,从批处理batch模块中获取PMD数据包,触发流表处理模块进行流表处理流程;当CT缓存节点不为空时,遍历线程上的所有CT缓存节点,触发缓存插入模块执行CT缓存节点的CT表项插入流程。

本公开实施例的系统还包括节点创建模块,用于在所述数据包获取模块获取PMD数据包后且在所述缓存判断模块执行动作前,创建CT缓存节点。每个PMD开辟一块缓存,以供缓存节点使用。该缓存的大小能够存储CT缓存节点的数量为PMD一次从DPDK数据路径上获取PMD数据包的最大值。

图3示出了采用现有方法以及本公开实施例方法实现的数据包处理效果比对图。左边为采用现有方法实现的处理效果。右边为采用本公开实施例方法实现的数据包处理效果。示例中每批量处理的数据包为96个,处理来自三个PMD的数据包(每个PMD有32个数据包)。处理完后的总的串行时间,右边所用时间低于左边所用时间。由于本公开实施例降低多PMD进程并行处理任务的串行处理时间,增大各PMD并行处理的力度,减少各PMD之间的竞争,大大提高了CPS性能,提高了OVS处理数据包的速度。当将本公开实施例的方法、系统应用于网卡场景下时,随着CPS增大,流表卸载速度也显著提高。

虽然在上面论述中包含了若干具体实现细节,但是这些不应当被解释为对本公开的范围的限制。在单独的实施例的上下文中描述的某些特征还可以组合地实现在单个实现中。相反地,在单个实现的上下文中描述的各种特征也可以单独地或以任何合适的子组合的方式实现在多个实现中。

尽管已经采用特定于方法逻辑动作的语言描述了本主题,但是应当理解所附权利要求书中所限定的主题未必局限于上面描述的特定特征或动作。相反,上面所描述的特定特征和动作仅仅是实现权利要求书的示例形式。

以上已经描述了本公开的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。

相关技术
  • 一种基于电流传感器的CAN数据包处理方法
  • 一种分布式系统以及基于该系统的数据处理方法
  • 一种基于大数据的热水器系统故障诊断处理方法及系统
  • 一种基于OVS改造的OVS-DPDK架构以及数据包处理方法
  • 一种基于OVS-DPDK数据包引流系统及其实现方法
技术分类

06120116069092