- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Memcached 内存分配与SLAB 机制
/
December 2010
目录
第1 章 前言2
第2 章 slab 机制2
第3 章 启动参数2
3.1 -m 3
3.2 –M 3
3.3 –f 3
3.4 –n 3
3.5 –L3
3.6 –I3
第4 章 详细逻辑3
4.1 初始化slab class3
4.2 申请资源4
4.2.1 确认class id 4
4.2.2 申请chunk5
4.2.3 线程安全5
4.2.4 LRU 5
4.3 释放资源6
第5 章 内存分配的其它问题6
5.1 LRU 策略6
第1章 前言
文章比较短,但主要的内存分配问题已经分析的很清楚了,需要更详细了解,请顺着文
章阅读一下源代码即可。
第2章 slab 机制
slab 是Memcached 用来存放item 的一种机制,如下图所示:
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,也就是启动项中的-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,增长因子越小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 class
slabs_init(settings.maxbytes, settings.factor, preallocate);
maxbytes 等价于 –m 指定的内存分配最大值,factor 等价于-f 参数, preallocate 等价
于-L 参数,下面为初始化过程的描述
如果设置了-L 参数尝试一次性申请maxbytes 大小的内存,指针保存到全局的mem_base
变量里,未来所有内存申请实际上是从这块内存区域中调配的。
初始化slabclass,用于维护所有slab class 信息,默认情况下一次性初始化为200 个,
并且class 的最大数量也是200 个。
计算每个class 中的chunk 尺寸,计算每个page 可以容纳的chunk 数量,也就是perslab
(每页可容纳的chunk 数量),如果-I 指定的大小为1M,chunk 的尺寸为500K,那么perslab
的值是2,如果chunk 的尺寸是600K 或700K,那么persla
文档评论(0)