一种多线程分析的均衡分流方法
技术领域
本发明涉及一种多线程分析的均衡分流方法,特别是涉及一种适用于网络通信领域的多线程分析的均衡分流方法。
背景技术
在网络分析领域,通常都是通过采集网络通信中的数据包,然后再通过分析数据包的tcp/ip层及具体的应用层数据,进而得到网络中存在的诸如网络性能问题,网络攻击安全问题等相关信息;
在网络数据包分析中,数据包数据通常能达到100W个每秒到最高1000W个每秒;同时按照数据包的tcp/ip的4层协议属性,将具体相同的ip地址对和端口对的相同的数据包,称之为同一个通信会话的数据包;正常网络中将这些数据按照通信会话数来统计,一般会话数能达到10W到最多1000W,不等;在现有的计算机刀片服务器的架构下,为了保证服务器能够对每秒1000W个数据包及1000W通信会话的状态下能够及时处理分析掉,一般都需要充分的利用CPU(电脑处理器)的多核心特性,通过多线程的方式,将数据以通信会话为单位分散在各个分析线程中;
由于每个分析线程处理能力是有限的,而单位时间内的数据包又需要保证被及时的分析处理完,故而必须保证每个分析线程都处理于均衡的状态,所谓均衡的状态,就是指的将单位时间内的数据包,以通信会话聚合形式,保证具有相同通信会话属性的数据包能够分配给相同的线程,同时,保证每个分析线程都能够在单位时间内分析处理完其被分配的数据包;
若分析线程出现了数据包分配不均衡时,将导致某一些分析线程分析过多的数据包,而某些分析线程将分析较少的数据包,进而出现分析很多数据包的线程占用更多的分析时间,使其不能够在单位时间内分析处理完毕,从而拖慢系统整体的分析性能,出现数据包分析处理不及时的问题,这个问题就是系统分析性能问题。
发明内容
本发明要解决的技术问题是提供一种能够对待处理数据包进行高效、均匀分配的多线程分析的均衡分流方法。
本发明采用的技术方案如下:一种多线程分析的均衡分流方法,具体方法为,对于N个线程,从线程0-(N-1),依次为每个线程分配一个线程序列值ThreadIndexID;所述N为大于1的整数;所述线程每个线程用于分析分配得到的数据包;
创建一个数组空间,该数组空间包括N个数组,一一对应N个线程;每个线程所对应的那个数组用于存放该线程当前等待处理的数据个数;当向一个线程投递一个数据包时,该线程所对应的那个数组中用于存放该线程当前等待处理的数据个数值自加;当线程分析完一个数据包时,数组中用于存放该线程当前等待处理的数据个数值自减;
数据包采集线程采集到数据包,按照tcp/ip协议的规范,得到每个数据包的四元组信息,即ip地址对和端口对信息,进而通过哈希算法计算得到每个数据包的哈希值;使用得到的哈希值与分析线程个数求模得到每个数据包关于线程的数据包线程序列值ThreadIndex;所述数据包线程序列值ThreadIndex指示该数据包所应该分配到的实际线程,该实际线程的线程序列值ThreadIndexID等于该数据包线程序列值ThreadIndex;
定义一个用于均匀分流的哈希表,将数据包的四元组信息作为哈希表的key值,用于查询,将该数据包的实际分配线程序列值ThreadIndexID作为哈希表的value值写入;
数据包分配的具体方法步骤为:
S1、查询当前数据包的四元组信息是否在哈希表中,如果是,则找到其在哈希表中对应的value值,从而找到该数据包实际应该对应的线程序列值ThreadIndexID,将该数据包直接分配给该线程等待处理;如果否,则进入下一步;
S2查询当前数据包的数据包线程序列值ThreadIndex,从数组空间中读取其所对应的待处理的数据包个数是不是最多的一个线程,如果不是则直接分配给线程;如果是,进入下一步;
S2、检查该数据包是不是会话的第一个数据包,如果不是,则将该数据包分配给线程;如果是,则将该数据包分配到当前等待处理的数据个数最少的线程,并将该数据包的四元组信息作为key值,实际分配的线程序列值ThreadIndexID作为value值记录在哈希表中。
通过创建的数组空间,检查分析线程的负载,解决不能完全保证数据包分配均匀的问题。
哈希值的目的是尽可能将不同的四元组信息经常处理后得到不的整数,并且尽可能的保证这些整数的离散分布率良好。
如果数据包本身的四元组分布是均匀的,那么基本上所有分析线程都可以得到均匀的数据包数量,但是当四元组分布不均匀时,就会出现某些线程被分配的数据包多,某些线程被分配的数据包少,引起性能问题。通过哈希表保证了数据包的均匀分流。如果哈希表的key值中存在某数据包的四元组信息,则说明该数据包所属于的会话所分配的线程不是其哈希值计算出的线程,被更改过,则需要读取该key值所对应的value值,找到其实际应该分配的线程。
数据包要被分配到别的线程上去时,通过检查该数据包是不是会话的第一个数据包,保证所有数据包进入同一个线程。
其中,哈希值的具体算法为:将ip地址(IPv4为4字节长,IPv6为16字节长)对和端口对数据依次赋值到一个连续的内存数组空间HashData中,初始化一个零的哈希初始值,然后将HashData的每一个字节当做一个uint8_t数据处理,具体处理步骤为:
S01、通过让初始的哈希值与一个素数a的乘积结果加上HashData的第一个字节值,然后产生一个新的哈希值;
S02、然后让上一步中产生的新的哈希值再与所述素数a的乘积的结果加上HashData的下一个字节的值,再产生一个新的哈希值;
S03、重复S02的操作,直至处理完所有HashData的字节,最终产生我们需要的哈希值。
对于内存数组空间HashData,IPv4时,其总字节长度为:4+4+2+2=12字节,IPv6时,其总字节长度为:16+16+2+2=36字节。
所述素数a为131或151或191。
所述素数a为131。
与现有技术相比,本发明的有益效果是:通过创建的数组空间,检查分析线程的负载,解决不能完全保证数据包分配均匀的问题;通过计算哈希值,尽可能将不同的四元组信息经常处理后得到不的整数,并且尽可能的保证这些整数的离散分布率良好;通过哈希表保证了数据包的均匀分流。数据包要被分配到别的线程上去时,通过检查该数据包是不是会话的第一个数据包,保证所有数据包进入同一个线程。
附图说明
图1为本发明其中一实施例的原理示意图。
图2为本发明其中一实施例中内存数组空间HashData结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
本说明书(包括摘要和附图)中公开的任一特征,除非特别叙述,均可被其他等效或者具有类似目的的替代特征加以替换。即,除非特别叙述,每个特征只是一系列等效或类似特征中的一个例子而已。
具体实施例1
如图1所示,一种多线程分析的均衡分流方法,具体方法为,对于N个线程,从线程0-(N-1),依次为每个线程分配一个线程序列值ThreadIndexID;所述N为大于1的整数;所述线程每个线程用于分析分配得到的数据包;
创建一个数组空间PacketCounters,该数组空间包括N个数组,一一对应N个线程;每个线程所对应的那个数组用于存放该线程当前等待处理的数据个数;当向一个线程投递一个数据包(即根据数据包的数据包线程序列值ThreadIndex值分配了一个数据包)时,该线程所对应的那个数组中用于存放该线程当前等待处理的数据个数值PacketCounters[ThreadIndex]对应自加;当线程分析完一个数据包时,数组中用于存放该线程当前等待处理的数据个数值PacketCounters[ThreadIndex]对应自减;
数据包采集线程采集到数据包,按照tcp/ip协议的规范,得到每个数据包的四元组信息,即ip地址对和端口对信息,进而通过哈希算法计算得到每个数据包的哈希值;使用得到的哈希值与分析线程个数求模得到每个数据包关于线程的数据包线程序列值ThreadIndex;所述数据包线程序列值ThreadIndex指示该数据包所应该分配到的实际线程,该实际线程的线程序列值ThreadIndexID等于该数据包线程序列值ThreadIndex;
定义一个用于均匀分流的哈希表SplitHashTable,将数据包的四元组信息作为哈希表的key值,用于查询,将该数据包的实际分配线程序列值ThreadIndexID作为哈希表的value值写入;
数据包分配的具体方法步骤为:
S1、查询当前数据包的四元组信息是否在哈希表中,如果是,则找到其在哈希表中对应的value值,从而找到该数据包实际应该对应的线程序列值ThreadIndexID,将该数据包直接分配给该线程等待处理;如果否,则进入下一步;
S2查询当前数据包的数据包线程序列值ThreadIndex,从数组空间中读取其所对应的待处理的数据包个数是不是最多的一个线程,如果不是则直接分配给线程;如果是,进入下一步;
S2、检查该数据包是不是会话的第一个数据包(检查方法是传递四元组信息给线程ID为当前数据包ThreadIndex值的线程,处理线程确定是不是会话的第一个数据包),如果不是,为保证所有数据包进入同一个线程,则将该数据包分配给线程;如果是,则将该数据包分配到当前等待处理的数据个数最少的线程,并将该数据包的四元组信息作为key值,实际分配的线程序列值ThreadIndexID作为value值记录在哈希表中。
具体实施例2
在具体实施例1的基础上,其中,哈希值的具体算法为:将ip地址(IPv4为4字节长,IPv6为16字节长)对和端口对数据依次赋值到一个连续的内存数组空间HashData中,初始化一个零的哈希初始值,然后将HashData的每一个字节当做一个uint8_t数据处理,具体处理步骤为:
S01、通过让初始的哈希值与一个素数a的乘积结果加上HashData的第一个字节值,然后产生一个新的哈希值;
S02、然后让上一步中产生的新的哈希值再与所述素数a的乘积的结果加上HashData的下一个字节的值,再产生一个新的哈希值;
S03、重复S02的操作,直至处理完所有HashData的字节,最终产生我们需要的哈希值。
如图2所示,对于内存数组空间HashData,IPv4时,其总字节长度为:4+4+2+2=12字节,IPv6时,其总字节长度为:16+16+2+2=36字节。
具体实施例3
在具体实施例2的基础上,所述素数a为131。
具体实施例4
在具体实施例2的基础上,所述素数a为151。
具体实施例5
在具体实施例2的基础上,所述素数a为191。