Memcached内存分配_第1页
Memcached内存分配_第2页
Memcached内存分配_第3页
Memcached内存分配_第4页
Memcached内存分配_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Memcached 内存分配December 2010目录第1章 前言. 2第2章 slab 机制 . 2第3章 启动参数 . . 23.1 -m . 33.2 M . 33.3 f . 33.4 n . 33.5 L . . 33.6 I. 3第4章 详细逻辑 . . 34.1 初始化slab class. 34.2 申请资源. 44.3 释放资源. 6第5章 内存分配的其它问题 . . 65.1 LRU策略 . 6第1章 前言文章比较短,但主要的内存分配问题已经分析的很清楚了,需要更详细了解,请顺着文章阅读一下源代码即可。第2章 slab 机制slab 是Memcached 用来存放ite

2、m 的一种机制,如下图所示: slab class可以被看做一个没有底的桶,后面我们简称为class ,class 本身没有大小的概念,只有页数,每页默认不超过1M ,因此一个class 就是一个多页集合,每页里存放着chunk ,不同class 的页大小是一致的,但chunk 的大小是不一致的,默认情况下 class 1的chunk 大小是96字节,class 42的chunk 大小是1M ,因此不同class 里的page 能容纳的chunk 单元数不同,class 1每页可以放1万个单元,class 每页只能放1个单元,所有class 所分配的内存总数不能超过默认64M ,也就是启动项中

3、的-m 参数,当已经没有更多的内存可以分配的时候,memcached 开始进行LRU 处理,淘汰已经过期的内容。不同class 之间的chunk 大小是依据factor 来计算的,默认值是1.25,也就是下一个class 的chunk 大小是上个class 的1.25倍。第3章 启动参数mamcached 中有一些与内存分配有关的参数,我们进行一下介绍。3.1 -m可使用内存的总大小,当达到这个值的时候,memcached 开始启用LRU 淘汰内容,默认是64m ,这是一般系统都需要设置的值。3.2 M禁用LRU 机制,当内存耗尽的时候不淘汰旧内容。3.3 f增长因子默认值1.25,增长因子越

4、小class 分配的越多,增长因子设置的越大class 越少。3.4 n可以被看做是chunk 的最小值,默认值是48字节,但由于chunk 本身的数据结构也是48字节,所以最小chunk 大小就变成了96字节,总是比你想分配的要大48字节。3.5 L尝试一次性申请-m 中规定的最大内存,所有未来的内存开销都基于这块内存,而不在向系统中进行分配。3.6 I每个slab page的大小,默认是1M ,最大可以设置为128M ,因此chunk 的大小是在-n 与-I 参数之间依据-f 参数进行增长。第4章 详细逻辑4.1 初始化slab classslabs_init(settings.maxby

5、tes, settings.factor, preallocate;maxbytes 等价于 m 指定的内存分配最大值,factor 等价于-f 参数, preallocate 等价于-L 参数,下面为初始化过程的描述如果设置了-L 参数尝试一次性申请maxbytes 大小的内存,指针保存到全局的mem_base变量里,未来所有内存申请实际上是从这块内存区域中调配的。初始化slabclass ,用于维护所有slab class信息,默认情况下一次性初始化为200个,并且class 的最大数量也是200个。计算每个class 中的chunk 尺寸,计算每个page 可以容纳的chunk 数量,也

6、就是perslab (每页可容纳的chunk 数量),如果-I 指定的大小为1M ,chunk 的尺寸为500K ,那么perslab 的值是2,如果chunk 的尺寸是600K 或700K ,那么perslab 的值只能是1。在初始化的过程当中,并没有为每个class 预分配任何内容,只是预算了不同class 的结构信息,除非你去掉了源代码中的DONT_PREALLOC_SLABS宏定义,这时候在初始化的时候就会为每个class 先分配16页的空间,代码如下: static int grow_slab_list (const unsigned int id slabclass_t *p =

7、&slabclassid;if (p->slabs = p->list_size size_t new_size = (p->list_size != 0 ? p->list_size * 2 : 16;void *new_list = realloc(p->slab_list, new_size * sizeof(void *;if (new_list = 0 return 0;p->list_size = new_size;p->slab_list = new_list;return 1;当第一次分配的时候一次性分配16页,未来每次满了按照

8、原有规模的2倍进行扩张。4.2 申请资源前端每次提交不同大小的数据,因此首先要确认这些数据需要归属到那个桶里进行存放,轮询每个桶的chunk ,返回class 的idunsigned int slabs_clsid(const size_t size int res = POWER_SMALLEST;if (size = 0return 0;while (size > slabclassres.sizeif (res+ = power_largest /* won't fit in the biggest slab */return 0;return res;申请过程涉及到两个函

9、数,一个函数用于从class 里分配空闲的chunk ,一个函数用于申请新的slab page。static void *do_slabs_alloc(const size_t size, unsigned int id;static int do_slabs_newslab(const unsigned int id;当无法从do_slabs_newslab(中分配出新的空间,导致do_slabs_alloc(也只能返回NULL 的时候,memcached 进行LRU 淘汰。Memcached 里的函数由于线程安全的问题,所以都是两个样子do_slabs_alloc(对应slabs_allo

10、c(函数,区别在于后者是线程安全的。/* Could not find an expired item at the tail, and memory allocation* failed. Try to evict some items!*/tries = 50;/* If requested to not push old items out of cache when memory runs out,* we're out of luck at this point.*/if (settings.evict_to_free = 0 itemstatsid.outofmemory+

11、;return NULL;/* try to get one off the right LRU* don't necessariuly unlink the tail because it may be locked: refcount>0 * search up from tail an item with refcount=0 and unlink it; give up after 50 * tries */ 这是 do_item_alloc(函数中的一段,当无法从现有 chunk 中找到过期内容同时无法从 class 里继续分配新的 chunk,这时候尝试 LRU 过程,先删过期内容,如果还无法分配,就开 始删最近的内容。 4.3 释放资源 无论是通过 LRU 策略还是通过其它主动淘汰策略, 都需要标记 refcount = (引用计数) 0 , 然后才会通过 do_slabs_free(释放资源,等待其它资源申请的时候使用。 第5章 内存分配的其它问题 5.1 LRU 策略 分三次淘汰内容,当为新的内容申请资源的时

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论