本发明涉及网络流量安全分析,具体为一种面向高速网络无损采集的变长内存池结构及其应用方法。
背景技术:
1、随着信息技术的迅猛发展和智能设备的普及,网络带宽不断增加,10ge(千兆以太网gigabit ethernet表示以太网速率单位)、40ge甚至100ge。越来越高的流量增长也给网络流量安全分析领域带来了更多的挑战。
2、在高负载的网络流量安全分析系统中,为了达到流量的无损采集、分析和存储,如何实现对内存的合理分配已经成为了一个非常重要的问题。原始的系统中,通过malloc和free进行频繁地内存分配,这将造成大量的缺页中断和内存碎片,严重影响到系统性能。而通过内存池来管理内存,可以有效降低向内核申请内存的次数,减少内存碎片,避免内存泄漏。选择一个合适的内存池来管理内存,是提升系统性能必不可少的选择。
3、目前流行的几种内存池包括:mempool(定长内存池)、apr_pool(变长内存池)、svbsmp(self-adaptive variable-size block memory pool自适应变长块内存池)。
4、(1)mempool:作为传统的定长内存池,通过预先分配大块内存,再将大块内存划分为若干固定大小的小块内存单元。这些小块内存单元一般使用链表串起来,在需要一块内存时,就从链表头取出一块空闲内存单元交给申请者,而释放的过程则是把内存单元挂回链表上。这种定长结构的内存单元不管是申请还是回收都很快。
5、(2)apr_pool:作为一个常用的变长内存池,相对于传统的定长内存池,并不固定分配内存的长度,内存的分配只是在一块足够长的空闲内存块上的指针偏移。无需要多个不同的内存池就可以进行各种大小的内存分配,同时没有内存浪费的缺点。
6、(3)svbsmp:自适应变长块内存池,在传统定长内存池的基础上,从小到大依次划分了多个定长内存池,申请内存时,根据算法从大小最接近的可用内存池取出,释放时回收到取出的内存池。这种方式的优点是不管申请还是回收都很快,同时尽可能地减少了内存浪费。
7、在高速网络环境中,网络流量安全分析系统需要对海量数据包进行及时缓存。高速的网络环境中流量大小超过10ge、40ge、甚至100ge,这对整个系统的负载要求非常高,因此选择的内存池应该尽可能简单高效,避免对系统性能造成影响。同时由于流量非常大,数据包非常多,这对有限的内存提出了很高的要求,如何尽可能节省内存、提高内存使用率时需要反复对比,优中择优。
8、目前流行的几种内存池mempool(定长内存池)、apr_pool(变长内存池)、svbsmp(自适应变长块内存池),虽然在很多场景中都能很好地应用,但是在高速网络流量安全分析系统中都不是最好的解决方案。apr_pool(变长内存池)过于复杂,性能在这种场景中并不合适;mempool(定长内存池)简单高效,但是对内存的利用率不高;svbsmp(自适应变长块内存池)尽管结合了前两者的部分优点,但是在这种负载高、环境复杂多变的场景中仍然存在一定的局限性。
9、高速网络中,网络流量非常大,数据包大小各异,存在波峰波谷,为了应对这样高速、多变的流量,也为了尽可能提升性能,网络流量安全分析系统一般采用多线程高并发运行。这样的系统中,为了减少资源竞争,同时避免多线程并发与流的顺序性的冲突,一般通过hash分流数据包的方式,实现基于流的负载均衡。然而,很多场景中仍然存在流数据包的分配并不太均匀的情况。如果采用目前已有技术都将存在如下的各自缺点:
10、(1)mempool
11、mempool内存池中都是大小相等的内存单元。网环境中的mtu(最大传输单元)通常被设置为1500字节,加上以太帧头及crc部分总计1518字节。因此,如果使用mempool,为了保证大部分环境中能够存下所有大小的数据包,内存单元应设置为1518字节。然而,实际场景中的数据包大小从几十到几百字节不等,这种简单的固定大小结构在具有时间上的巨大优势的同时在空间上却存在巨大的浪费。
12、(2)apr_pool
13、apr_pool内存池非常节省内存,但是申请内存的顺序并不是释放内存的顺序,这将产生大量的内存碎片,导致内存管理过于复杂。这种分配方式对于一般的服务器而言没有太大的问题,但是在高速网络环境中,过于复杂的管理分配方式会对性能造成很大影响。
14、(3)svbsmp
15、svbsmp内存池通过多个不同长度的定长内存池组成,管理相对复杂。由于多个内存池之间内存块大小采用递增的方式增长,这将面临两个问题:如果递增长度过大,那么由于数据包的大小不一将造成太多的内存浪费;如果递增长度过小,那么由于网络环境复杂多变的影响,不同时段某些长度的数据包更多或更少,这都将造成svbsmp的多个内存池大小分布并不符合实时流量的变化,需要分配更多的内存以应对这种情况。
技术实现思路
1、针对网络流量安全分析系统,在高速网络环境中对海量数据包的缓存要求,本发明的目的在于提供一种面向高速网络无损采集的变长内存池结构及其应用方法,在大流量、高并发、内存大量重复使用的场景中,尽可能地减少内存的浪费,同时尽可能降低内存分配对性能的影响,实现对流量的无损采集。技术方案如下:
2、一种面向高速网络无损采集的变长内存池结构,包括全局的唯一内存池、线程的本地子内存池;
3、全局唯一内存池预先从系统中分配大块内存页,再切分为更小的内存块;全局唯一内存池包括两种结构:内存页和内存桶;内存页为系统实际分配的大块内存单元,以链表的形式连接并保存在page_head中;内存桶以链表的形式连接并保存在bucket_head中;内存桶中的block_head指向一个特定数量的内存块连接起来的链表,该内存块均为由内存页切分出来的小块内存;
4、本地子内存池包含一个内存桶链表,线程中内存块的申请释放均在内存桶链表的桶中进行;当内存桶链表中的内存桶少于下限阈值或过于上限阈值时,则与全局唯一内存池进行桶的迁移以保证整个系统中内存的均衡分布。
5、进一步的,构建大块内存时,先通过数据长度计算出需要的内存块数量,再从内存桶中取出的足够的内存块,并将内存块以链表的形式连接起来;然后将数据内容切分成多份,每份的大小不超过内存块的实际容量,并依次拷贝到内存块上。
6、一种面向高速网络无损采集的变长内存池结构的应用方法,包括以下步骤:
7、步骤1:服务中初始化一个全局唯一内存池,内存池中包含若干内存桶,每一个内存桶中都包含若干固定大小的内存块;同时每一个线程都通过thread_local创建一个本地的子内存池,子内存池中也包含一个内存桶链表;
8、步骤2:线程中申请内存时,根据需要的缓存长度计算需要的内存块数量,然后检查本地子内存池中是否有足够的内存块;如果不足,则从全局唯一内存池中取出新的内存桶,再从内存桶中取出需要数量的内存块;拿到足够数量的内存块之后,将这些内存块通过链表的方式串联到一起,再将缓存内容依次拷贝到串联的内存块上;
9、步骤3:当内存使用完毕之后,将内存块存入本地子内存池的内存桶中,此时如果检查到存入的桶已满,则新增一个空的内存桶并存入;同时,检查本地子内存池的桶数量是否超过上限,如果超过上限,则将多余的桶存入全局唯一内存池。
10、本发明的有益效果是:
11、1)、本发明在原有的mempool(定长内存池)的基础上,增加了内存桶的概念,线程间通过内存桶来进行内存迁移,在多并发系统中可以减少线程间交互的次数和时间。
12、2)、本发明分配了更小的内存块,通过小块内存的追加重组满足了系统对大块内存的需求,管理相对简单,对内存的利用率却很高。
13、3)、本发明在多并发系统中,只在全局唯一内存池和线程本地子内存池之间进行内存迁移,通过线程本地子内存池的缓冲作用,可以避免多线程负载不均衡造成的内存分布不均,也可以进一步减少线程间交互以避免频繁加解锁造成的性能下降。