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以后的统计结果。