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

文档序号:34686672发布日期:2023-07-05 22:54阅读:71来源:国知局
一种基于OVS-DPDK的数据包处理方法、系统与流程

本公开的实施例涉及云计算,尤其涉及一种基于ovs- dpdk的数据包处理方法、系统。


背景技术:

1、云平台网络是依靠ovs(openvswitch,虚拟交换机)的内核空间实现对应用程序的数据包的处理。数据平面开发套件(dpdk,data plane development kit)为用于快速数据包处理的函数库与驱动集合。dpdk 结合ovs 后,性能变得高效且方便开发。

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

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

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


技术实现思路

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

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

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

4、步骤s01,从dpdk数据路径上获取pmd数据包并将pmd数据包缓存入批处理batch中;

5、步骤s02,从批处理batch中获取pmd数据包进行流表处理流程;

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

7、步骤s03,当批处理batch中的数据包取完后,执行ct缓存节点的ct表项插入流程;当ct缓存节点的ct表项插入流程执行完毕后,返回步骤s01对下一轮pmd数据包进行处理;

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

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

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

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

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

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

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

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

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

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

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

19、获取线程上的一个ct缓存节点;

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

21、删除该ct缓存节点;

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

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

24、在一些实施例中,方法还包括:在步骤s01获取pmd数据包后且在执行步骤s02步骤前,创建ct缓存节点。

25、在一些实施例中,所述ct缓存节点的数量为步骤s01中从dpdk数据路径上获取pmd数据包的最大值。

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

27、数据包获取模块,用于从dpdk数据路径上获取pmd数据包;

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

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

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

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