简单理解Memcached的Slab Allocation

转载 2015年11月20日 11:18:48

Memcached利用Slab Allocation机制来分配和管理内存。传统的内存管理方式是:使用完通过malloc分配的内存后通过free来回收内存。这种方式容易产生内存碎片并降低操作系统对内存的管理效率。Slab Allocation机制不存在这样的问题,它按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,这些内存块不会释放,可以重复利用。

Memcached服务器端保存着一个空闲的内存块列表,当有数据存入时根据接收到的数据大小,分配一个能存下这个数据的最小内存块。这种方式有时会造成内存浪费,例如:将一个200字节的数据存入一个300字节的内存块中,会有100字节内存被浪费掉,不能使用。避免浪费内存的办法是,预先计算出应用存入的数据大小,或把同一业务类型的数据存入一个Memcached服务器中,确保存入的数据大小相对均匀,这样就可以减少对内存的浪费。还有一种办法是,在启动时指定“-f”参数,能在某种程度上控制内存组之间的大小差异。在应用中使用Memcached时,通常可以不重新设置这个参数,使用默认值1.25进行部署。如果想优化Memcached对内存的使用,可以考虑重新计算数据的预期平均长度,调整这个参数来获得合适的设置值。

Slab Allocation的原理——将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab。

Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过-I参数来指定。

Slab是由多个Page组成的,Page按照指定大小切割成多个chunk。其结构图如下:

Memcache's slab page and chunk

Growth Factor

memcached在启动时通过-f选项可以指定 Growth Factor因子。该值控制slab之间的差异,chunk大小的差异。默认值为1.25。

通过memcached-tool查看指定memcached实例的不同slab状态,可以看到各Item所占大小(chunk大小)差距为1.25

Memcache Slab Growth Factor

Slab Allocation的缺点

Slab Allocation可以有效的解决内存碎片问题,但是在如下情况下,会导致内存的浪费:

  1. 每个slab的chunk大小是固定的,当item的占用空间实际小于chunk大小时,会出现内存浪费
  2. 每个slab的大小是固定的(因为page是固定的),当slab不能被他所拥有的chunk整除时,会出现内存浪费
  3. 按照Growth Factor因子生成指定大小的slab,而某slab id根本未被使用时,会出现内存浪费

参考资料

memcached全面剖析–2.理解memcached的内存存储
Memcache内存分配策略
Memcached二三事儿

转至:http://www.xiaoxiaozi.com/2013/04/29/2432/


简单理解Memcached的Slab Allocation

Slab Allocation Slab Allocation的原理——将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为sla...
  • whycold
  • whycold
  • 2013年10月09日 17:54
  • 4854

Linux slab

转载至http://www.cnblogs.com/xuczhang/archive/2010/04/02/1703363.html 本文将介绍Linux的slab层,首先我们要解决一个...

memcached-内存管理机制slab allocator

前端时间大致浏览了一下memcached的源码,但是并没有对相关的知识点进行总结和记录,所以很快就忘了,这次打算将memcached的源码再学习一遍,并进行总结归纳。     memcached...

memcached源码学习-内存管理机制slab allocator

前端时间大致浏览了一下memcached的源码,但是并没有对相关的知识点进行总结和记录,所以很快就忘了,这次打算将memcached的源码再学习一遍,并进行总结归纳。     memcached模块...
  • tankles
  • tankles
  • 2011年11月30日 22:01
  • 3140

memcached源码分析-----slab内存分配器

转载请注明出处:         温馨提示:本文用到了一些可以在启动memcached设置的全局变量。关于这些全局变量的含义可以参考《memcached启动参数详解》。对于这些全局变量,处理方...

memcached源码分析-----slab automove和slab rebalance

转载请注明出处: 需求:         考虑这样的一个情景:在一开始,由于业务原因向memcached存储大量长度为1KB的数据,也就是说memcached服务器进程里面有很多大小为...

Memcached源码分析之内存管理篇之item结构图及slab结构图

.Memcached源码分析之内存管理篇 博客分类: linuxc  . 使用命令 set(key, value) 向 memcached 插入一条数据, memcached 内部是如何组织数据呢...

简单理解Memcached的Slab Allocation

Slab Allocation Slab Allocation的原理——将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为sla...

memcached_allocator_slab_langwan

  • 2012年08月22日 16:54
  • 700KB
  • 下载

深入Memcached内部 --- slab内存分配

1.slab内存结构图:二维数组链表 slab是一次申请内存的最小单位 2.slab内存分配实例 3.实例数据                  4.计算slab占用内...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单理解Memcached的Slab Allocation
举报原因:
原因补充:

(最多只允许输入30个字)