一种内存监控的方法和装置转让专利

申请号 : CN200910132368.2

文献号 : CN101515247B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 张明振

申请人 : 福建星网锐捷网络有限公司

摘要 :

本发明公开了一种内存监控的方法和装置,网络设备定期对自身内存使用情况信息进行采样,并将采样数据存放于结构体中,该方法包括:首先选择监控的缓冲池,并设定监控周期;根据设定的监控周期从所述结构体中获取所述缓冲池的结构体变量参数值,其中所述结构体变量参数值用于记录所述缓冲池内存使用情况的相关信息;利用获取到的变量参数值计算得到相应的内存性能指标,并将得到的每个内存性能指标与设定的对应阈值进行比较,如果所述内存性能指标的任一项超过对应的阈值,则确定该缓冲池产生了内存碎片。应用本发明所提供的方法能够有效监控系统内存碎片现象,能够大大缩短问题发现周期;能够进行内存碎片问题模块判断。

权利要求 :

1.一种内存监控的方法,网络设备定期对自身内存使用情况信息进行采样,并将采样数据存放于结构体中,其特征在于,包括:选择监控的缓冲池,并设定监控周期;

根据设定的监控周期从所述结构体中获取所述缓冲池的结构体变量参数值,其中所述结构体变量参数值用于记录所述缓冲池内存使用情况的相关信息;

利用获取到的变量参数值计算得到相应的内存性能指标,并将得到的每个内存性能指标与设定的对应阈值进行比较,如果所述内存性能指标的任一项超过对应的阈值,则确定该缓冲池产生了内存碎片。

2.如权利要求1所述的方法,其特征在于,所述确定该缓冲池产生了内存碎片之后,进一步包括:根据所述结构体中储存的缓冲池与各任务或模块的对应关系确定导致所述缓冲池产生内存碎片的任务或者模块,其中所述任务或者模块是申请或使用内存的实体。

3.如权利要求1所述的方法,其特征在于,

所述选择监控的缓冲池之前进一步包括:当选择监控任务或模块的内存使用情况时,通过结构体中存储的任务或模块与缓冲池的对应关系确定需要监控的至少一个缓冲池;

若确定所述缓冲池中的任意一个产生了内存碎片则判定所述任务或模块出现了异常。

4.如权利要求1~3任一权项所述的方法,其特征在于,所述内存性能指标包括空闲内存块slab总数,和/或,活动内存块slab中空闲对象单元的占有率;

则利用获取到的结构体变量参数值计算得到相应的内存性能指标,包括:从所述结构体变量参数值中获取缓冲池中活动slab的总数和缓冲池中slab的总申请数,利用所述缓冲池中slab的总申请数减去活动slab的总数得到所述空闲slab总数;

从所述结构体变量参数值中获取半满slab中的空闲对象单元数,并用获取到的空闲对象单元数除以活动slab总数与每条slab所包含对象单元数的乘积得到所述活动slab中空闲对象单元的占有率。

5.如权利要求1~3任一权项所述的方法,其特征在于,根据所述缓冲池对应的任务或模块在运行过程中对内存的申请量、申请频度和该任务或者模块的功能重要性设定所述缓冲池的各阈值。

6.如权利要求1~3任一权项所述的方法,其特征在于,在确定该缓冲池产生了内存碎片后,该方法进一步包括对所述内存碎片的相关信息进行告警。

7.如权利要求6所述的方法,其特征在于,以web系统的短消息方式、在网络设备的液晶屏上进行信息告警显示、通过控制终端的追踪信息以及记录日志的方式中一种或几种进行告警。

8.一种内存监控的装置,网络设备定期对自身内存使用情况信息进行采样,并将采样数据存放于结构体中,其特征在于,包括:预处理模块,用于选择监控的缓冲池,并设定监控周期,根据设定的监控周期从所述结构体中获取缓冲池的结构体变量参数值,其中所述结构体变量参数值用于记录所述缓冲池内存使用情况的相关信息;

确定模块,用于利用获取到的变量参数值计算得到相应的内存性能指标,并将得到的每个内存性能指标与设定的对应阈值进行比较,如果所述内存性能指标的任一项超过对应的阈值,则确定该缓冲池产生了内存碎片。

9.如权利要求8所述的装置,其特征在于,该装置还包括:

告警模块,用于对所述内存碎片的相关信息进行告警。

10.如权利要求8所述的装置,其特征在于,该装置还包括:

溯源模块,根据所述结构体中储存的缓冲池与使用内存的任务或模块的对应关系确定导致所述缓冲池产生内存碎片的任务或者模块。

11.如权利要求8所述的装置,其特征在于,所述预处理模块还用于当通过所述网络设备提供的外部接口选择监控任务或者模块的内存使用情况,则通过结构体中存储的任务或模块与缓冲池的对应关系确定需要监控的至少一个缓冲池;

则所述确定模块还用于在确定所述缓冲池中的任意一个产生了内存碎片之后,判定所述任务或模块出现了异常。

12.如权利要求8~11任一权项所述的装置,其特征在于,所述内存性能指标包括空闲内存块slab总数和/或活动内存块slab中空闲对象单元的占有率,则所述确定模块还用于:从所述结构体变量参数值中获取缓冲池中活动slab的总数和缓冲池中slab的总申请数,利用所述缓冲池中slab的总申请数减去活动slab的总数得到所述空闲slab总数;

从所述结构体变量参数值中获取半满slab中的空闲对象单元数,并用获取到的空闲对象单元数除以活动slab总数与每条slab所包含对象单元数的乘积得到所述活动slab中空闲对象单元的占有率。

说明书 :

一种内存监控的方法和装置

技术领域

[0001] 本发明涉及计算机嵌入式操作系统领域,尤其涉及一种内存监控的方法和装置。 背景技术
[0002] 在现有技术中计算机系统的内存不管容量有多大,均是有限的,因此优化内存管理有效地利用内存空间是一个非常关键的问题。
[0003] 现有技术中通常采用的内存管理的结构如图1所示,其中,内存管理通常采用双层管理的方式,具体包括:
[0004] 第一层管理:页分配器101将物理内存切割成一定长度的内核内存页,并管理该内核内存页,根据申请内存的实体的类别将系统中的内存划分到多个缓冲池中进行管理,在实际的应用环境中申请和使用内存的实体一般为任务和/或模块(简称为任务/模块)。 [0005] 第二层管理:Slab分配器102将缓冲池所包含的缓冲区划分为多个Slab(是一种N数据结构),Slab是由一个或多个(2)连续页(页为内存的单元)组成的slab链条,另外,每个slab所包含的多个连续页作为一个整体被分为多个对象单元(也可称为对象体)。 [0006] 对象单元是从特定缓存中进行内存分配和释放的基本元素,如开放最短路由优先协议(Open Shortest Path First,ospf)任务的路由公告一次内存申请就会占用Slab的多个对象单元;
[0007] 每个缓冲池中缓存的都是同类任务/模块申请的对象单元,并且缓冲池的主要目的是缓存,而不是预留内存。
[0008] 一个新建的缓冲池里面没有任何空闲对象单元,这时如果一个任务需要申 请内存,则对该任务对应的缓冲池发送一个分配新对象单元的请求,然后slab分配器为这个缓冲池分配一个新的slab,该任务则会分配到如图1A所示的对象单元1A01(对象单元大小是固定的,如1个内存页)。
[0009] 如图2所示,对象单元被全部占用或者是部分占用的slab称之为“活动的(Active)slab”,这部分slab正在被系统使用,如上图2所示的Full和Partial情形;空的slabs称之为不活动的,如图2所示的Empty情形,在该示意图中对象1占用两个slab的所有对象单元。
[0010] 对于Partial和Empty两种情形,即Slab中对象单元部分或者全部出现空闲,系统在分配内存时会出现如下问题:
[0011] 伴随着内存分配和释放的不断进行,空闲内存空间逐渐被拆分成了如图3所示的众多大小不均的小块,在某个任务/模块申请内存时,这些小块的总量可以满足一个请求,但是由于其不连续的缘故实际无法满足,这种内存申请失败的情况则称之为内存碎片问题。
[0012] 如果系统中经常出现申请内存失败,则会导致telnet应用无法进行登陆管理;控制台无法管理;ospf等路由协议任务无法为路由表项申请到内存空间,进一步会出现系统无法完成基本的数据转发任务等问题。
[0013] 为了解决内存碎片问题,目前网络设备系统都将内存使用情况信息存放在结构体中,同时还提供了内存信息查看接口,虽然各种设备输出信息的形式不完全一样,但都仅是信息的罗列,信息量相对比较庞大,其中列出了所有的任务内存使用情况、不同大小字节类型的使用情况、不同缓冲池使用情况,这种方法存在的缺点是:
[0014] (1)需要查看的信息量大,而且不直观。
[0015] (2)如图4所示,该方法在测试过程中,还需要不断地将内存信息通过可视化的方式输出,并查看和比对(在实际的应用中可以采用show memory命令将存放在结构体中的内存信息以列表的形式进行显示),对于相对复杂的信息输出,则需要将所述输出的内存信息进行综合核对。其中比对内容包括重点关注的字节数统计值,各个重点功能协议内存利用统计值,因为所需比对的项目相对较多所以很容易遗漏,另外因为显示的数据量大所以有可能需要观察的数据不在同一页面显示,从而造成观察面不齐备而且难以兼顾。

发明内容

[0016] 本发明实施例提供一种内存监控的方法和装置,能够及时有效的提供系统内存情况。
[0017] 本发明实施例提供一种内存监控的方法,网络设备定期对自身内存使用情况信息进行采样,并将采样数据存放于结构体中,包括:
[0018] 选择监控的缓冲池,并设定监控周期;
[0019] 根据设定的监控周期从所述结构体中获取任务或者模块对应缓冲池的结构体变量参数值,其中所述结构体变量参数值用于记录所述缓冲池内存使用情况的相关信息; [0020] 利用获取到的变量参数值计算得到相应的内存性能指标,并将得到的每个内存性能指标与设定的对应阈值进行比较,如果所述内存性能指标的任一项超过对应的阈值,则确定该缓冲池产生了内存碎片。
[0021] 针对上述方法,本发明实施例还提供一种内存监控的装置,网络设备定期对自身内存使用情况信息进行采样,并将采样数据存放于结构体中,包括:
[0022] 预处理模块,用于选择监控的缓冲池,并设定监控周期,根据设定的监控周期从所述结构体中获取缓冲池的结构体变量参数值,其中所述结构体变量参数值用于记录所述缓冲池内存使用情况的相关信息;
[0023] 确定模块,用于利用获取到的变量参数值计算得到相应的内存性能指标,并将得到的每个内存性能指标与设定的对应阈值进行比较,如果所述内存性能指标的任一项超过对应的阈值,则确定该缓冲池产生了内存碎片。
[0024] 本发明实施例通过交换机提供的外部接口获取缓冲池的结构体变量参数值并利用获取到的结构体变量参数值计算得到内存性能指标,并用该内存性能 指标与预设的阈值进行比较,从而判断系统是否存在内存碎片问题,通过本发明实施例提供的方法能够有效监控系统内存碎片现象,并且能够缩短内存碎片问题被发现的周期。 [0025] 附图说明
[0026] 图1为现有技术中内存管理的结构示意图;
[0027] 图1A为现有技术中slab和对象单元的关系示意图;
[0028] 图2为现有技术中缓冲池的结构示意图;
[0029] 图3为内存申请分割图示;
[0030] 图4为show memory命令部分显示效果图;
[0031] 图5为缓冲池与任务/模块的对应关系以及内存情况部分显示效果图; [0032] 图6为本发明实施例一种内存监控方法的流程图;
[0033] 图7为本发明实施例一种内存监控装置的装置图。
[0034] 具体实施方式
[0035] 本发明实施例一种监控内存的方法首先通过所述网络设备提供的外部接口选择监控的缓冲池,并设定监控周期;根据设定的监控周期从所述结构体中获取所述缓冲池的结构体变量参数值,其中所述结构体变量参数值用于记录所述缓冲池内存使用情况的相关信息;利用获取到的变量参数值计算得到相应的内存性能指标,并将得到的每个内存性能指标与设定的对应阈值进行比较,如果所述内存性能指标的任一项超过对应的阈值,则确定该缓冲池产生了内存碎片。
[0036] 下面结合说明书附图对本发明实施例进行详细说明,如图6所示,本发明实施例一种内存监控的方法,具体包括:
[0037] 步骤601,在所述网络设备中设置外部接口,并通过该外部接口选择需要监控的缓冲池,并设定监控周期,定期从结构体中获取所述缓冲池相关的结构体变量参数值,所述结构体变量参数值是定期对缓冲池的使用情况信息进行采样所获取到的参数值。 [0038] 其中,设定需要监控的缓冲池以及监控周期是通过交换机上提供的外部接口实现的,所述外部接口是交换机设备所提供的一些命令接口,并且外部可视,如:“monitor[memory|cpu|skb|...][OSPF|BGP|LDP|NSM|...][[64|128|256...]time Long”。 [0039] 进一步,还可以通过该接口选择监控哪种系统资源、监控那种任务或模块、监控哪个任务的哪种字节数、任务参数为OSPF等、内存部分监控还有字节数的选项、设置抽样监控时间间隔、能够设定多久输出一次比较结果。
[0040] 在本发明实施例中,任务/模块在申请内存时可能因为所申请内存类型或大小的不同,从而使得所申请到的内存被划分到不同的缓冲池。
[0041] 因为某个任务/模块申请的内存有可能被划分在多个缓冲池中,所以当用户通过接口设定监控某个任务/模块时,首先需要先从结构体中获取该任务/模块对应的缓冲池,然后再从结构体中分别获取这些缓冲池对应的结构体变量参数值。
[0042] 所述结构体变量在交换机设备内部保存形式如下所示(以下仅列出了部分重要内容,其他变量未列出):
[0043] struct cache_s{
[0044] unsigned int slab中的对象大小;
[0045] unsigned int slab总数;
[0046] unsigned int full的slab数;
[0047] unsigned int patial的slab数;
[0048] unsigned int slab中的对象数;
[0049] unsigned int patial中使用的对象数;
[0050] struct_list head 满slab链表;
[0051] struct_list head 半满slab链表;
[0052] struct list_head空闲slab链表;
[0053] };
[0054] 步骤602,利用所述结构体变量参数值通过一定的公式计算得到内存性能指标,将得到的内存性能指标与预设的阈值进行比较,如果所述内存性能指标的任一项超过预设的阈值,则确定该模块对应的缓冲池产生了内存碎片问题,并转入步骤603,其中每一项内存性能指标都有一个对应的阈值。
[0055] 进一步,若选择的是监控某个任务/模块则在确定监控的缓冲池中的任意一个产生了内存碎片,则确定该任务/模块出现了异常。
[0056] 其中所述内存性能指标体现任务/模块所对应缓冲器的内存使用情况,其中包括空闲slab总数、活动slab中空闲对象单元的占有率:
[0057] 其中空闲slab总数:通过网络设备系统上提供的内存信息查看接口,获取缓冲池中活动slab的数量(active)以及缓冲池中的总申请数(number),然后根据公式得到未有效使用的slab数(N):该公式为N=number-active=(slab总数)-(full的slab数)-(patial的slab数)。
[0058] 如图4所示,在现有技术中获取该指标时必须统计图4中“slabs”下的“active”既是指缓冲池中活动的slab,“number”指slab的总共申请数,然后根据公式N=number-active=(slab总数)-(full的slab数)-(patial的slab数)得到未有效使用的slab数。
[0059] 活动slab中空闲对象单元的占有率:从所述结构体变量参数值中获取半满slab中的空闲对象单元数,并用获取到的空闲对象单元数除以活动slab总数与每条slab所包含对象单元数的乘积得到所述活动slab中空闲对象单元的占有率。
[0060] 分别将当前获取到的空闲slab总数和活动slab中空闲对象单元的占有率与预设的对应阈值进行比较,任何一项超过阈值都认为被监控任务/模块所对应的缓冲池使用异常。
[0061] 其中,所述阈值是经验参考值,在设定所述缓冲池的各阈值时,根据所述 缓冲池对应的任务或模块在运行过程中对内存的申请量、申请频度和该任务或者模块的功能重要性。
[0062] 例如:SK_DATA模块在网络环境中相对比较重要,其用于收发报文,因此经常会出现申请与释放的行为。在大型网络中(即用户数量,网络路由数量在100K左右和数据流量在几十G左右)存在较多ARP等攻击报文的恶劣条件下,通常该模块所对应的cache中空的Slab数正常会维持在1900的数值以下,另外需要留出一定的余量,防止瞬间峰值导致系统误判,所以将Empty slab总数定义为:2000个。
[0063] 进一步,根据长期使用的经验值得到Partial中空闲对象单元百分比N3在30%(因为,满、半满、空闲三者之间会随申请情况相互转化,但需要保持整体的较高合理利用率)以下,因此该缓冲池就分别定义这两个值为阈值;而tcp_open_request则使用较少,需要进行限制,则根据实际操作内存频繁度定义空闲slab总数阈值为20,Partial中空闲对象数为30%。
[0064] 为了找到导致内存产生内存碎片问题的任务/模块,本发明实施例还包括步骤603:
[0065] 步骤603,根据所述结构体中储存的缓冲池与各任务或模块的对应关系确定导致所述缓冲池产生内存碎片的任务或者模块。
[0066] 当确定上述两种内存性能指标的任何一项超过预设的阈值(每一个任务都有一个对应的阈值),则结合结构体中储存的缓冲池与任务或者模块对应关系的信息判断是哪些任务/模块导致内存碎片问题。
[0067] 如初步判定是“ARP_table”缓冲池(其他类似处理)异常后,找出导致内存碎片的具体使用模块,结合图5所示(图5是通过列表的形式将缓冲池与任务/模块的对应关系以及内存情况输出),找出导致内存碎片的具体使用模块,找到ARP_table行中参数值非0的任务/模块,找到导致内存碎片的模块bgpd、ef_res和tnet,由于图5只截取了部分,后续可能还有使用ARP_table缓冲池的任务/模块产生内存碎片(如paramter等)。 [0068] 为了使用户获知系统中出现的内存碎片问题,本发明实施例还包括: [0069] 步骤604,对所述内存碎片问题的相关信息进行告警。
[0070] 在不同的系统中可以采取不同的告警方式,在本发明实施例中告警的方式包括: [0071] 根据设定的告警方式和格式进行告警、以web系统的短消息方式、在网络设备的液晶屏上进行信息告警显示、通过各控制终端的追踪(trap)信息以及记录日志(log)的形式等方式。可以选择多个形式并存的方式进行告警。另外在告警信息中可以给出申请非法或者申请超过预定阈值,内存申请异常,当前值是多少等信息。
[0072] 在本发明实施例中步骤603可以设置在告警之前也可设置在告警之后。 [0073] 因为网络设备定期对自身内存使用情况信息进行采样,并将采样数据存放于结构体中,针对上述方法本发明实施例还提供一种内存监控的装置,如图7所示,包括预处理模块701、确定模块702:
[0074] 预处理模块701,用于选择监控的缓冲池,并设定监控周期,根据设定的监控周期从所述结构体中获取所述缓冲池的结构体变量参数值,其中所述结构体变量参数值用于记录所述缓冲池内存使用情况的相关信息。
[0075] 确定模块702,用于利用获取到的变量参数值计算得到相应的内存性能指标,并将得到的每个内存性能指标与设定的对应阈值进行比较,如果所述内存性能指标的任一项超过对应的阈值,则确定该缓冲池产生了内存碎片;
[0076] 其中,所述内存性能指标包括空闲slab总数和/或活动slab中空闲对象单元的占有率,则所述确定模块702还用于:
[0077] 从所述结构体变量参数值中获取缓冲池中活动slab的总数和缓冲池中slab的总申请数,利用所述缓冲池中slab的总申请数减去活动slab的总数得到所述空闲slab总数;
[0078] 从所述结构体变量参数值中获取半满slab中的空闲对象单元数,并用获取到的空闲对象单元数除以活动slab总数与每条slab所包含对象单元数的乘积得到所述活动slab中空闲对象单元的占有率。
[0079] 为了便于用户尽快地获知系统中出现的内存碎片问题,本发明实施例还包括告警模块703:
[0080] 告警模块703,用于对所述内存碎片的相关信息进行告警。
[0081] 该告警模块703还用于以web系统的短消息方式、在网络设备的液晶屏上进行信息告警显示、通过各控制终端的TRAP信息以及记录LOG的方式中一种或几种进行告警。 [0082] 进一步,为了便于找到导致缓冲池出现内存碎片问题的任务/模块,该装置还包括:
[0083] 溯源模块704,根据所述结构体中储存的缓冲池与使用内存的任务或模块的对应关系确定导致所述缓冲池产生内存碎片的任务或者模块。
[0084] 其中,所述预处理模块还用于当选择监控任务或者模块的内存使用情况时,通过结构体中存储的任务或模块与缓冲池的对应关系确定需要监控的至少一个缓冲池; [0085] 则所述确定模块还用于在确定所述缓冲池中的任意一个产生了内存碎片之后,判定所述任务或模块出现了异常。
[0086] 用户在接收到告警信息之后,可以调用网络设备内存回收接口进行内存碎片整理与回收。
[0087] 通过本发明实施例所述提供的方法和装置,能够有效监控系统内存碎片现象和大大缩短问题发现周期,同时还能够结合结构体中储存的信息确定导致缓冲池产生内存碎片的任务/模块。
[0088] 本方法不需要借助外部测试设备,由被测设备系统实现,有效的减低了测试成本。 [0089] 进一步,本发明所提供的方法和装置在发现系统中存在内存碎片问题后采取告警,从而能够及时、直观、形象告知用户系统中的哪些任务模块、哪些字节出现了内存碎片,使得系统用户能够根据判断结果采取措施,如触发内存回 收模块进行碎片整理与回收。 [0090] 本发明所述的方法并不限于具体实施方式中所述的实施例,本领域技术人员根据本发明的技术方案得出其它的实施方式,同样属于本发明的技术创新范围。显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。