一种内存分配的方法及装置与流程

文档序号:12157661阅读:184来源:国知局
一种内存分配的方法及装置与流程

本发明实施例涉及内存分配的技术领域,尤其涉及一种内存分配的方法及装置。



背景技术:

Memcached根据请求对象的大小,将内存分配给相应的slab类。一旦Memcached中所有可用内存全部分配出去,当由于请求分布发生变化而导致内存重分配时问题就产生了,简称为钙化问题(Calcification),即Memcached中所有slab类的个数比例已经固定,无法根据变化的外部请求动态调整。如果Memcached需要存储的对象的大小分布情况不随着时间发生变化,那么钙化问题不会影响Memcached的性能,因为Memcached中已经实现的基本换出策略可以很好地保证存储热对象。然而,如果存储对象的大小分布情况随时在变化,使得钙化问题对Memcached的命中率有较大影响。

解决Memcached钙化问题的直接方法是允许Memcached将已经分配出去的内存进行回收和重新分配给需要的slab类。数据压缩加剧了Memcached的钙化问题。在Memcached启动数据压缩功能的时候,不仅会在被压缩的slab类中留下的空间无法归还给Memcached,而且会对压缩后存入的slab类造成较大的压力。在添加了数据压缩功能的Memcached中,尽管数据压缩给Memcached带来了不同的性能提升效果,但是也加剧了Memcached的钙化问题。



技术实现要素:

本发明实施例的目的在于提出一种内存分配的方法及装置,旨在解决添加了数据压缩功能的Memcached中的钙化问题。

为达此目的,本发明实施例采用以下技术方案:

第一方面,一种内存分配的方法,所述方法包括:

获取每个slab类的信息,所述信息包括已使用对象数量、请求数量、对象总数和换出数量;

根据预先设置的最小影响因子选择算法和所述信息计算每个slab类的影响因子;

将影响因子最小的slab类选取为源slab类,将一段时间内换出数量最多的slab设置为目的slab;

将所述源slab类中的一个slab内存清空回收后重分配给所述目的slab。

优选地,所述根据预先设置的最小影响因子选择算法和所述信息计算每个slab类的影响因子,包括:

其中,所述used_chunks表示所述特定slab类中已使用对象数量,所述request表示所述特定slab类中一段时间内的请求数量,所述total_chunks表示所述特定slab类中的对象总数。

优选地,所述将所述源slab类中的一个slab内存清空回收后重分配给所述目的slab,包括:

获取所述源slab类中空闲空间数量最大的slab;

清空所述源slab类中空闲空间数量最大的slab内存,并将清空后的内存回收后重新分配到所述目的slab。

优选地,所述方法还包括:

将Memcached中已使用的空间和未使用的空间区别对待,将已使用的区域集中于slab前端,将未使用的区域集中于slab后端。

优选地,所述方法还包括:

在每个slab类中的每个slab的前端设置有用于指定该slab的范围的三个指针,所述三个指针包括用于标识slab中第一个存储对象的指针slab_start、用于标识slab中最后一个存储对象的指针slab_end、用于标识slab中当前可用存储对象的指针cur_free。

第二方面,一种内存分配的装置,其特征在于,所述装置包括:

获取模块,用于获取每个slab类的信息,所述信息包括已使用对象数量、请求数量、对象总数和换出数量;

选择模块,用于根据预先设置的最小影响因子选择算法和所述信息计算每个slab类的影响因子;

选取模块,用于将影响因子最小的slab类选取为源slab类,将一段时间内换出数量最多的slab设置为目的slab;

分配模块,用于将所述源slab类中的一个slab内存清空回收后重分配给所述目的slab。

优选地,所述选择模块,包括:

其中,所述used_chunks表示所述特定slab类中已使用对象数量,所述request表示所述特定slab类中一段时间内的请求数量,所述total_chunks表示所述特定slab类中的对象总数。

优选地,所述分配模块,用于:

获取所述源slab类中空闲空间数量最大的slab;

清空所述源slab类中空闲空间数量最大的slab内存,并将清空后的内存回收后重新分配到所述目的slab。

优选地,所述装置还包括:

调整模块,用于将Memcached中已使用的空间和未使用的空间区别对待,将已使用的区域集中于slab前端,将未使用的区域集中于slab后端。

优选地,所述装置还包括:

设置模块,在每个slab类中的每个slab的前端设置用于指定该slab的范围的三个指针,所述三个指针包括用于标识slab中第一个存储对象的指针slab_start、用于标识slab中最后一个存储对象的指针slab_end、用于标识slab中当前可用存储对象的指针cur_free。

本发明实施例提供一种内存分配的方法及装置,所述方法通过获取每个slab类的信息,所述信息包括已使用对象数量、请求数量、对象总数和换出数量;根据预先设置的最小影响因子选择算法和所述信息计算每个slab类的影响因子;将影响因子最小的slab类选取为源slab类,将所述一段时间内换出数量最多的slab设置为目的slab;将所述源slab类中的一个slab内存清空回收后重分配给所述目的slab,提出最小影响因子选择算法,综合考虑压缩情况下的存储数据的特征,合理选择恰当的源slab类和目的slab进行回收和重分配;调整Memcached的内存分配机制,根据slab存储状态空、满等有效地划分了区域,当需要内存的时候从末尾空闲的slab开始回收。

附图说明

图1是本发明实施例提供的一种内存分配的方法的流程示意图;

图2是本发明实施例提供的一种内存分配的方法的另一流程示意图;

图3是本发明实施例提供的一种空间分配的方法示意图;

图4是本发明实施例提供的另一种空间分配的方法示意图;

图5是本发明实施例提供的一种内存分配的指针结构示意图;

图6是本发明实施例提供的一种内存分配前后的钙化问题对比示意图;

图7是本发明实施例提供的一种内存分配的装置的功能模块示意图。

具体实施方式

下面结合附图和实施例对本发明实施例作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明实施例,而非对本发明实施例的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明实施例相关的部分而非全部结构。

参照图1,图1是本发明实施例提供的一种内存分配的方法的流程示意图。

在图1中,所述内存分配的方法包括:

步骤101,获取每个slab类的信息,所述信息包括已使用对象数量、请求数量、对象总数和换出数量;

具体的,由于在Memcached中新增了数据压缩功能,Memcached中存储对象的数据特征发生变化。从压缩数量、请求数量以及对象总数的角度,提出了最小影响因子选择算法。影响因子(Impact factor,IF)是综合压缩数量、请求数量以及对象总数对slab回收过程的影响得到的一个指标。

步骤102,根据预先设置的最小影响因子选择算法和所述信息计算每个slab类的影响因子;

优选地,所述根据预先设置的最小影响因子选择算法和所述信息计算每个slab类的影响因子,包括:

其中,所述used_chunks表示所述特定slab类中已使用对象数量,所述request表示所述特定slab类中一段时间内的请求数量,所述total_chunks表示所述特定slab类中的对象总数。

具体的,影响因子越小,说明该slab越适合作为源slab类提供内存。

步骤103,将影响因子最小的slab类选取为源slab类,将一段时间内换出数量最多的slab设置为目的slab;

具体的,收集每个slab类的已经使用对象数量、请求数量、对象总数以及换出数量。对每个slab类计算影响因子,从中选出一个影响因子最小的slab类作为源slab类。从slab类中选取换出数量最多(频繁)的slab类作为目的slab。

步骤104,将所述源slab类中的一个slab内存清空回收后重分配给所述目的slab。

优选地,所述将所述源slab类中的一个slab内存清空回收后重分配给所述目的slab,包括:

获取所述源slab类中空闲空间数量最大的slab;

清空所述源slab类中空闲空间数量最大的slab内存,并将清空后的内存回收后重新分配到所述目的slab。

其中,内存空间为固定大小为1M大小的内存。

具体的,参考图2,图2是本发明实施例提供的一种内存分配的方法的另一流程示意图。

步骤201,若判断slab需要回收和重分配,则选出源slab类;

步骤202,选出目的slab;

步骤203,判断是否进行slab回收和重分配;

步骤204,若判断slab不需要回收和重分配,则判断选出的slab类是否有效;

步骤205,若选出的slab类有效,则进行slab回收和重分配工作。

优选地,所述方法还包括:

将Memcached中已使用的空间和未使用的空间区别对待,将已使用的区域集中于slab前端,将未使用的区域集中于slab后端。

具体的,将图3中Memcached已经使用的空间和空闲的空间区分对待,即将占用区域集中于slab的前端而将空闲区域集中于slab的后端。当发生钙化问题的时候,优先对后端区域进行内存回收和重分配。

图4是修改后Memcached的slab分配器示意图,不仅将已经占用区域集中于前端,而且各slab之间指针更加规整,有利于在回收内存的时候进行链表的断链操作。在Memcached回收内存的时候,会将选中的slab存储的对象清空,重新切分为其他尺寸的小块。清空对象的操作会在一定程度上影响Memcached的命中率,使用图4所示的slab分配器结构可以降低这种影响。

优选地,所述方法还包括:

在每个slab类中的每个slab的前端设置有用于指定该slab的范围的三个指针,所述三个指针包括用于标识slab中第一个存储对象的指针slab_start、用于标识slab中最后一个存储对象的指针slab_end、用于标识slab中当前可用存储对象的指针cur_free。

具体的,参考图5所示,图5是本发明实施例提供的一种内存分配的指针结构示意图。图5是具体的修改方法,除了在slab结构体中添加如图所示的3个指针,还需要在内存分配函数中添加相应的处理代码。

参考图6,图6是本发明实施例提供的一种内存分配前后的钙化问题对比示意图。图6中的灰色虚线是实验效果,从中可以看到从请求类型A过渡到请求类型B,钙化问题下的命中率的改善有明显改善,这种方案有效地改善了Memcached在压缩情况下由钙化导致的命中率下降的问题。灰色曲线是压缩情况下受钙化影响的Memcached的命中率曲线。

本发明实施例提供一种内存分配的方法,所述方法通过获取每个slab类的信息,所述信息包括已使用对象数量、请求数量、对象总数和换出数量;根据预先设置的最小影响因子选择算法和所述信息计算每个slab类的影响因子;将影响因子最小的slab类选取为源slab类,将所述一段时间内换出数量最多的slab设置为目的slab;将所述源slab类中的一个slab内存清空回收后重分配给所述目的slab,提出最小影响因子选择算法,综合考虑压缩情况下的存储数据的特征,合理选择恰当的源slab类和目的slab进行回收和重分配;调整Memcached的内存分配机制,根据slab存储状态空、满等有效地划分了区域,当需要内存的时候从末尾空闲的slab开始回收。

参考图7,图7是本发明实施例提供的一种内存分配的装置的功能模块示意图。

在图7,所述内存分配的装置包括:

获取模块701,用于获取每个slab类的信息,所述信息包括已使用对象数量、请求数量、对象总数和换出数量;

选择模块702,用于根据预先设置的最小影响因子选择算法和所述信息计算每个slab类的影响因子;

优选地,所述选择模块702,包括:

其中,所述used_chunks表示所述特定slab类中已使用对象数量,所述request表示所述特定slab类中一段时间内的请求数量,所述total_chunks表示所述特定slab类中的对象总数。

选取模块703,用于将影响因子最小的slab类选取为源slab类,将一段时间内换出数量最多的slab设置为目的slab;

分配模块704,用于将所述源slab类中的一个slab内存清空回收后重分配给所述目的slab。

优选地,所述分配模块704,用于:

获取所述源slab类中空闲空间数量最大的slab;

清空所述源slab类中空闲空间数量最大的slab内存,并将清空后的内存回收后重新分配到所述目的slab。

优选地,所述装置还包括:

调整模块,用于将Memcached中已使用的空间和未使用的空间区别对待,将已使用的区域集中于slab前端,将未使用的区域集中于slab后端。

优选地,所述装置还包括:

设置模块,用于在每个slab类中的每个slab的前端设置用于指定该slab的范围的三个指针,所述三个指针包括用于标识slab中第一个存储对象的指针slab_start、用于标识slab中最后一个存储对象的指针slab_end、用于标识slab中当前可用存储对象的指针cur_free。

本发明实施例提供一种内存分配的装置,通过获取每个slab类的信息,所述信息包括已使用对象数量、请求数量、对象总数和换出数量;根据预先设置的最小影响因子选择算法和所述信息计算每个slab类的影响因子;将影响因子最小的slab类选取为源slab类,将所述一段时间内换出数量最多的slab设置为目的slab;将所述源slab类中的一个slab内存清空回收后重分配给所述目的slab,提出最小影响因子选择算法,综合考虑压缩情况下的存储数据的特征,合理选择恰当的源slab类和目的slab进行回收和重分配;调整Memcached的内存分配机制,根据slab存储状态空、满等有效地划分了区域,当需要内存的时候从末尾空闲的slab开始回收。

以上结合具体实施例描述了本发明实施例的技术原理。这些描述只是为了解释本发明实施例的原理,而不能以任何方式解释为对本发明实施例保护范围的限制。基于此处的解释,本领域的技术人员不需要付出创造性的劳动即可联想到本发明实施例的其它具体实施方式,这些方式都将落入本发明实施例的保护范围之内。

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