Memcached 内存管理(一)

Memcached是一个高效的分布式内存cache,了解memcached的内存管理机制,便于咱们理解memcached,让咱们能够针对咱们数据特色进行调优,让其更好的为我所用。这里简单谈一下我对memcached的内存管理的一些认识,在没有特别注明的状况下,这里谈到的memcached是1.2版本,1.1和1.2版本有一些差别。分布式

基本概念:Slab和chunkmemcached

在Memcached内存结构中有两个很是重要的概念:slab 和 chunk,咱们先从下图中对这两个概念有一个感性的认识:spa

图 1 memcached内存结构ip

Slab是一个内存块,它是memcached一次申请内存的最小单位。在启动memcached的时候通常会使用参数-m指定其可用内存,可是并非在启动的那一刻全部的内存就所有分配出去了,只有在须要的时候才会去申请,并且每次申请必定是一个slab。Slab的大小固定为1M(1048576 Byte),一个slab由若干个大小相等的chunk组成。每一个chunk中都保存了一个item结构体、一对key和value。内存

虽然在同一个slab中chunk的大小相等的,可是在不一样的slab中chunk的大小并不必定相等,在memcached中按照chunk的大小不一样,能够把slab分为不少种类(class)。在启动memcached的时候能够经过-vv来查看slab的种类:ci

图2 slab分组信息it

从上图能够看到,默认状况下memcached把slab分为40类(class1~class40),在class 1中,chunk的大小为80字节,因为一个slab的大小是固定的1048576字节(1M),所以在class1中最多能够有13107个chunk:内存管理

       13107×80 + 16 = 1048576table

在class1中,剩余的16字节由于不够一个chunk的大小(80byte),所以会被浪费掉。每类chunk的大小有必定的计算公式的,假定i表明分类,class i的计算公式以下:class

chunk size(class i) :  (default_size+item_size)*f^(i-1)+ CHUNK_ALIGN_BYTES

  • default_size: 默认大小为48字节,也就是memcached默认的key+value的大小为48字节,能够经过-n参数来调节其大小;

  • item_size: item结构体的长度,固定为32字节。default_size大小为48字节,item_size为32,所以class1的chunk大小为48+32=80字节;

  • f为factor,是chunk变化大小的因素,默认值为1.25,调节f能够影响chunk的步进大小,在启动时可使用-f来指定;

  • CHUNK_ALIGN_BYTES是一个修正值,用来保证chunk的大小是某个值的整数倍(在32位机器上要求chunk的大小是4的整数倍)。

从上面的分析能够看到,咱们实际能够调节的参数有-f、-n,在memcached的实际运行中,咱们还须要观察咱们的数据特征,合理的调节f,n的值,使咱们的内存获得充分的利用减小浪费。

 

内存申请分配

 

Memcached内存管理采起预分配、分组管理的方式,分组管理就是咱们上面提到的slab class,按照chunk的大小slab被分为不少种类。下面解释一下memcached的内存预分配过程。

向memcached添加一个item时候,memcached首先会根据item的大小,来选择最合适的slab class:例如item的大小为190字节,默认状况下class 4的chunk大小为160字节显然不合适,class 5的chunk大小为200字节,大于190字节,所以该item将放在class 5中(显然这里会有10字节的浪费是不可避免的),计算好所要放入的chunk以后,memcached会去检查该类大小的chunk还有没有空闲的,若是没有,将会申请1M(1个slab)的空间并划分为该种类chunk。例如咱们第一次向memcached中放入一个190字节的item时,memcached会产生一个slab class 2(也叫一个page),并会用去一个chunk,剩余5241个chunk供下次有适合大小item时使用,当咱们用完这全部的5242个chunk以后,下次再有一个在160~200字节之间的item添加进来时,memcached会再次产生一个class 5的slab(这样就存在了2个pages)。查看slab的使用状况,咱们能够telnet ip port,而后输入命令 stats slabs便可:

例如:telnet 10.0.4.210 11211

stats slabs

         STAT 5:chunk_size 200

         STAT 5:chunks_per_page 5242

         STAT 5:total_pages 1

         STAT 5:total_chunks 5242

         STAT 5:used_chunks 5242

         STAT 5:free_chunks 0

         STAT 5:free_chunks_end 5241

         STAT active_slabs 1

         STAT total_malloced 1048400

图3 stats slab

图3显示的是第一次放入一个190字节的item以后的统计结果。

相关文章
相关标签/搜索