一种高速并行的无锁流表路由查找方法

文档序号:6383388阅读:244来源:国知局

专利名称::一种高速并行的无锁流表路由查找方法
技术领域
:本发明涉及路由查找算法,具体说是一种高速并行的无锁流表路由查找方法,尤指多核处理器高速并行的无锁流表路由查找方法。
背景技术
:随着网络带宽的急剧增加,使得网络的链路速率发展到lOGb/s,甚至更高,应用高性能的多核处理器硬件平台和高速的路由查找算法,设计出满足网络性能要求的路由器显得非常必要。传统的单核处理器的处理能力受到主频和功耗等因素的制约,在性能上难以满足日益增长的网络数据处理任务要求。高性能的多核处理器在数据处理过程中能够实现并行处理,网络延时小,数据吞吐量大,在当前的高端路由器中有着一定的应用范围。但是,传统的基于基数排序树(RadixTrie)、多分支Trie树(MultibitTrie,多分支查找树)、分段地址等路由查找算法多应用在串行数据流处理的单核处理器中,这些算法在多核处理器中,由于多核并行执行数据处理导致的路由资源竞争,易造成数据瓶颈,使得多核处理器的并行处理能力不能完全得以发挥,造成极大的资源浪费。路由查找的专用芯片TCAM(TernaryContentAddressableMemory,三态内容寻址存储器),由于其价格高昂,不适合在一些对成本敏感的路由器设计中广泛采用,而SDRAM(同步动态随机存储器)价格低廉,因此开展基于SDRAM的快速路由查找算法的应用研究显得异常重要。高端路由器进行路由转发时其转发条目可达到百万之上,在众多的路由条目中匹配一条路由所消耗的时间主要取决于查找算法的性能。为了提高路由性能,在路由表设计过程中,基于原有路由表上再增加一张表,形成两层路由表的结构设计。第一层表是总表,保存着所有的路由条目和信息;新增的第二层表为流表,保存一定时间段下的常用路由的路由表项信息(Entry)。每次数据包转发过程中,先去流表中进行查找,如果在流表中查找到匹配的路由表项信息,则数据包直接根据匹配的路由表项信息中的路由信息输出到出端口;如果查询不成功,则再进入总表中查找,在总表中查找到匹配的路由条目和信息后,将数据转发出去的同时并将该匹配的路由条目和信息添加到流表中,方便同一数据流的下一个数据包在流表中查找。之所以采用流表的查找策略可以提高路由查找的效率,是因为流表中维护的路由条目远远小于总表,在流表中进行一次路由匹配与在总表中去匹配所需要的平均时间要小,并且,一般在路由表设计的时候,将流表置于处理器内部的Cache(高速缓冲存储器)中,使得基于流表的路由查找方式在性能上有更大的提升。上述基于流表的路由查找策略在单核串行处理方式上的确可以优化性能,提高路由查找的性能。为了提高多核处理器查找的性能,同样引入了流表的设计思想,但是由于多核处理器并行处理的特点,表项资源的共享和互斥问题给流表的设计提出了新的挑战。一般常用的方法是在系统的Cache上创建一张多个核(处理器的核)共享的流表,但是多个核共同使用一张表必定造成资源的竞争,为了保证数据处理的安全性通常的解决办法就是采用资源锁,这在并行处理上容易造成数据处理瓶颈。同时每个核上处理的数据各不一样,仓Ij建的表项形成的流表表项数目较多,对于基于流表的遍历查找效率有所打折。另一种方法是在系统的Cache上创建与核数相对应数目的流表,每个核维护一张流表,这种方式对于多核系统中同一个流的数据包送往同一个核处理的核间调度机制来说不会存在流表的竞争关系。因为相同的数据流在同一个核上进行处理,建立的流表的表项不会被其它核所用,此时这个流表只属于这个核所私有,数据包路由查找在该核上串行实现,多核间对于流表不会存在竞争的关系,如图I所示的核I上处理数据流“A”。但流分类一般采用Hash算法(哈希算法),因Hash冲突的存在,导致Hash值相同但对应转发表不在流表中的数据流会进入同一个核进行处理,由于查表失败而只能进入总表中进行第二次查找,从而对系统性能产生一定影响。对于多核数据流无序调度机制来讲,也会产生问题,同一个数据流的数据包可能会发送到几个不同的核上去处理,在处理的过程中它们共享一张流表,因此存在相互竞争的关系。如图I所示核2、核3和核4处理数据流“O”时所示,三个核处理的数据包都需要用到同一张流表,此时就会发生假如一个核上的数据包正在查询该数据包流对应的流表的某一个表项时,另一个核正对该表项进行删除,此时就会造成冲突,出现数据丢包等错误现象。常用的解决办法就是对流表增加资源锁,在无序的并行处理机制中,同一时间只允许一个核对其某一流表进行操作。采用流表设计的路由查找策略可以提升路由查找的性能,当前在单核处理中存在广泛的应用,但是在多核处理器执行并行查找的特殊环境下,对流表资源存在竞争的关系,上述方法依旧会产生路由过程中的数据处理瓶颈,对多核的并行处理效率的较大影响,并造成数据处理延时加大。
发明内容针对现有技术中存在的缺陷,本发明的目的在于提供一种高速并行的无锁流表路由查找方法,解决多核处理器并行执行过程中,现有流表设计方法造成的数据处理瓶颈问题,实现了多核并行执行过程中数据转发的安全性和快速性,提高大容量系统路由查找速度和并行路由查找的性能。为达到以上目的,本发明采取的技术方案是一种高速并行的无锁流表路由查找方法,其特征在于,包括以下步骤步骤I:控制平面定期分别对初始化创建的N个流表g_flow_table[i]中的表项进行遍历,0=〈i〈N,N值等于多核处理器的核数且N大于等于2,每遍历一个表项的同时对表项的创建时间进行检测;步骤2:控制平面执行表项时间检测函数,如果当前时间time_info.current_time〉表项的创建时间flow_entry.create_time+生存周期时间time_info.expired_time,表明该表项已经超期,则通过消息发送函数向表项对应的核发送超期消息FL0W_INVALID,同时,将该表项通过链表添加函数添加到超期池g_expired_flow_pool对应的链表中;步骤3:控制平面对超期池g_expired_flow_pool对应的链表进行遍历,如果当前时间time_info.current_time>表项的创建时间flow_entry.create_time+2*生存周期时间time_info.expired_time,表明该表项需要从内存中删除,贝U通过消息发送函数向表项对应的核发送释放内存消息FL0W_DELETE。在上述技术方案的基础上,步骤4:数据平面通过接收函数接收控制平面通过消息发送函数发送过来的消息,并对消息的种类进行分析;如果控制平面通过消息发送函数发送过来的消息是超期消息FL0W_INVALID,表明需要将对应的表项从流表中移出,则数据平面调用移出函数,通过双向链表中表项结点的操作(例如next->prev=prev,prev_>next=next)将该表项从流表的链表中移出,并将该表项通过链表添加函数添加到超期池g_expired_flow_pool对应的链表中,此时并未释放表项内存,因此可以保证可能正在利用该表项进行转发操作的其它核,将数据包顺利转发出去;如果控制平面通过消息发送函数发送过来的消息是释放内存消息FL0W_DELETE,表明需要将该表项从流表中删除,并释放内存空间,则数据平面调用删除函数,将该表项从流表中删除并释放内存空间。在上述技术方案的基础上,还包括以下步骤步骤5:当数据平面执行完消息处理后,进入待转发数据包的路由查找处理,调用流表查找函数flowjookup在对应的流表中进行路由查找,如果在对应的流表中没有查找到匹配的表项,则通过流表增加函数flow_add在流表中创建新表项flow_entry,此时新表项flow_entry中的有效标志位action_num置O,用表项添加函数list_add将表项添加到该流表数据链的头部,并把待转发数据包的路由信息指针flow_info指向该新表项flow_entry,以便通过该指针获得路由表项信息,完成后进入步骤6;如果在对应的流表中查找到匹配的表项,通过待转发数据包的路由信息指针flow_info返回得到路由表项信息,然后进入步骤7;步骤6:通过路由查找函数rt_lookUp在总表中进行路由查找,如果没有查找到匹配的表项,则依照配置规则对数据包做相应的处理,可按现有技术实施,不再详述;如果查找到匹配的表项,将该表项的内容复制到上一步(步骤5)创建的新表项flow_entry中,并将该新表项的有效标志位action_num置I,加上表项的创建时间,然后进入步骤7;步骤7:根据待转发数据包查表返回得到的路由表项信息将待转发数据包发送到对应的出端口。本发明所述的高速并行的无锁流表路由查找方法,解决多核处理器并行执行过程中,现有流表设计方法造成的数据处理瓶颈问题,实现了多核并行执行过程中数据转发的安全性和快速性,提高大容量系统路由查找速度和并行路由查找的性能。本发明有如下附图图I多核并行调度环境下流表、总表与核之间的关系图,图2多核并行执行环境流表原理图,图3初期的流和超期池表项结构图,图4第一阶段流表和超期池表项结构图,图5第二阶段流表和超期池表项结构图。具体实施方式以下结合附图对本发明作进一步详细说明。通过对现有的采用流表设计的路由查找策略进行分析,我们可知多核处理器中采用流表的路由查找策略,在一定程度上提高了路由查找的效率,但是由于多核处理器具有的并行执行的特点,使得无论是多核共享同一张流表的设计架构,还是每个核各自维护一张流表的设计架构,都会产生表项资源的竞争。为了系统的安全性和可靠性,在一定范围内都需要采用资源锁的形式解决流表表项的竞争问题,这种采用资源锁的解决方法对多核处理器的并行执行效率有所折损,在一定程度上容易产生数据瓶颈,不利于多核处理器硬件性能的完全发挥。以下对现有的多核并行执行环境中流表原理进行分析。在多核处理器的多核并行执行环境中,根据核完成的任务不同,分为数据平面(DataPlane)和控制平面(ControlPlane)。数据平面主要实现数据包数据的接收、数据头分析、流表和总表的查询、数据的转发等。控制平面主要实现将各种路由协议中学习的路由信息,下发到数据平面的转发表中,并对处于数据平面的总表和流表进行管理与维护。一般来讲总表和流表是建立在一段系统共享内存上,可以确保控制平面和数据平面对其都可见,便于数据平面对路由表项数据的查询和读取,便于控制平面对路由表项数据的管理与维护。在多核并行执行环境中采用流表的方式加快路由查找的速率,系统通常在Cache中申请与处理器的核数N(N大于等于2)相等的用来存放流表的空间块。每个流表内的路由表项集合是总表的一个子集,流表(FlowTable)与总表(GlobalRouterTable)之间的关系如图2所示,在路由初始化后随着数据流转发过程一步步建立。处理器的核每次进行路由查找时,先去对应的流表中进行查找,如果找到则数据直接根据路由信息转发到出端口,如果查询不到,则再进入总表中查找,在总表中查找到路由后,将该条路由添加到流表中。多核处理器在并行执行的任务调度上分为有序调度模式(staticaffinitymode)和无序调度模式(round-robinmode)。有序调度模式下相同Hash值的数据流发往同一个核进行处理;无序调度模式下相同Hash值的数据流可能发往不同的核进行处理,多核并行执行系统中流表的设计需要兼顾到这两种调度方式的区别。设计过程中为了同时实现上述两个执行模式下流表工作的高效性和内存消耗的合理性,在有序调度模式上,流表属于核所私有,因为同一数据流在同一核上处理,可以确保其它的核不来竞争该流表资源;在无序调度模式上,流表属于同一数据流所共享,但是同一数据流的数据包会发往不同的核进行处理,核在处理该流的数据包时,根据数据包信息哈希到该流对应的同一个流表上,因此流表此时为核间所共享。虽然系统为数据平面的每个核创建了一个属于自己的流表,但是在多核无序调度过程中,本属于该核处理的数据流可能会发送到其它的核上去处理,其它核处理该数据过程中,通过数据任务本身携带的信息可以哈希到该核的流表上,因此还是会形成多个核使用相同的一张流表的现象,例如当同流的数据包在一个核上的正在查询对应的流表的某一个表项同时,另一个核此时正对该表项进行删除,一定程度上还是会造成数据转发的不确定性。以下对本发明的多核并行执行环境中无锁流表原理进行分析。为了完全解决上述问题,实现真正意义上的无锁流表设计,本发明在设计中将表项的删除过程划分为两个阶段,第一阶段将需要删除的表项从流表的链表中剥离,第二阶段是在一段一定周期(生存周期)时间后,通过释放第一阶段中剥离的表项内存空间来删除表项。第一阶段中表项虽然已经从流表的链表中剥离,但是不删除,这样做可以保证核在删除表项操作过程时,其它核上处于使用该表项的数据仍能正确转发出去。流表中的表项生存周期是根据时间来设定的,如果生存周期已到需要对表项进行相应的删除操作。初期的流表(g_flow_table)和超期池(g_expired_flow_pool)表项结构图如图3所示,流表g_flow_table[i](0=〈i〈N,N为处理器核数)中的每个表项flow_entry在创建时有一个时间标签flow_entry.create_time,表项的生存周期时间为time_info.expired_time,当前时间为time_info.current_time。控制平面对于流表中表项的删除过程的两个阶段按照时间来划分,控制平面负责定期对所有流表进行遍历,当发现表项的当前时间time_info.current_time大于表项的创建时间flow_entry.create_time与生存周期时间time_info.expired_time之和,表明表项已经超期,进入第一阶段,将该表项从流表中移出,并将超期的表项添加到g_expired_flow_pool链表后,第一阶段流表(g_flow_table)和超期池(g_expired_flow_pool)表项结构图如图4所示。当控制平面定期对添加了超期链表g_expired_flow_pool中的表项进行遍历时,如果表项的当前时间大于表项的创建时间与2倍的生存周期时间之和时,表项操作进入第二阶段,表明超期的表项需要释放内存空间,进行真正的删除,第二阶段流表(g_flow_table)和超期池(g_expired_flow_pool)表项结构图如图5所示。控制平面负责所有流表的表项的时间检测和超期表项链表g_expired_flow_pool的维护管理,并通过消息队列的方式将需要移出和需要释放空间的表项信息发送到对应所属的数据平面核上,该核接收到控制平面的队列消息(FL0W_INVALID或FL0W_DELETE),分别对该表项进行相应的操作。本发明所述的高速并行的无锁流表路由查找方法,包括以下步骤A)控制平面实现步骤步骤I:控制平面定期分别对初始化创建的N个流表g_flow_table[i]中的表项进行遍历,0=〈i〈N,N值等于多核处理器的核数且N大于等于2,每遍历一个表项的同时对表项的创建时间进行检测;步骤2:控制平面执行表项时间检测函数,如果当前时间time_info.current_time〉表项的创建时间flow_entry.create_time+生存周期时间time_info.expired_time,表明该表项已经超期,则通过消息发送函数向表项对应的核发送超期消息FL0W_INVALID,同时,将该表项通过链表添加函数添加到超期池g_expired_flow_pool对应的链表中;步骤3:控制平面对超期池g_expired_flow_pool对应的链表进行遍历,如果当前时间time_info.current_time>表项的创建时间flow_entry.create_time+2*生存周期时间time_info.expired_time,表明该表项需要从内存中删除,贝U通过消息发送函数向表项对应的核发送释放内存消息FL0W_DELETE;B)数据平面实现步骤步骤4:数据平面通过接收函数接收控制平面通过消息发送函数发送过来的消息,并对消息的种类进行分析;如果控制平面通过消息发送函数发送过来的消息是超期消息FL0W_INVALID,表明需要将对应的表项从流表中移出,则数据平面调用移出函数,通过双向链表中表项结点的操作(例如next->prev=prev,prev_>next=next)将该表项从流表的链表中移出,并将该表项通过链表添加函数添加到超期池g_expired_flow_pool对应的链表中,此时并未释放表项内存,因此可以保证可能正在利用该表项进行转发操作的其它核,将数据包顺利转发出去;如果控制平面通过消息发送函数发送过来的消息是释放内存消息FL0W_DELETE,表明需要将该表项从流表中删除,并释放内存空间,则数据平面调用删除函数,将该表项从流表中删除并释放内存空间。在上述技术方案的基础上,还包括以下步骤步骤5:当数据平面执行完消息处理后,进入待转发数据包的路由查找处理,调用流表查找函数flowjookup在对应的流表中进行路由查找,如果在对应的流表中没有查找到匹配的表项,则通过流表增加函数flow_add在流表中创建新表项flow_entry,此时新表项flow_entry中的有效标志位action_num置O,用表项添加函数list_add将表项添加到该流表数据链的头部,并把待转发数据包的路由信息指针flow_info指向该新表项flow_entry,以便通过该指针获得路由表项信息,完成后进入步骤6;如果在对应的流表中查找到匹配的表项,通过待转发数据包的路由信息指针flow_info返回得到路由表项信息,然后进入步骤7;步骤6:通过路由查找函数rt_lookUp在总表中进行路由查找,如果没有查找到匹配的表项,则依照配置规则对数据包做相应的处理,可按现有技术实施,不再详述;如果查找到匹配的表项,将该表项的内容复制到上一步(步骤5)创建的新表项flow_entry中,并将该新表项的有效标志位action_num置I,加上表项的创建时间,然后进入步骤7;步骤7:根据待转发数据包查表返回得到的路由表项信息将待转发数据包发送到对应的出端口。本发明的关键点多核处理器并行执行的环境中,采用与核数相对应数目流表的设计结构提高路由查找效率,并用多核中的控制平面与数据平面相结合,将流表中表项的删除操作分割成两个相对独立的FL0W_INVALID(失效)和FL0W_DELETE(删除)阶段,用无锁流表(流表无资源锁)的方式解决了多核并行执行过程中,多个核同时共享(读写)同一张流表造成的数据转发不安全问题,避免了采用资源锁对流表进行管理而降低路由查找的效率问题,实现多核并行执行各模式(无序调度和有序调度模式)下的无锁流表路由查找方法。特别说明无序调度和有序调度模式对于无锁流表的上述步骤是没有影响的,本发明能够支持多核下两种调度模式,两种调度方式的不同只会影响到数据包发往处理的核有所差别,但是对于数据包hash到的流表则不会产生影响。本发明通过设计方法将对流表表项的删除操作分成两个阶段,第一阶段是让表项失效,但是不删除表项;第二阶段再去释放表项资源空间。使得并行路由查找过程中,多个核在同一时刻对同一表项进行的删除和查找操作,可以并行执行而不影响效率,并且可以保证在表项失效的时,其它核上正在利用该表项的数据包,依旧可以利用该表项的路由信息将数据发送出去,保障了数据处理的安全性和可靠性。本发明避免了采用资源锁造成对流表的执行只能串行执行,使得并行路由查找产生数据处理瓶颈,而降低并行查找的效率。特别说明失效的表项加入超期池是为了便于控制平面对表项的生存周期进行管理,系统并不根据超期池中的表项进行数据转发。本发明中对一个表项删除划分为失效和删除两个操作的根本原因在于无序调度下可能存在的多个核共用一个表项,但是此时有核对表项进行删除操作,如果此时进行表项的内存释放,面临的问题是其它核正在利用该表项进行转发的操作是不安全的。因此划分为FL0W_INVALID(失效)和FL0W_DELETE(删除)两个阶段,失效但是内存不释放,因此其它核(在该时刻)依旧可以利用其表项进行安全的数据转发。由于失效操作,该表项从链表中已经移除,以后的流表查找操作也不会查找到该表项。需要理解的是,我们设计该发明保护数据的安全性,就是要保护删除表项的这个时间点(这个点可能有多个核都在用同一个表项),而不是第一个阶段。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。权利要求1.一种高速并行的无锁流表路由查找方法,其特征在于,包括以下步骤步骤I:控制平面定期分别对初始化创建的N个流表g_flow_table[i]中的表项进行遍历,0=〈i〈N,N值等于多核处理器的核数且N大于等于2,每遍历一个表项的同时对表项的创建时间进行检测;步骤2:控制平面执行表项时间检测函数,如果当前时间time_info.current_time>表项的创建时间flow_entry.create_time+生存周期时间time_info.expired_time,表明该表项已经超期,则通过消息发送函数向表项对应的核发送超期消息FL0W_INVALID,同时,将该表项通过链表添加函数添加到超期池g_expired_flow_pool对应的链表中;步骤3:控制平面对超期池g_expired_flow_pool对应的链表进行遍历,如果当前时间time_info.current_time>表项的创建时间flow_entry.create_time+2*生存周期时间time_info.expired_time,表明该表项需要从内存中删除,贝U通过消息发送函数向表项对应的核发送释放内存消息FL0W_DELETE。2.如权利要求I所述的高速并行的无锁流表路由查找方法,其特征在于,步骤4:数据平面通过接收函数接收控制平面通过消息发送函数发送过来的消息,并对消息的种类进行分析;如果控制平面通过消息发送函数发送过来的消息是超期消息FL0W_INVALID,表明需要将对应的表项从流表中移出,则数据平面调用移出函数,通过双向链表中表项结点的操作将该表项从流表的链表中移出,并将该表项通过链表添加函数添加到超期池g_expired_flow_pool对应的链表中,此时并未释放表项内存,因此可以保证可能正在利用该表项进行转发操作的其它核,将数据包顺利转发出去;如果控制平面通过消息发送函数发送过来的消息是释放内存消息FL0W_DELETE,表明需要将该表项从流表中删除,并释放内存空间,则数据平面调用删除函数,将该表项从流表中删除并释放内存空间。3.如权利要求2所述的高速并行的无锁流表路由查找方法,其特征在于,还包括以下步骤步骤5:当数据平面执行完消息处理后,进入待转发数据包的路由查找处理,调用流表查找函数flowjookup在对应的流表中进行路由查找,如果在对应的流表中没有查找到匹配的表项,则通过流表增加函数flow_add在流表中创建新表项flow_entry,此时新表项flow_entry中的有效标志位action_num置O,用表项添加函数list_add将表项添加到该流表数据链的头部,并把待转发数据包的路由信息指针flow_info指向该新表项flow_entry,以便通过该指针获得路由表项信息,完成后进入步骤6;如果在对应的流表中查找到匹配的表项,通过待转发数据包的路由信息指针flow_info返回得到路由表项信息,然后进入步骤7;步骤6:通过路由查找函数rt_l00kup在总表中进行路由查找,如果没有查找到匹配的表项,则依照配置规则对数据包做相应的处理,可按现有技术实施,不再详述;如果查找到匹配的表项,将该表项的内容复制到上一步创建的新表项flow_entry中,并将该新表项的有效标志位action_num置I,加上表项的创建时间,然后进入步骤7;步骤7:根据待转发数据包查表返回得到的路由表项信息将待转发数据包发送到对应的出端口。全文摘要本发明涉及路由查找算法,具体说是一种多核处理器高速并行的无锁流表路由查找方法。多核处理器并行执行环境中,采用与核数相对应数目流表的设计结构,并用多核中控制平面与数据平面相结合的方式,将流表中表项的删除操作分割成两个相对独立的FLOW_INVALID(失效)和FLOW_DELETE(删除)阶段,使得多个核对一张流表同时进行读写操作而无需依赖资源锁的控制。本发明所述的高速并行的无锁流表路由查找方法,解决多核处理器并行执行过程中,现有流表设计方法造成的数据处理瓶颈问题,实现了多核并行执行过程中数据转发的安全性和快速性,提高大容量系统路由查找速度和并行路由查找的性能。文档编号G06F17/30GK102938000SQ20121052027公开日2013年2月20日申请日期2012年12月6日优先权日2012年12月6日发明者范富明,李念军申请人:武汉烽火网络有限责任公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1