专利名称:一种弹性伸缩元数据管理方法
专利类型:发明专利
专利申请号:CN202410039430.8
专利申请(专利权)人:北京浩瀚深度信息技术股份有限公司
权利人地址:北京市海淀区西四环北路119号A座2层218室
专利发明(设计)人:刘世福,马金刚,孙连军,金正达
专利摘要:本发明提供一种弹性伸缩元数据管理方法,包括步骤一,获取所有待传输元数据的描述文件以确定元数据的组合类型,注册接口通过元数据名称获取元数据的注册信息并存储至注册队列,依据注册信息和引擎接口计算元数据对象的内存大小,以构建第一个定长内存池;步骤二,从定长内存池内调取可存储任意元数据的内存公共体,并置于元数据队列;步骤三,解析器解析网络流量生成元数据,并存储至元数据队列其对应内存公用体;步骤四,调取元数据队列上的共用内存体,通过元数据释放接口释放元数据。本发明能够高效的存储任意组合形式的元数据字段,同时节约内存资源。
主权利要求:
1.一种弹性伸缩元数据管理方法,其特征在于,包括,
步骤一,生成定长内存池,获取所有待传输元数据的描述文件以确定元数据的组合类型,注册接口通过元数据名称获取元数据的注册信息并存储至注册队列,依据注册队列和引擎接口计算元数据对象的内存大小,以构建第一个定长内存池;
步骤二,调取内存公用体,从定长内存池内调取可存储任意元数据的内存公共体,并置于元数据队列;
步骤三,存储元数据,解析器解析网络流量生成元数据,并存储至元数据队列其对应内存公用体;
步骤四,释放元数据,调取元数据队列上的共用内存体,通过元数据释放接口释放元数据;
所述步骤四包括数据面元数据释放,包括获取元数据队列上内存公用体,判断内存公用体内的元数据是否完整,否,等待获取下一轮数据包,是,元数据是否跨线程处理,否,释放内存公用体内元数据;是,内存公用体内元数据通过ring队列发送至其他线程,引用计数增加一。
2.根据权利要求1所述的一种弹性伸缩元数据管理方法,其特征在于,所述步骤二包括依据人为设定的元数据存储需求调取外挂内存,所述内存公用体用于记载元数据的数值信息,所述外挂内存用于记载元数据的二进制字符串;
所述内存公用体内包括指针信息和长度信息,以定位外挂内存位置和大小。
3.根据权利要求1所述的一种弹性伸缩元数据管理方法,其特征在于,所述描述文件包括记载元数据类型的类型信息、记载元数据名字的名称信息和记载二进制字符串长度的长度信息。
4.根据权利要求1所述的一种弹性伸缩元数据管理方法,其特征在于,所述注册信息包括元数据类型信息和内存大小信息,以便引擎接口依据注册信息计算每个内存公用体大小。
5.根据权利要求1所述的一种弹性伸缩元数据管理方法,其特征在于,所述步骤三包括元数据字段的开启接口,以控制所述解析器是否解析。
6.根据权利要求1所述的一种弹性伸缩元数据管理方法,其特征在于,所述步骤三包括赋值接口,所述元数据存储至内存公用体,调用赋值接口给元数据赋值,使元数据与内存公用体产生联系。
7.根据权利要求1所述的一种弹性伸缩元数据管理方法,其特征在于,所述步骤四包括控制面元数据释放,包括获取元数据队列上的内存公用体,获取并释放内存公用体内元数据。
8.根据权利要求2所述的一种弹性伸缩元数据管理方法,其特征在于,所述外挂内存置于外挂内存池内,所述外挂内存池的扩展包括:通过流水线方式工作的引擎架构扩展,可仅在一块内存上进行扩展。
9.根据权利要求8所述的一种弹性伸缩元数据管理方法,其特征在于,所述外挂内存池的扩展包括:通过批处理方式的引擎架构扩展,通过不断更新算法获得最佳外挂内存池大小。 说明书 : 一种弹性伸缩元数据管理方法技术领域[0001] 本发明涉及元数据管理技术领域,具体涉及一种弹性伸缩元数据管理方法。背景技术[0002] 用于网络解码的程序或者子系统叫做网络协议解析器。简称解析器,是元数据的生产者。为了达到网络安全检测或审计等目的,需要协议解析器对网络流量进行解码操作,获取关键信息。[0003] 在网络监测和网络安全领域,一般需要先将网络流量解析产生元数据,再将元数据送入匹配模块进行监测,或者送入日志模块用于产生日志,或者送入处置模块用于决策处置方式等。在这些元数据转移过程中缓存元数据需要大量的内存空间。[0004] 通常,业界的做法是通过硬编码方式固定元数据字段个数和存储顺序,在硬编码的前提下,为减少内存消耗,或在数据面使用malloc动态申请内存,或使用单一的内存池技术在控制面预分配内存。下面三点简单描述这种方式存在的弊端。[0005] 硬编码的缺点:[0006] 1)单组元数据内存空间大小固定,当需求变化时,可能有一些字段是不需要的,这就造成了不必要的内存浪费,和CPU资源浪费。[0007] 2)当需求变化,需要新增加元数据字段时,又需要手工修改代码,增加工作量。[0008] 数据面使用malloc动态申请内的缺点:[0009] 1)malloc函数效率低;[0010] 2)会产生内存碎片;[0011] 3)内存局部性差,缓存命中率降低。[0012] 独立内存池的缺点:[0013] 1)元数据会根据不同的网络协议分为不同的组合,每种组合使用一个独立的内存池,看似解决了内存的浪费问题,但是又引入的新的问题,在不确定目标网络流量中协议比例的情况下,每个内存池的总体空间应该分配多少无法确定,这会使得引擎要不无法正常工作,要不内存浪费;[0014] 2)编写代码时,各个协议解析器需要写重复的代码,编码效率低。发明内容[0015] 有鉴于此,本发明要解决的问题是提供一种弹性伸缩元数据管理方法,能够高效的存储任意组合形式的元数据字段,同时节约内存资源。[0016] 为解决上述技术问题,本发明采用的技术方案是:[0017] 一种弹性伸缩元数据管理方法,包括,[0018] 步骤一,生成定长内存池,获取所有待传输元数据的描述文件以确定元数据的组合类型,注册接口通过元数据名称获取元数据的注册信息并存储至注册队列,依据注册队列和引擎接口计算元数据对象的内存大小,以构建第一个定长内存池;[0019] 步骤二,调取内存公用体,从定长内存池内调取可存储任意元数据的内存公共体,并置于元数据队列;[0020] 步骤三,存储元数据,解析器解析网络流量生成元数据,并存储至元数据队列其对应内存公用体;[0021] 步骤四,释放元数据,调取元数据队列上的共用内存体,通过元数据释放接口释放元数据。[0022] 进一步的,所述步骤二包括依据人为设定的元数据存储需求调取外挂内存,所述内存公用体用于记载元数据的数值信息,所述外挂内存用于记载元数据的二进制字符串;[0023] 所述内存公用体内包括指针信息和长度信息,以定位外挂内存位置和大小。[0024] 进一步的,所述描述文件包括记载元数据类型的类型信息、记载元数据名字的名称信息和记载二进制字符串长度的长度信息。[0025] 进一步的,所述注册信息包括元数据类型信息和内存大小信息,以便引擎接口依据注册信息计算每个内存公用体大小。[0026] 进一步的,所述步骤三包括元数据字段的开启接口,以控制所述解析器是否解析。[0027] 进一步的,所述步骤三包括赋值接口,所述元数据存储至内存公用体,调用赋值接口给元数据赋值,使元数据与内存公用体产生联系。[0028] 进一步的,所述步骤四包括数据面元数据释放,包括获取元数据队列上内存公用体,判断内存公用体内的元数据是否完整,否,等待获取下一轮数据包,是,元数据是否跨线程处理,否,释放内存公用体内元数据;是,内存公用体内元数据通过ring队列发送至其他线程,引用计数增加一。[0029] 进一步的,所述步骤四包括控制面元数据释放,包括获取元数据队列上的内存公用体,获取并释放内存公用体内元数据。[0030] 进一步的,所述外挂内存置于外挂内存池内,所述外挂内存池的扩展包括:通过流水线方式工作的引擎架构扩展,可仅在一块内存上进行扩展。[0031] 进一步的,所述外挂内存池的扩展包括:通过批处理方式的引擎架构扩展,通过不断更新算法获得最佳外挂内存池大小。[0032] 本发明具有的优点和积极效果是:[0033] 通过在程序初始化阶段获取元数据的描述文件,确定带存储元数据的组合方法确定定长内存池的大小,不会导致大量内存浪费,同时采用多种网络协议对应的元数据共用一个内存池,可直接根据元数据内存大小和网络流量并发会发个数控制内存池大小,而不需要按照比例分配每个内存池大小。[0034] 通过在定长内存池内设置指针数据和长度数据,以定位外挂内存位置和大小,提高元数据存储空间的伸缩性,以匹配不同元数据的不同存储需求。[0035] 通过设置元数据字段的开启接口,以便依据开启接口是否开启,控制解析器是否生成元数据,进而控制集线器内部CPU的运行内存,以便控制CPU内存的弹性伸缩。[0036] 元数据夸线程处理时,通过增加引用计数的方式,直接将元数据传递给其他方式,每一个线程释放的仅是引用计数,当引用计数清零时,最后一次释放才是真正的将内存返回给内存池或操作系统,解决跨线程增加锁机制或深度拷贝问题。附图说明[0037] 附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:[0038] 图1是本发明的一种弹性伸缩元数据管理方法中引擎接口生成流程图;[0039] 图2是本发明的一种弹性伸缩元数据管理方法中解析器初始化流程图;[0040] 图3是本发明的一种弹性伸缩元数据管理方法中解析元数据流程图;[0041] 图4是本发明的一种弹性伸缩元数据管理方法中释放元数据流程图。具体实施方式[0042] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。[0043] 除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中在本发明的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本发明。本文所使用的术语“及/或”包括一个或多个相关的所列项目的任意的和所有的组合。[0044] 本发明提供一种弹性伸缩元数据管理方法,其系统包括协议解析器,协议解析器分别与日志模块和检测模块数据互通。协议解析器生成元数据,依据需求,将元数据分发至日志模块和检测模块,为节约日志模块和检测模块内元数据的存储内存,依据元数据管理方法存储。[0045] 如图1所示,元数据管理方法包括,[0046] 步骤一,生成定长内存池,获取所有待传输元数据的描述文件以确定元数据的组合类型,注册接口通过元数据名称获取元数据的注册信息并存储至注册队列,依据注册队列和引擎接口计算每个元数据对象的内存大小,以构建第一个定长内存池;[0047] 网络流量生成的每个元数据对应一描述文件,解析器初始化之前,接收元数据的描述文件,一个描述文件的示例为:[0048] uint8_thttp.method[0049] uint8_t*http.uri[0050] uint8_thttp.uri.len512[0051] 其中第一列表示元数据的数据类型,第二列是元数据字段的名称,如果有二进制字符串时,则存在第三列,表示二进制字符串的最大长度。[0052] 协议解析器获取待传输元数据的描述文件,确定带发送元数据字段的实际组合,依据实际组合构建引擎接口。[0053] 如图1所示,引擎接口的生成过程为:解析器内自动生成程序并读取描述文件,按照规定格式解析描述文件并并输出目标代码;目标代码保存在解析器进程中,通过静态hash算法为所有的字段生成一个独一无二的id,依据id产生引擎接口(对应图中的引擎源代码)。[0054] 如图2所示,注册接口的功能为:输入元数据的名称,输出元数据的类型信息和内存大小,注册接口可以让生产者和消费者调用。将包含类型信息和内存大小的数据定义成注册信息,并将信息存储至注册队列。[0055] 引擎接口依据元数据名称计算元数据的内存大小,依据注册信息数量(元数据组合情况)确定元数据流量,计算出元数据对象(内存)大小,进而确定内存池大小。内存池无须依据元数据其传输协议的使用比例,分别划分存储不同传输协议元数据的内存池,提高内存池生成效率的同时,不会导致大量内存浪费。[0056] 当该批次待存储的元数据均存储至定长内存池后,使用相同的方法获取下一批次元数据的描述文件,构建第二个定长内存池。[0057] 步骤二,调取内存公用体,调取可存储任意元数据的内存公共体,并置于元数据队列。[0058] 如图3所示,解析器接收并解析不同传输协议的网络流量数据,传输协议的种类包括imap和http等,为使所有元数据能够共用一个内存池,构建多个传输协议均可使用的内存公用体(对应图中的内存块),传输协议的种类依据实际种类确定。依据待解析元数据调取对应大小的内存公用体,并将内存公用体放置与元数据队列,方便存储元数据。内存公用体以C语言为例:[0059] unionmeta[0060] {[0061] struct{[0062] uint8_thttp_method;[0063] uint8_t*http_uri;[0064] uint8_thttp_uri_len;[0065] };[0066] struct{[0067] uint8_timap_method;[0068] uint8_t*imap_from;[0069] uint8_timap_from_len;[0070] };[0071] };[0072] 当元数据的使用需求不同时,元数据的存储大小不同,为提高元数据的存储伸缩性,设置有外挂内存。[0073] 本申请的一个实施例为:当需要使用外挂内存时,获取外挂内存,并保存至解析器的上下文中,用于存储元数据。元数据包括二进制字符串与数值信息,外挂内存用于存储二进制字符串,共用内存体用于存储元数据的数值信息、指针信息和长度信息,依据指针信息和长度信息确定外挂内存位置。[0074] 外挂内存位于外挂内存池内,外挂内存池的构建方法包括:通过流水线方式工作的引擎架构扩展外挂内存池,可只在一块内存内进行扩展,节约内存;也可使用批处理架构的引擎架构拓展外挂内存池。[0075] 批处理架构在每个批次开始之前,从内存池获取一块稍微大一点的内存空间,内存空间由引擎启动时,根据元数据字段开启情况计算出来的内存,需要不断更新计算算法,获得最佳内存空间大小,引擎架构运行过程中记录内存池的块是否合理并保存数据,下次引擎架构启动,会自动调整内存池大小和内存块大小,降低内存浪费问题。[0076] 步骤三,存储元数据,解析网络流量并生成元数据,并存储至元数据队列其对应内存公用体。[0077] 解析器解析元数据前,包括元数据字段开启接口,依据开启接口是否开启以确定是否存在此字段,控制解析器是否解析对应字段的元数据,进而控制解析器对CPU的消耗。实现对CPU的弹性伸缩控制。[0078] 为使内存公用体与元数据产生联系,元数据存储至内存公用体后,调用赋值接口,赋值接口可根据字段数据类型不同生成不同的赋值。当存在外挂内存时,赋值接口分别给内存公用体和外国内存内的元数据字段赋值。[0079] 元数据存储至内存公用体后,调用元数据完整接口判断元数据是否完整,是,等待解析下一元数据,否,重复步骤三,直至内存公用体内元数据完整。[0080] 步骤四,释放元数据,调取元数据队列上的共用内存体,通过元数据释放接口释放元数据。[0081] 检测模块通过实时处理的形式释放元数据,不需要完整获取元数据再释放;日志处理模块有时需获取完整元数据才能触发处理。应此释放元数据包括释放部分元数据或释放完整元数据两种情况,元数据的处理方式包括跨线程处理或在本线程处理。当需要元数据跨线程传递时,会有访问冲突问题,为解决这些冲突要么引入锁机制,要么进行深度拷贝,但锁机制或者深度拷贝会降低了引擎的处理性能。[0082] 步骤四中数据面元数据释放过程为:获取元数据队列上内存公用体,内存公用体内的元数据是否完整,否,等待获取下一轮数据包,是,元数据是否跨线程处理,否,获取并释放内存公用体内元数据;是,内存公用体内元数据通过ring队列发送至其他线程,引用计数增加一。[0083] 单线程处理中,获取并释放元数据的过程为:调取元数据获取接口获取需要的元数据字段,在调取元数据释放接口释放元数据。[0084] ring队列为无锁环形队列,无锁环形队列具有批量出队和批量入队的特点。当须有跨线程处理时,调取元数据获取接口元数据字段,并存储至ring队列,增加引用计数加一。通过增加引用计数的方式,直接将元数据传递给其他线程,可解决跨线程处理增加锁机制或深度拷贝问题。释放元数据时,每一个线程释放的仅是引用计数,当引用计数清零时,最后一次释放才是真正的将内存返回给内存池或操作系统。[0085] 步骤四包括控制面元数据释放,包括获取元数据队列上的内存公用体,获取并释放内存公用体内元数据。[0086] 本申请的一种实施例为:在网络流量处理领域,为了保证元数据的准确性一般会进行深度拷贝,这也会增加一部分性能损失和内存浪费。为解决深度拷贝问题,将元数据分类两类,一类是不跨报文帧的(简称单包),另一类的跨报文帧的(简称跨包)。单包元数据中的二进制字符串赋值时,可以将指针指向引擎缓存的报文本体上,当元数据的生命周期比报文长时,才不得不增加深度拷贝。跨包元数据中的二进制字符串赋值时,在解析时直接使用外挂的内存空间,可降低跨报文帧进行深度拷贝,降低了性能损失和内存浪费。[0087] 以上对本发明的实施例进行了详细说明,但所述内容仅为本发明的较佳实施例,不能被认为用于限定本发明的实施范围。凡依本发明范围所作的均等变化与改进等,均应仍归属于本专利涵盖范围之内。
专利地区:北京
专利申请日期:2024-01-10
专利公开日期:2024-09-03
专利公告号:CN117707789B