设为首页 收藏本站
查看: 1103|回复: 0

[经验分享] memcached内存分配原理及相应源码解析

[复制链接]

尚未签到

发表于 2015-9-2 12:59:24 | 显示全部楼层 |阅读模式
  memcached默认情况下是采用Slab Allocator的机制分配、管理内存,此原理相当简单,将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合),如下图(借鉴于《memcached全面剖析》):

  
  关于此块的初始化逻辑划分的源码在memcached.c文件中:
  
  void slabs_init(const size_t limit, const double factor, const bool prealloc) {
  ……//此处省略很多行
  
       while (++i < POWER_LARGEST && size <= settings.item_size_max / factor) {
  
           if (size % CHUNK_ALIGN_BYTES)
               size += CHUNK_ALIGN_BYTES - (size % CHUNK_ALIGN_BYTES);
  
           slabclass.size = size;
           slabclass.perslab = settings.item_size_max / slabclass.size;
           size *= factor;
           if (settings.verbose > 1) {
               fprintf(stderr, "slab class %3d: chunk size %9u perslab %7u\n",
                       i, slabclass.size, slabclass.perslab);
           }
       }
  
       power_largest = i;
       slabclass[power_largest].size = settings.item_size_max;
       slabclass[power_largest].perslab = 1;
  ……//此处省略很多行
  }
  如上面的代码部分,POWER_LARGEST表示的是可以分配的chunk组数,默认的是200;settings.item_size_max是表示最大的item大小,也即chunk块的默认最大值,默认值是1024* 1024,这两个值都是直接写死在程序里,没有配置文件可供配置。 factor是chunk大小的增长因子,在启动memcached的时候有-f参数来指定。
  上边size的大小初始化为size = sizeof(item) + settings.chunk_size;(其中 settings.chunk_size默认为48),所以从下面的代码:
              if (size % CHUNK_ALIGN_BYTES)
                   size += CHUNK_ALIGN_BYTES - (size % CHUNK_ALIGN_BYTES);
  最小的chunk大小也会>=56;
  第一组的chunk信息就是,每个chunk的大小:         slabclass.size = size;
  本组内chunk的个数为:                                           slabclass.perslab = settings.item_size_max / slabclass.size;
  第二主信息:

以增长因子 factor的的速度增长size *= factor;但是要慢组大小被 CHUNK_ALIGN_BYTES整除,即size += CHUNK_ALIGN_BYTES - (size % CHUNK_ALIGN_BYTES);  个数的算法也同样
  ……
  
  最后一组,

       slabclass[power_largest].size = settings.item_size_max;
       slabclass[power_largest].perslab = 1;
  即一组只有一个chunk,大小为设置的最大值。
  
  如果在使用的时候,你发现你的应用场景1M大小的chunk根本不够存储你的一个item,此时,我们需要做的就是修改原文件中settings.item_size_max;的值,位置在memcached.c文件的setting_init(void)函数中;比如我的修改值128 * 1024 * 1024; //64M
  -vv模式启动memcached:
  
  slab class   1: chunk size    160032 perslab     838
  slab class   2: chunk size    240048 perslab     559
  slab class   3: chunk size    360072 perslab     372
  slab class   4: chunk size    540112 perslab     248
  slab class   5: chunk size    810168 perslab     165
  slab class   6: chunk size   1215256 perslab     110
  slab class   7: chunk size   1822888 perslab      73
  slab class   8: chunk size   2734336 perslab      49
  slab class   9: chunk size   4101504 perslab      32
  slab class  10: chunk size   6152256 perslab      21
  slab class  11: chunk size   9228384 perslab      14
  slab class  12: chunk size  13842576 perslab       9
  slab class  13: chunk size  20763864 perslab       6
  slab class  14: chunk size  31145800 perslab       4
  slab class  15: chunk size  46718704 perslab       2
  slab class  16: chunk size  70078056 perslab       1
  slab class  17: chunk size 134217728 perslab       1

可以看到最大的chunk size为134217728 即128M大小,这样我最的item的值被增加到128m的大小。

注:以上仅仅为实验得到的数据,还不知道如此实用对于性能上会不会造成很大的影响。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-108736-1-1.html 上篇帖子: Memcached 集中式缓存系统 下篇帖子: Windows中安装多个Memcached的Windows服务
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表