提高网络数据包处理效率的方法与流程

文档序号:16467369发布日期:2019-01-02 22:51阅读:494来源:国知局
提高网络数据包处理效率的方法与流程

本发明涉及网络数据包处理技术领域,更为具体地,涉及一种提高网络数据包处理效率的方法。



背景技术:

随着社会信息化的迅猛发展,越来越多的网络应用接入到互联网中,导致网络流量的越来越多,网络应用传输的数据量爆发性增加,导致骨干网的网络带宽也越来越大。因此对于网络设备对数据包的处理效率也提出了越来越高的要求。

图1,2为常规的数据包处理方案,图中worker可以是独立的多个进程,也可以是同一个进程的多个不同线程。现有技术主要存在如下不足:

1)效率低,数据包收取的过程中,所有收取的数据包都需要从网卡到网卡驱动,再经过操作系统的ip协议栈的处理,然后再交给用户态的应用层程序。这个过程有至少一次内存拷贝。数据包的发送过程中,所有发送的数据包都需要从用户态的应用层到操作系统的ip协议栈,然后再到网卡驱动程序,最后由网卡将数据包发送出去。这个过程也至少有一次内存拷贝。内存的拷贝,是非常消耗系统总线资源的,会引起cpu的“忙等”,浪费大量资源。

2)对于大流量,资源占用大,还容易引起丢包。



技术实现要素:

本发明的目的在于克服现有技术的不足,提供一种提高网络数据包处理效率的方法,极大地提高了网络设备对数据包的并发处理效率,能够处理大流量,不丢包,可以根据用户使用情况,采取不同的工作模式,从而降低设备能耗。

本发明的目的是通过以下技术方案来实现的:一种提高网络数据包处理效率的方法,包括一个绑定步骤;该步骤用于将网卡上的每一个收发包队列分别绑定到一个单独的cpu核心上。

进一步的,所述cpu核心,其处理的数据是独占的,每个cpu核心处理的数据不与其他的cpu核心或线程所处理的数据进行交换。

进一步的,该方法有两种具体实现模式,一种是内核态工作模式,一种是用户态工作模式,如果选择内核态工作模式,则驱动程序工作在内核态,则跳入步骤s1;如果选择用户态工作模式,则驱动程序运行在用户态,则跳入步骤s2。

进一步的,在步骤s1中,包括如下步骤:

s11,网卡驱动程序在系统主内存中初始化两块共享内存,一块为发包区,另一块为收包区,长期驻留;上层应用程序在用户空间对该共享内存进行映射,从而上层应用能够直接访问网卡收到的数据;

s12,网卡通过dma和硬件hash,将数据包缓存到共享内存的收包区,并修改硬件收包队列;

s13,网卡产生硬中断,通知驱动程序来收包;

s14,网卡驱动程序读取硬件收包队列中的数据,进行软件hash,对数据包进行同源同宿处理,将数据包均匀地分配到所有的软件队列中处理,并且同一数据流会分配到同一队列中去处理;

s15,网卡驱动程序产生软中断,通知上层应用程序接收数据包;

s16,上层应用程序读取软件队列中的数据包并进行处理;

s17,将处理后的数据包写入共享内存的发包区;

s18,通知驱动程序发送数据包;

s19,驱动程序将发送数据包的内存地址写入网卡的相应寄存器,网卡将数据包发送出。

进一步的,在步骤s2中,包括如下步骤:

s21,上层应用程序在用户空间内存中初始化两块共享内存,一块为发包区,另一块为收包区,并长期驻留,关闭网卡硬中断,初始化网卡收包寄存器并监听;

s22,网卡通过dma和硬件hash,将数据包缓存到共享内存的收包区,并修改硬件收包队列;

s23,上层应用程序监测到收包寄存器有变化,读取硬件收包队列中的数据,进行软件hash,对数据包进行同源同宿处理,将数据包均匀地分配到所有的软件队列中处理,并且同一数据流会分配到同一队列中去处理;

s24,上层应用程序读取软件队列中的数据包并进行处理;

s25,上层应用程序将处理后的数据写入发包缓冲区,并由驱动程序将需要发送的包更新到网卡的发包寄存器,将数据包的内存地址、长度参数写入相应的发包寄存器;

s26,网卡将数据包发出。

进一步的,所述同源同宿处理包括硬件同源同宿处理和软件同源同宿处理。

进一步的,包括:

s01,开启网卡硬件同源同宿处理,驱动程序初始化网卡时,开启网卡芯片的硬件同源同宿处理;网卡根据数据包的源ip地址和目标ip地址,计算散列值m1,然后根据这个散列值m1将数据包放入硬件的第m1个队列中,这样,同一个来源的数据包会被分配到同一个队列中;

s02,开启驱动程序的软件同源同宿处理,驱动程序读取硬件队列中的数据包,获取数据包的源ip和目的ip,然后将其进行移位并相加,得到一个数值,然后将该数值与网卡的队列数量n取模,最终得到一个范围在0-(n-1)之间的一个散列值m2,然后根据这个散列值m2将数据包放入软件的第m2个队列中,这样,同一个来源的数据包就能够被同一个处理核心/线程进行处理,不会因为多个核心/线程之间的数据关联而产生等待的情况。

进一步的,在步骤s01中,将源ip和目标ip地址转换成整数,并代入莱布尼兹公式得出一个数值,然后将该数值与网卡的队列数量n取模,最终得到一个范围在0-(n-1)之间的一个数值m1。

本发明的有益效果是:

(1)本发明简化了数据包接收和发送的流程,实现了零拷贝。图3与图1对比所示,数据包的收取和发送,不再需要操作系统的ip协议栈的参与,应用程序可以直接处理数据包,减少了多次拷贝数据包的过程,提高的数据包处理的效率。

(2)本发明提升了cpu对网络数据包的处理效率。现在绝大多数的网卡,都被设计为多队列的,同时大多数cpu也被设计成为多核。对于每个独立网卡队列,本发明指定某个单独的物理cpu核心(或线程)对其进行处理。这样,每个核心处理的这部分数据只会是独占的,不会与其他的核心/线程所处理的数据进行交换,也就避免了cpu等待的情况。因此,极大的提升系统整体的并发处理性能。本发明提出的单队列与cpu单核绑定的方案,能够极大的提升网卡的吞吐量,从千兆到万兆,甚至更大处理能力。

(3)把发明提升了上层应用对数据包的处理效率。在网卡多队列的系统中,网络数据包的上行/下行流量分别从不同网口的不同队列进入系统中,如果不做任何预处理,数据包就会随机的进入不同的队列,最终用户态应用程序处理数据包的时候,就会发现同一个源ip的数据包却被不同的线程处理,这样就产生了多核/多线程的“关联”关系。一旦产生这种情况,就会大幅降低系统整体处理性能。本发明的同源同宿处理方案,使得同一个来源的数据包会被分配到同一个队列中,同一个来源的数据包就能够被同一个处理核心/线程进行处理,不会因为多个核心/线程之间的数据“关联”而产生等待的情况。且同时利用了硬件同源同宿处理和软件同源同宿处理,硬件同源同宿处理的速度快,但只能识别最基本的常规ip包,不能识别带vlan的包,而软件同源同宿更灵活,能识别多种数据包,并且能够提取ip包中内层的ip包。

(4)本发明极大地提高了网络设备对数据包的并发处理效率,能够处理大流量,不丢包。

(5)本发明为用户提供可选择的工作模式。可以根据业务情况,采取不同的工作模式,如果想要功耗最优,可以采用内核态工作模式;如果想要性能最优,可以采用用户态工作模式。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为常规的数据包处理方案示意图。

图2为常规的数据包处理流程示意图。

图3为本发明的数据包处理方案示意图。

图4为本发明的数据包处理流程示意图。

图5为本发明同源同宿处理流程示意图。

具体实施方式

下面结合附图进一步详细描述本发明的技术方案,但本发明的保护范围不局限于以下所述。本说明书中公开的所有特征,或隐含公开的所有方法或过程中的步骤,除了互相排斥的特征和/或步骤以外,均可以以任何方式组合。

本说明书(包括任何附加权利要求、摘要和附图)中公开的任一特征,除非特别叙述,均可被其他等效或具有类似目的的替代特征加以替换。即,除非特别叙述,每个特征只是一系列等效或类似特征中的一个例子而已。

下面将详细描述本发明的具体实施例,应当注意,这里描述的实施例只用于举例说明,并不用于限制本发明。在以下描述中,为了提供对本发明的透彻理解,阐述了大量特定细节。然而,对于本领域普通技术人员显而易见的是:不必采用这些特定细节来实行本发明。在其他实例中,为了避免混淆本发明,未具体描述公知的电路,软件或方法。

如图1所示,一种提高网络数据包处理效率的方法,包括一个绑定步骤;该步骤用于将网卡上的每一个收发包队列分别绑定到一个单独的cpu核心上。

进一步的,所述cpu核心,其处理的数据是独占的,每个cpu核心处理的数据不与其他的cpu核心或线程所处理的数据进行交换。

进一步的,该方法有两种具体实现模式,一种是内核态工作模式,一种是用户态工作模式,如果选择内核态工作模式,则驱动程序工作在内核态,则跳入步骤s1;如果选择用户态工作模式,则驱动程序运行在用户态,则跳入步骤s2。

进一步的,在步骤s1中,包括如下步骤:

s11,网卡驱动程序在系统主内存中初始化两块共享内存,一块为发包区,另一块为收包区,长期驻留;上层应用程序在用户空间对该共享内存进行映射,从而上层应用能够直接访问网卡收到的数据;

s12,网卡通过dma和硬件hash,将数据包缓存到共享内存的收包区,并修改硬件收包队列;

s13,网卡产生硬中断,通知驱动程序来收包;

s14,网卡驱动程序读取硬件收包队列中的数据,进行软件hash,对数据包进行同源同宿处理,将数据包均匀地分配到所有的软件队列中处理,并且同一数据流会分配到同一队列中去处理;

s15,网卡驱动程序产生软中断,通知上层应用程序接收数据包;

s16,上层应用程序读取软件队列中的数据包并进行处理;

s17,将处理后的数据包写入共享内存的发包区;

s18,通知驱动程序发送数据包;

s19,驱动程序将发送数据包的内存地址写入网卡的相应寄存器,网卡将数据包发送出。

进一步的,在步骤s2中,包括如下步骤:

s21,上层应用程序在用户空间内存中初始化两块共享内存,一块为发包区,另一块为收包区,并长期驻留,关闭网卡硬中断,初始化网卡收包寄存器并监听;

s22,网卡通过dma和硬件hash,将数据包缓存到共享内存的收包区,并修改硬件收包队列;

s23,上层应用程序监测到收包寄存器有变化,读取硬件收包队列中的数据,进行软件hash,对数据包进行同源同宿处理,将数据包均匀地分配到所有的软件队列中处理,并且同一数据流会分配到同一队列中去处理;

s24,上层应用程序读取软件队列中的数据包并进行处理;

s25,上层应用程序将处理后的数据写入发包缓冲区,并由驱动程序将需要发送的包更新到网卡的发包寄存器,将数据包的内存地址、长度参数写入相应的发包寄存器;

s26,网卡将数据包发出。

进一步的,所述同源同宿处理包括硬件同源同宿处理和软件同源同宿处理。

进一步的,包括:

s01,开启网卡硬件同源同宿处理,驱动程序初始化网卡时,开启网卡芯片的硬件同源同宿处理;网卡根据数据包的源ip地址和目标ip地址,计算散列值m1,然后根据这个散列值m1将数据包放入硬件的第m1个队列中,这样,同一个来源的数据包会被分配到同一个队列中;

s02,开启驱动程序的软件同源同宿处理,驱动程序读取硬件队列中的数据包,获取数据包的源ip和目的ip,然后将其进行移位并相加,得到一个数值,然后将该数值与网卡的队列数量n取模,最终得到一个范围在0-(n-1)之间的一个散列值m2,然后根据这个散列值m2将数据包放入软件的第m2个队列中,这样,同一个来源的数据包就能够被同一个处理核心/线程进行处理,不会因为多个核心/线程之间的数据关联而产生等待的情况。

进一步的,在步骤s01中,将源ip和目标ip地址转换成整数,并代入莱布尼兹公式得出一个数值,然后将该数值与网卡的队列数量n取模,最终得到一个范围在0-(n-1)之间的一个数值m1。

实施例

本发明从以下三个方面来提高数据包的处理效率:

(一)简化数据包接收和发送的流程,实现零拷贝

如图3所示,数据包的收取和发送,不再需要操作系统的ip协议栈的参与,应用程序可以直接处理数据包,减少了多次拷贝数据包的过程,提高的数据包处理的效率。

(二)网卡单队列与cpu单核绑定

现在绝大多数的网卡,都被设计为多队列的,同时大多数cpu也被设计成为多核。对于每个独立网卡队列,我们指定某个单独的物理cpu核心(或线程)对其进行处理。这样,每个核心处理的这部分数据只会是独占的,不会与其他的核心/线程所处理的数据进行交换,也就避免了cpu等待的情况。因此,极大的提升系统整体的并发处理性能。“单队列与cpu单核绑定”这种方案能够极大的提升网卡的吞吐量,从千兆到万兆,甚至更大处理能力。

(三)同源同宿处理

在网卡多队列的系统中,网络数据包的上行/下行流量分别从不同网口的不同队列进入系统中,如果不做任何预处理,数据包就会随机的进入不同的队列,最终用户态应用程序处理数据包的时候,就会发现同一个源ip的数据包却被不同的线程处理,这样就产生了多核/多线程的“关联”关系。一旦产生这种情况,就会大幅降低系统整体处理性能。因此,我们在网卡驱动程序中,做了如下处理:

s01,开启网卡硬件同源同宿处理。驱动程序初始化网卡时,开启网卡芯片的硬件同源同宿处理。那么网卡会根据数据包的源ip地址和目标ip地址,通过一种公式计算散列值,一般用对称算法----比如莱布尼兹的一种数学公式,即不论输入的两个数值顺序怎么调换,所得到最终的数值都是一样的。具体方法即:将源ip和目标ip地址转换成整数,并代入莱布尼兹公式,得出一个数值,然后将该数值与网卡的队列数量n取模,最终得到一个范围在0-(n-1)之间的一个数值m1。然后根据这个散列值m1将数据包放入硬件的第m1个队列中,这样,同一个来源的数据包会被分配到同一个队列中。

s02,开启驱动程序的软件同源同宿处理。驱动程序读取硬件队列中的数据包,获取数据包的源ip和目的ip,然后将其进行移位并相加,得到一个数值,然后将该数值与网卡的队列数量n取模,最终得到一个范围在0-(n-1)之间的一个散列数值,然后根据这个散列值m2将数据包放入软件的第m2个队列中。这样,同一个来源的数据包就能够被同一个处理核心/线程进行处理,不会因为多个核心/线程之间的数据“关联”而产生等待的情况。

硬件同源同宿与软件同源同宿处理的不同:

a)硬件同源同宿处理的速度快,但只能识别最基本的常规ip包,不能识别特殊封装的ip包,且处理方法不可扩展。

b)软件同源同宿更灵活,能识别多种数据包,并且能够提取ip包中内层的ip包,并且能够通过升级特征库来增加更多的封装识别。

驱动内核态工作模式和用户态工作模式的区别:

1)内核态工作模式

由网卡驱动程序来初始化两块共享内存,一块为发包区,一块为收包区,长期驻留。上层应用程序在用户空间对该共享内存进行映射,从而上层应用可以直接访问网卡收到的数据。收包过程,是由网卡的硬中断来通知驱动,驱动程序发出软中断给上层应用,上层应用才来收包。上层应用处理完数据包后,写入发包区,并通知驱动程序发包。

优点:内核态模式下,网卡采用中断工作模式,在无流量或者流量比较小的情况下,cpu占用低。随着流量的增加,cpu的负载逐步增加。这种情况下,性能和能耗兼顾最优。

2)用户态工作模式

由上层应用程序来初始化两块共享内存,一块为发包区,一块为收包区,长期驻留。收包过程,是由上层应用程序监听网卡的收包寄存器来实现的,一旦网卡收到包,网卡的收包寄存器将发生变化,上层应用就马上开始收包。上层应用处理完数据包后,写入发包区,并通知驱动程序发包。优点:用户态工作模式下,没有中断工作机制,必须轮询。即便在无流量或者流量比较小的情况下,cpu占用也是100%。这种情况下,其性能好,但能耗高。

在本实施例中的其余技术特征,本领域技术人员均可以根据实际情况进行灵活选用和以满足不同的具体实际需求。然而,对于本领域普通技术人员显而易见的是:不必采用这些特定细节来实现本发明。在其他实例中,为了避免混淆本发明,未具体描述公知的算法,方法或系统等,均在本发明的权利要求书请求保护的技术方案限定技术保护范围之内。

对于前述的方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某一些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和单元并不一定是本申请所必须的。

本领域技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法实现所描述的功能,但是这种实现不应超出本发明的范围。

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

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

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

本领域普通技术人员可以理解实现上述实施例的方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、rom、ram等。

以上所述仅是本发明的优选实施方式,应当理解本发明并非局限于本文所披露的形式,不应看作是对其他实施例的排除,而可用于各种其他组合、修改和环境,并能够在本文所述构想范围内,通过上述教导或相关领域的技术或知识进行改动。而本领域人员所进行的改动和变化不脱离本发明的精神和范围,则都应在本发明所附权利要求的保护范围内。

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