第十一章 Memcached内存分配.pdf

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Memcached 内存分配 / 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,那么perslab 的值只能是1

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档