技术领域
[0001] 本
发明涉及
数据处理领域,更具体地,涉及一种numa架构下的报文转发方法、装置、存储介质及电子设备。
背景技术
[0002] 随着科技的发展,网卡的性能无法随着cpu迅猛的发展速度同步提高,这导致了导致明明转发系统的能
力很高,网卡
硬件有时却无法实现高流量的转发,成为整个转发系统的
瓶颈。
[0003] 目前,基于numa(Non-Uniform Memory Access,非统一内存
访问)技术的转发系统被广泛使用;numa技术把一台计算机分成多个
节点,每个节点内部包含多个CPU,各节点同时处理以获得更大的处理流量,个节点内部使用共享内存
控制器,节点之间通过互联模
块进行连接和交互;但CPU在多个numa间进行跨节点的访问时因需要通过互联模块进行连接和交互,其跨节点访问的内存速度要远慢于CPU访问其本地内存的速度,这使得整个转发系统执行不稳定;同时,在进行转发处理时,系统需先根据报文信息在
内核态匹配策略才能进一步进行转发处理,整个处理周期较长,使得系统的效率较低。
发明内容
[0004] 有鉴于此,本发明
实施例提供一种numa架构下的报文转发方法、装置、存储介质及电子设备,主要解决目前的转发系统存在的系统运行较慢、处理效率低等问题。
[0005] 根据本发明的一个方面,提供一种numa架构下的报文转发方法,所述方法包括:
[0006] 第一numa内的第一网卡接收报文;
[0007] 将所述报文发给与所述报文对应的第一numa内的第一CPU处理;
[0008] 所述第一CPU查询全局会话哈希表,判断所述报文的哈希键值对应的会话哈希表项是否存在;
[0009] 若所述报文的哈希键值对应的会话哈希表项存在,则查询所述会话哈希表项的值域中是否记录有所述第一numa的第一CPU;
[0010] 如果没有记录,则从所述会话哈希表项的值域中查找已经建立会话策略表项的第二numa的第二CPU,从所述第二CPU的会话策略表项地址拷贝会话策略信息,根据所述会话策略信息在所述第一CPU中创建会话策略表项;将所述第一numa的第一CPU记录在所述会话哈希表项的值域中;
[0011] 根据所述第一numa的第一CPU中已建立的会话策略表项对所述报文进行转发。
[0012] 进一步的,若所述报文的哈希键值对应的会话哈希表项不存在,则执行以下步骤:
[0013] 将所述报文送入内核态中匹配策略;
[0014] 所述内核态将匹配的会话策略信息返回给用户态;
[0015] 根据返回的会话策略信息在所述第一CPU上创建会话策略表项;将所述第一numa的第一CPU记录在所述会话哈希表项的值域;根据所述第一numa的第一CPU中已建立的会话策略表项对所述报文进行转发。
[0016] 进一步的,所述第一numa内的第一网卡接收报文,包括:
[0017] 多网卡绑定形成一个bond虚拟逻辑网口,所述bond虚拟逻辑网口包括所述第一numa的第一网卡,还包括至少一个不属于所述第一numa的第二网卡;所述报文通过所述bond虚拟逻辑网口被所述第一网卡接收。
[0018] 进一步的,所述会话哈希表项的键值包括所述报文的五元组;所述会话哈希表项的值域包括numa编号、CPU编号和各CPU建立的会话策略表项的存储地址。
[0019] 进一步的,所述在第一CPU中创建会话策略表项包括:
[0020] 在所述第一CPU的本地内存的内存池中
申请一块区域用于存储会话策略表项。
[0021] 进一步的,所述方法还包括:
[0022] 当所述第一CPU中已建立的会话策略表项的内容发生更改时,所述第一CPU获取所述会话策略表项对应的会话哈希表项的值域;判断是否在其他CPU上已经建立了会话策略表项的副本;
[0023] 如果是,所述第一CPU逐个
修改其他CPU上已经建立的会话策略表项副本的内容。
[0024] 进一步的,所述方法还包括:
[0025] 检测到系统的报文转发负载超过高负载
阈值,则进入负载均衡模式;
[0026] 将所述系统内的网卡配置过滤策略,将所有syn报文都交给第一空闲CPU处理,所述第一空闲CPU是系统内当前负载最小的CPU;
[0027] 所述第一空闲CPU判断收到的报文是否为所述syn报文,如果是所述syn报文,则将所述syn报文发送到第二空闲CPU处理,所述第二空闲CPU是系统内除了所述第一空闲CPU以外当前负载最小的CPU,并且在所述报文的会话策略表项中标记倒核处理,并记录所述第二空闲CPU的编号。
[0028] 进一步的,其中所述进入负载均衡模式之后还包括步骤:
[0029] 所述系统内所有CPU判断收到的报文是否为新建会话表的首个报文,如果是所述新建会话表的首个报文,则发送给第一空闲CPU处理,所述第一空闲CPU是系统内当前负载最小的CPU;
[0030] 所述第一空闲CPU判断收到的报文是否为新建会话表的首个报文,如果是所述新建会话表的首个报文,则将所述新建会话表的首个报文发送到第二空闲CPU处理,所述第二空闲CPU是系统内除了第一空闲CPU以外当前负载最小的CPU,并且在所述报文的会话策略表项中标记倒核处理,并记录所述第二空闲CPU的编号。
[0031] 进一步的,所述方法还包括:
[0032] 如果收到的不是所述syn报文或所述新建会话表的首个报文,则判断所述报文的会话策略表项中是否被标记为倒核处理,如果是,则根据记录的编号将所述报文发送到编号对应的CPU进行处理。
[0033] 进一步的,所述方法还包括:
[0034] 当检测到所述系统的报文转发负载低于低负载阈值,则退出负载均衡模式;
[0035] 取消将所有syn报文都交给所述第一CPU处理的网卡配置过滤策略;
[0036] 取消对所述syn报文或者新建会话表的首个报文的判断;
[0037] 取消所述会话策略表项中的倒核处理标记。
[0038] 根据本发明的另一方面,还提供一种numa架构下的报文转发装置,所述装置包括:
[0039] 报文接收模块,用于第一numa内的第一网卡接收报文;
[0040] 第一CPU,所述第一numa包含所述第一CPU,所述第一CPU用于处理从所述报文接收模块输出的与所述第一CPU对应的报文;
[0041] 第一查询判断模块,用于通过报文转发模块查询全局会话哈希表,并判断所述第一CPU处理的报文的哈希键值对应的会话哈希表项是否存在;
[0042] 若所述第一查询判断模块判断所述报文的哈希键值对应的会话哈希表项已经存在,则启动第二查询判断模块;
[0043] 所述第二查询判断模块,用于查询所述会话哈希表项的值域中是否记录有所述第一numa的第一CPU;
[0044] 如已有记录,将启动所述报文转发模块;
[0045] 如没有记录,则启动会话策略表补充模块;
[0046] 所述会话策略表项补充模块,用于从所述会话哈希表项的值域中查找已经建立会话策略表项的第二numa的第二CPU,从所述第二CPU的会话策略表项地址拷贝会话策略信息,根据所述会话策略信息在所述第一CPU中创建会话策略表项;将所述第一numa的第一CPU记录在所述会话哈希表项的值域中;
[0047] 所述报文转发模块,所述报文转发模块用于根据所述第一numa的第一CPU中已建立的会话策略表项对所述报文进行转发。
[0048] 进一步的,所述装置还包括匹配策略模块;
[0049] 所述第一查询判断模块判断所述报文的哈希键值对应的会话哈希表项不存在,则启动匹配策略模块;
[0050] 所述匹配策略模块用于将所述报文送入内核态中匹配策略;并从所述内核态中将匹配的会话策略信息取出并返回给用户态;
[0051] 所述会话策略表项补充模块根据所述匹配策略模块返回的会话策略信息在所述第一CPU上创建会话策略表项,并将所述第一numa的第一CPU记录在所述会话哈希表项的值域。
[0052] 进一步的,所述报文接收模块包括多网卡绑定形成的一个bond虚拟逻辑网口,所述bond虚拟逻辑网口包括所述第一numa的第一网卡,还包括至少一个不属于所述第一numa的第二网卡;所述报文通过所述bond虚拟逻辑网口被所述第一网卡接收。
[0053] 进一步的,所述会话哈希表项的键值包括所述报文的五元组;所述会话哈希表项的值域包括numa编号、CPU编号和各CPU建立的会话策略表项的存储地址。
[0054] 进一步的,所述会话策略表项补充模块根据所述会话策略信息在所述第一CPU中创建会话策略表项包括,在所述第一CPU的本地内存的内存池中申请一块区域用于存储所述会话策略表项。
[0055] 进一步的,所述装置还包括副本修改模块;
[0056] 若所述第一CPU中已经建立的会话测量表项的内容发生了改变,则启动副本修改模块;
[0057] 所述副本修改模块用于获取所述第一CPU的会话策略表项对应的会话哈希表项的值域;判断是否在其他CPU上已经建立了会话策略表项的副本;如果是,所述副本修改模块逐个修改其他CPU上已经建立的所述会话策略表项副本的内容。
[0058] 进一步的,所述装置还包括负载均衡模块;
[0059] 当检测到系统的报文转发负载超过高负载阈值时,启动所述负载均衡模块;
[0060] 所述负载均衡模块用于将所述系统内的网卡配置过滤策略,所述过滤策略指将所有syn报文都交给第一空闲CPU处理,所述第一空闲CPU是系统内当前负载最小的CPU;
[0061] 所述第一空闲CPU判断收到的报文是否为所述syn报文,如果是所述syn报文,则将所述syn报文发送到第二空闲CPU处理,所述第二空闲CPU是系统内除了第一空闲CPU以外当前负载最小的CPU,并且在所述报文的会话策略表项中标记倒核处理,并记录所述第二空闲CPU的编号。
[0062] 进一步的,所述系统内所有CPU判断收到的报文是否为新建会话表的首个报文,如果是所述新建会话表的首个报文,则发送给第一空闲CPU处理,所述第一空闲CPU是系统内当前负载最小的CPU;
[0063] 所述第一空闲CPU判断收到的报文是否为新建会话表的首个报文,如果是所述新建会话表的首个报文,则将所述新建会话表的首个报文发送到第二空闲CPU处理,所述第二空闲CPU是系统内除了第一空闲CPU以外当前负载最小的CPU,并且在所述报文的会话策略表项中标记倒核处理,并记录所述第二空闲CPU的编号。
[0064] 进一步的,如果所述第一空闲CPU收到的不是所述syn报文或新建会话表的首个报文,则判断所述报文的会话策略表项中是否被标记为倒核处理,如果是,则根据记录的编号将所述报文发送到编号对应的CPU进行处理。
[0065] 进一步的,当检测到所述系统的报文转发负载低于低负载阈值,关闭负载均衡模块,所述关闭负载均衡模块即取消将所有syn报文都交给第一CPU处理的网卡配置过滤策略、取消对所述syn报文或者新建会话表的首个报文的判断并取消所述会话策略表项中的倒核处理标记。
[0066] 根据本发明的另一方面,还提供一种计算机可读存储介质,其上存储有
计算机程序,该程序被处理器执行时实现如上述任一方法中的步骤。
[0067] 根据本发明的另一方面,还提供一种电子设备,包括:上述计算机可读存储介质;以及一个或多个处理器,用于执行所述计算机可读存储介质中的程序。
[0068] 本发明的有益效果为:本发明的技术方案,给出了一种numa架构下的报文转发方法及装置,所述方法及装置通过对转发系统内部转发流程的设计,使接收的同一报文在同一numa的同一CPU中进行处理,避免了倒核处理带来的速度障碍,极大的提高了对报文转发处理的运行速度;所述方法及装置优先通过拷贝已有会话策略信息的方式建立所需会话策略表项,进一步提高了报文处理转发效率;所述方法及装置通过合理的策略设计,解决了效率提升,性能优化等问题,为网络安全的后续发展做出了强有力的保障。
附图说明
[0069] 通过参考下面的附图,可以更为完整地理解本发明的示例性实施方式:
[0070] 图1A为本发明具体实施方式的一种numa架构下的报文转发方法的流程示意图;
[0071] 图1B为本发明另一实施方式的一种numa架构下的报文转发方法的流程示意图;
[0072] 图1C为本发明又一实施方式的一种numa架构下的报文转发方法的流程示意图;
[0073] 图1D为本发明再一实施方式的一种numa架构下的报文转发方法的流程示意图;
[0074] 图2为本发明具体实施方式的对系统报文转发进行负载均衡的流程示意图;
[0075] 图3为本发明具体实施方式的一种numa架构下的报文转发系统的结构示意图。
具体实施方式
[0076] 现在参考附图介绍本发明的示例性实施方式,然而,本发明可以用许多不同的形式来实施,并且不局限于此处描述的实施例,提供这些实施例是为了详尽地且完全地公开本发明,并且向所属技术领域的技术人员充分传达本发明的范围。对于表示在附图中的示例性实施方式中的术语并不是对本发明的限定。在附图中,相同的单元/元件使用相同的附图标记。
[0077] 除非另有说明,此处使用的术语(包括科技术语)对所属技术领域的技术人员具有通常的理解含义。另外,可以理解的是,以通常使用的词典限定的术语,应当被理解为与其相关领域的语境具有一致的含义,而不应该被理解为理想化的或过于正式的意义。
[0078] 图1A为本发明具体实施方式的一种numa架构下的报文转发方法的
流程图;如图1A所示,所述方法包括:
[0079] 步骤110,第一numa内的第一网卡接收报文。
[0080] 具体的,所述方法运行的系统为多核系统,所述系统通过多网卡绑定形成一个bond虚拟逻辑网口,该bond虚拟逻辑网口包括第一numa的第一网卡,还包括至少一个不属于第一numa的第二网卡;报文通过该bond虚拟逻辑网口被第一网卡接收。
[0081] 网卡bond虚拟逻辑网口是通过多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,在生产场景中是一种常用的技术。主要实现带宽扩容的,比如硬件网卡最多10G带宽,两个一起用,带宽就扩容到了20G带宽。
[0082] 步骤120,将所述报文发给与所述报文对应的第一numa内的第一CPU处理。
[0083] 具体的,通过报文的五元组信息确定与报文对应的所述第一numa内的第一CPU;所述第一网卡基于rss
算法对接收的报文进行队列哈希,能保证五元组相同的报文一定被同一网卡队列ID收到,而同一网卡将同一队列ID的报文发给同一CPU处理,从而保证同一网卡收到的五元组相同的报文一定会被同一numa内的同一CPU收到。
[0084] 进一步的,五元组相同的多个报文认为是同一会话的多个报文,所述五元组相同的多个报文对应的同一个会话策略表项;所述同一会话的多个报文,均由所述第一网卡接收;即同一会话的多个报文,其进入系统的网卡入口是唯一的。
[0085] 传统的基于numa的转发系统中,没有对同一会话的多个报文进行特殊的策略处理,使得同一会话的多个报文可能被多个numa的网卡收到,而由于对于同一会话的会话策略表项是唯一的且仅存储在一个CPU中,故当同一会话的多个报文被多个numa的网卡接收到时,须进行报文的倒核处理,将报文交给存储了对应会话策略表项的CPU进行处理,所述倒核处理的过程使得会话的处理效率降低;而本发明通过策略优化,基于rss算法对接收的报文进行队列哈希,使同一会话的多个报文,其进入系统的网卡入口是唯一的;而且该网卡所对应的CPU即为存储所述会话的会话策略表项的CPU,使得CPU接到报文后仅需访问本地的内存调取对应的会话策略表项,相较于传统的转发系统运行速度有了极大的提升。
[0086] 步骤130,第一CPU查询全局会话哈希表,判断所述报文的哈希键值(key)对应的会话哈希表项是否存在。
[0087] 步骤140,若所述报文的哈希键值对应的会话哈希表项已经存在,则查询所述会话哈希表项的值域(value)中是否记录有第一numa的第一CPU。
[0088] 所述全局会话哈希表位于对应的numa中,具体处于numa的共享内存中,各CPU均可访问调用;
[0089] 进一步的,全局会话哈希表项的键值包括报文的五元组,即为源IP、目标IP、源端口、目标端口和协议;全局会话哈希表项的值域包括numa编号、CPU编号和各CPU建立的会话策略表项的存储地址。
[0090] 如果查询会话哈希表项的值域中记录有第一numa的第一CPU,则直接跳转到步骤150;
[0091] 如查询会话哈希表项的值域中没有记录有第一numa的第一CPU;则从所述会话哈希表项的值域中找到一个已经建立会话策略表项的第二numa的第二CPU,从所述第二CPU的会话策略表项地址拷贝会话策略信息,根据所述会话策略信息在第一CPU中创建会话策略表项;将第一numa的第一CPU记录在所述会话哈希表项的值域中;本实施例中,即便查询会话哈希表项的值域中没有记录有第一numa的第一CPU;也无需访问内核态通过复杂的逻辑创建新的会话策略信息;因前一步(步骤130)中已经确认所述报文的哈希键值对应的会话哈希表项已经存在,说明报文对应的会话策略信息也存在,故通过查找存储该会话策略信息的另一CPU(所述第二CPU)并进行复制和本地创建即可获得该对应的会话策略表项。
[0092] 进一步的,所述在第一CPU中创建会话策略表项包括,在第一CPU的本地内存的内存池中申请一块区域用于存储会话策略表项。以使用的会话策略表项为Session会话表项为例;所述Session会话表项的内存空间为每核机制,即仅存在于同一个CPU上;在初始化过程中,每个CPU使用mempool在numa中申请各自内存的内存池,当需要新建会话策略表项时,使用malloc函数在mempool中获取对应字节长度的内存块;而当会话策略表项完成其任务而需要进行释放时,将会话策略表项占有的内存块释放回numa中的内存池里;这样的做法减少了因动态内容申请带来的巨大开销。
[0093] 步骤150,根据第一numa的第一CPU中已建立的会话策略表项对所述报文进行转发。
[0094] 进一步的,如图1B所示,所述步骤140还包括:
[0095] 如果发现所述报文的哈希键值对应的会话哈希表项不存在,则执行以下步骤;
[0096] 步骤141,将报文送入内核态中匹配策略;
[0097] 步骤142,内核态将匹配的会话策略信息返回用户态;
[0098] 步骤143,根据返回的会话策略信息在第一CPU上创建会话策略表项;将第一numa的第一CPU记录在所述会话哈希表项的值域;转到步骤150。
[0099] 所述转发系统的运行时态分为两种,一种是内核态,所述内核态负责实现功能复杂的逻辑,匹配策略的慢速模块运行在这个时态中;另一种是用户态,所述用户态负责接收网卡报文,并实现快速转发逻辑;所述用户态可通过DPDK开发平台快速处理报文,对报文进行快速处理的快速模块运行在用户态。
[0100] 以本发明的实施方式为例,接收报文后,在用户态中判断报文的哈希键值(key)对应的会话哈希表项是否存在;如存在,则无需访问内核态,所述报文在用户态利用原有的会话策略表项即可完成快速转发;而如果不存在,再访问内核态进行策略匹配生成对应的会话策略表项。这样通过先判断报文的哈希键值(key)对应的会话哈希表项是否存在以确定是否需进行内核态的策略匹配,与传统的每次进行转发时均进行策略匹配相比,极大的提高了处理效率。
[0101] 进一步的,如图1C所示,所述步骤150之后还包括:
[0102] 160,当所述第一CPU中已建立的会话策略表项的内容发生更改时;
[0103] 170,所述第一CPU获取所述会话策略表项对应的会话哈希表项的值域;判断是否在其他CPU上已经建立了会话策略表项的副本;
[0104] 180,如果是,所述第一CPU逐个修改其他CPU上已经建立的会话策略表项副本的内容。
[0105] 进一步的,如步骤140所述“从所述会话哈希表项的值域中找到一个已经建立会话策略表项的第二numa的第二CPU,从所述第二CPU的会话策略表项地址拷贝会话策略信息,根据所述会话策略信息在第一CPU中创建会话策略表项”不同的CPU间可能存在相同会话策略表项的副本;即通过所述拷贝会话策略信息,第二CPU中包含了第一CPU的会话策略表项副本;所述会话策略表项的多个副本间的内容是同步的,所述同步通过同一策略CPU进行;即如果某一CPU修改了其CPU内的会话策略表项,则该CPU需将其他存有该会话策略表项的CPU中的对应会话策略表项进行同步修改,此过程所述CPU获取所述会话策略表项对应的会话哈希表项的值域;判断是否在其他CPU上已经建立了会话策略表项的副本;如图1C所示,第一CPU修改了其已建立的会话策略表项的内容,则需要逐个修改其他CPU上已经建立的对应的会话策略表项副本的内容。
[0106] 进一步的,如图1D所示,步骤150之后还包括:
[0107] 步骤190,当第一CPU检测到已建立的会话策略表项超时之后,删除所述会话策略表项,并从所述会话策略表项对应的会话哈希表项的值域中删除对应的numa编号、CPU编号和会话策略表项的存储地址。
[0108] 进一步的,所述每个会话策略表项包括超时时间,所述会话策略表项对应的CPU的
定时器对会话策略表项未被调用的时间进行计时,如超过预设的超时时间,所述CPU会对超时的会话策略表项进行自主删除;
[0109] 进一步的,对于存在副本的会话策略表项的删除,各副本间的删除无需同步,每个副本有其各自独有的超时时间,其对应的CPU会对超时的会话策略表项副本进行删除而无需处理其他副本;因可能存在报文发送到第一numa中,而后发送到第二numa中的情况,此时,第一numa中的会话策略表项可能因为超时被删掉,而第二numa中与之相同的会话策略表项副本仍在继续使用和工作。
[0110] 进一步的,图2为本发明具体实施方式的对系统报文转发进行负载均衡的流程图;如图2所示:
[0111] 步骤210,检测到系统的报文转发负载超过高负载阈值,则进入负载均衡模式。
[0112] 以使用的会话策略表项为Session会话表项为例,当个别CPU的处理能力达到预设高负载阈值时(如90%)或Session会话表项个数达到预设的高负载阈值(如90%)以上,所述系统进入负载均衡模式;
[0113] 步骤220,将系统内的网卡配置过滤策略,将所有syn报文都交给第一空闲CPU处理,所述第一空闲CPU是系统内当前负载最小的CPU。
[0114] 所述通过对网卡配置过滤策略,在硬件上进行规则添加,减轻了使用
软件进行策略布置的处理量;软件即可只处理非syn报文的负载均衡策略,提升了软硬件利用的合理性。
[0115] 步骤230,第一空闲CPU判断收到的报文是否为syn报文,如果是syn报文,则将所述syn报文发送到第二空闲CPU处理,所述第二空闲CPU是系统内除了第一空闲CPU以外当前负载最小的CPU,并且在所述报文的会话策略表项中标记倒核处理,并记录第二空闲CPU的编号。
[0116] 所述第二空闲CPU并非一个固定的CPU,第二空闲CPU为第一空闲CPU待转发报文时判断,除了第一空闲CPU以外当前负载最小的CPU;
[0117] 所述对报文的会话策略表项中标记倒核处理,以确认该报文仍由第二空闲CPU处理,当所述报文的同一会话内的其他报文再被网卡接收时,仍然会倒换到记录的编号对应的所述CPU中处理。
[0118] 进一步的,步骤220之后还包括步骤:
[0119] 221,系统内所有CPU判断收到的报文是否为新建会话表的首个报文,如果是新建会话表的首个报文,则发送给第一空闲CPU处理,所述第一空闲CPU是系统内当前负载最小的CPU。
[0120] 如上所述,通过网卡设置过滤策略拦截了syn报文,剩余的报文需由各CPU判断是否为新建会话的首个报文;因为新建会话表的报文除了syn报文,可能还有非syn报文的其他首个报文,syn可以在网卡设置硬件过滤规则,充分利用硬件处理能力进行拦截转发,其他的首个报文则只能依赖于各CPU自行处理。
[0121] 222,第一空闲CPU判断收到的报文是否为新建会话表的首个报文,如果是新建会话表的首个报文,则将所述新建会话表的首个报文发送到第二空闲CPU处理,所述第二空闲CPU是系统内除了第一空闲CPU以外当前负载最小的CPU,并且在所述报文的会话策略表项中标记倒核处理,并记录第二空闲CPU的编号。
[0122] 所述第二空闲CPU并非一个固定的CPU,第二空闲CPU为第一空闲CPU待转发报文时判断,除了第一空闲CPU以外当前负载最小的CPU。
[0123] 进一步的,其中步骤230还包括步骤:
[0124] 231,如果收到的不是syn报文或新建会话表的首个报文,则判断所述报文的会话策略表项中是否被标记为倒核处理,如果是,则根据记录的编号将所述报文发送到编号对应的CPU进行处理。
[0125] 所述第一空闲CPU接收到非syn报文或新建会话表的首个报文时,对会话策略表项中是否被标记为倒核处理做进一步判断,如果有倒核标记,则将该报文送回倒核处理标记对应的CPU进行处理;因该对应的CPU的本地存储着与所述报文对应的会话策略表项,可以以最快的速度对进行报文处理;而如果没有倒核标记,则由第一空闲CPU自己进行处理。
[0126] 进一步的,其中步骤230之后还包括步骤240,当检测到系统的报文转发负载低于低负载阈值,则退出负载均衡模式。
[0127] 因相较于正常模式,负载均衡模式对整个系统的负担更大,当无需进行负载均衡时,退出负载均衡模块,恢复正常模式。所述退出负载均衡模式时,进行如下动作:
[0128] 241,取消将所有syn报文都交给第一空闲CPU处理的网卡配置过滤策略;
[0129] 242,取消对syn报文或者新建会话表的首个报文的判断;
[0130] 243,取消会话策略表项中的倒核处理标记。
[0131] 当退出负载均衡模式时,对网卡配置过滤策略要取消,此外,对于各CPU对新建会话表的首个报文的判断,以及第一空闲CPU对于syn报文的判断都取消,不再对上述报文特殊处理,对于为了均衡而设定的倒核处理标记,以及包含的倒核CPU编号一并取消。此时,就不再为了均衡而强制进行任何的报文转发和倒核处理了。
[0132] 本发明的一种numa架构下的报文转发方法,通过对转发系统内部转发流程的设计,使接收的同一报文在同一numa的同一CPU中进行处理,避免了倒核处理带来的速度障碍,极大的提高了对报文转发处理的运行速度;所述方法优先使用用户态的快速模块进行快速处理,并不是所有的报文都需要内核态进行复杂的策略匹配,而是优先使用用户态中原有的会话策略表项进行处理,极大的提高了报文处理转发的效率;该方法同时考虑了负载均衡的转发处理模式,充分利用numa内进行负载均衡的优势,同时通过设计避免numa间的访问,避免了numa技术给提升速度带来的劣势,以实现最佳的转发性能;所述方法通过软硬件结合和合理的策略设计,解决了负载均衡、效率提升,性能优化等问题。
[0133] 图3为本发明具体实施方式的一种numa架构下的报文转发装置的结构图,如图3所示,所述装置包括:
[0134] 报文接收模块310,用于第一numa内的第一网卡接收报文。
[0135] 进一步的,所述报文接收模块310包括多网卡绑定形成的一个bond虚拟逻辑网口,所述bond虚拟逻辑网口包括第一numa的第一网卡,还包括至少一个不属于第一numa的第二网卡;所述报文通过所述bond虚拟逻辑网口被第一网卡接收。
[0136] 第一CPU320,所述第一numa包含所述第一CPU320,所述第一CPU320用于处理从报文接收模块310输出的与所述第一CPU320五元组对应的报文。
[0137] 进一步的,所述第一网卡基于rss算法对接收的报文进行队列哈希,能保证五元组相同的报文一定被同一网卡队列ID收到,从而保证同一网卡收到的五元组相同的报文一定会被同一numa内的同一CPU收到。
[0138] 第一查询判断模块330,用于通过报文转发模块查询全局会话哈希表,并判断所述第一CPU320处理的报文的哈希键值对应的会话哈希表项是否存储。
[0139] 如所述第一查询判断模块330判断所述报文的哈希键值对应的会话哈希表项已经存在,则启动第二查询判断模块340。
[0140] 进一步的,所述全局会话哈希表的会话哈希表项的键值包括报文的五元组,所述五元组为源IP、目标IP、源端口、目标端口和协议;所述全局会话哈希表的会话哈希表项的值域包括numa编号、CPU编号和各CPU建立的会话策略表项的存储地址。
[0141] 第二查询判断模块340,用于查询查询会话哈希表项的值域中是否记录有第一numa的第一CPU320。
[0142] 如已有记录,将启动报文转发模块360;
[0143] 如没有记录,启动会话策略表补充模块350。
[0144] 会话策略表项补充模块350,用于从所述会话哈希表项的值域中找到一个已经建立会话策略表项的第二numa的第二CPU,从所述第二CPU的会话策略表项地址拷贝会话策略信息,根据所述会话策略信息在第一CPU320中创建会话策略表项;将第一numa的第一CPU320记录在所述会话哈希表项的值域中。
[0145] 进一步的,所述会话策略表项补充模块350根据所述会话策略信息在第一CPU320中创建会话策略表项包括,在第一CPU320的本地内存的内存池中申请一块区域用于存储会话策略表项。
[0146] 报文转发模块360,用于根据第一numa的第一CPU320中已建立的会话策略表项对所述报文进行转发。
[0147] 进一步的,所述装置还包括匹配策略模块;
[0148] 所述第一查询判断模块330判断所述报文的哈希键值对应的会话哈希表项不存在,则启动匹配策略模块;
[0149] 所述匹配策略模块用于将报文送入内核态的慢速模块中匹配策略;并从慢速模块中将匹配的会话策略信息取出并返回给用户态的快速模块;
[0150] 所述会话策略表项补充模块350根据匹配策略模块返回的会话策略信息在第一CPU上创建会话策略表项,并将第一numa的第一CPU记录在所述会话哈希表项的值域。
[0151] 进一步的,所述装置还包括副本修改模块;
[0152] 如第一CPU中已经建立的会话测量表项的内容发生了改变,则启动副本修改模块;
[0153] 所述副本修改模块用于获取所述第一CPU的会话策略表项对应的会话哈希表项的值域;判断是否在其他CPU上已经建立了会话策略表项的副本;如果是,所述副本修改模块逐个修改其他CPU上已经建立的会话策略表项副本的内容。
[0154] 进一步的,所述装置还包括会话策略表项删除模块;
[0155] 当检测到第一CPU已建立的会话策略表项超时时,启动会话策略表项删除模块;所述会话策略表项删除模块用于删除超时的会话策略表项,并从所述会话策略表项对应的会话哈希表项的值域中删除对应的numa编号、CPU编号和会话策略表项的存储地址。
[0156] 进一步的,所述装置还包括负载均衡模块;
[0157] 当检测到系统的报文转发负载超过高负载阈值时,启动负载均衡模块;
[0158] 所述负载均衡模块用于将系统内的网卡配置过滤策略,所述过滤策略指将所有syn报文都交给第一空闲CPU处理,所述第一空闲CPU是系统内当前负载最小的CPU;
[0159] 所述第一空闲CPU判断收到的报文是否为syn报文,如果是syn报文,则将所述syn报文发送到第二空闲CPU处理,所述第二空闲CPU是系统内除了第一空闲CPU以外当前负载最小的CPU,并且在所述报文的会话策略表项中标记倒核处理,并记录第二空闲CPU的编号。
[0160] 进一步的,系统内所有CPU判断收到的报文是否为新建会话表的首个报文,如果是新建会话表的首个报文,则发送给第一空闲CPU处理,所述第一空闲CPU是系统内当前负载最小的CPU;
[0161] 第一空闲CPU判断收到的报文是否为新建会话表的首个报文,如果是新建会话表的首个报文,则将所述新建会话表的首个报文发送到第二空闲CPU处理,所述第二空闲CPU是系统内除了第一空闲CPU以外当前负载最小的CPU,并且在所述报文的会话策略表项中标记倒核处理,并记录第二空闲CPU的编号。
[0162] 进一步的,如果第一空闲CPU收到的不是syn报文或新建会话表的首个报文,则判断所述报文的会话策略表项中是否被标记为倒核处理,如果是,则根据记录的编号将所述报文发送到编号对应的CPU进行处理。
[0163] 进一步的,当检测到系统的报文转发负载低于低负载阈值,关闭负载均衡模块,所述关闭负载均衡模块即取消将所有syn报文都交给第一CPU处理的网卡配置过滤策略、取消对syn报文或者新建会话表的首个报文的判断并取消会话策略表项中的倒核处理标记。
[0164] 根据本发明的另一方面,还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如上述任一方法中的步骤。
[0165] 根据本发明的另一方面,还提供一种电子设备,包括:上述计算机可读存储介质;以及一个或多个处理器,用于执行所述计算机可读存储介质中的程序。
[0166] 在此处所提供的
说明书中,说明了大量具体细节。然而,能够理解,本公开的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
[0167] 本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的
权利要求、
摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。本说明书中涉及到的步骤编号仅用于区别各步骤,而并不用于限制各步骤之间的时间或逻辑的关系,除非文中有明确的限定,否则各个步骤之间的关系包括各种可能的情况。
[0168] 此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本公开的范围之内并且形成不同的实施例。例如,在权利要求书中所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
[0169] 本公开的各个部件实施例可以以
硬件实现,或者以在一个或者多个处理器上运行的
软件模块实现,或者以它们的组合实现。本公开还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者系统程序(例如,计算机程序和计算机程序产品)。这样的实现本公开的程序可以存储在计算机可读介质上,或者可以具有一个或者多个
信号的形式。这样的信号可以从因特网
网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
[0170] 应该注意的是上述实施例对本公开进行说明而不是对本公开进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本公开可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干系统的单元权利要求中,这些系统中的若干个可以是通过同一个硬件项来具体体现。
[0171] 以上所述仅是本公开的具体实施方式,应当指出的是,对于本领域的普通技术人员来说,在不脱离本公开精神的前提下,可以作出若干改进、修改、和
变形,这些改进、修改、和变形都应视为落在本申请的保护范围内。