memcached的高级机制
memcached内存机制
(1)我们知道操作系统对进程的处理方法,在多进程并发的操作系统中,程序的执行不可避免的会产生碎片。同样对于memcached,在存储value,key时也会出现同样的问题, memcached采用了一种叫做slab alloction 的分配机制来尽量防止内存碎片化。下面来详解一下关于slab alloction机制。
如上图:
假设我们的内存为10M,首先将10M的内存分为4块,我们可以得出每块的大小为2.5M,即上面绿色的部分(slab1),我们称每个slab叫做slab class, 将第一
块再继续分,将slab1分成每块100Byte的小块,(即上面蓝色的部分),我们称每个小的蓝色的块叫做chunk。以此类推,把每一个slab按此规律进行切割。比如:
将slab2分成每个150Byte的chunk,把slab3分成每个250Byte的chunk,…………。
举个栗子:
>add person 0 0 4
>kobe
STORED
当成功存储后,kobe这个value会存储在slab1中的一个chunk中,当再来一个值是会继续放在刚才存储kobe的chunk 中;当存储一个130byte的value时,,会在 slab2里找到一个chunk存储进去。总之slab alloction 机制会根据value的大小分配chunk。我们尽量减少内存碎片的数量,但这种情况是不可避免的。
warning:
Grow factor <增长因子>
增长因子:每个相邻slab中的chunk的比值。mamcached默认的增长因子是1.25
这里还有一个问题就是,如果需要存储一个120Byte的value,但此时150Byte的chunk已经用完了。memcached的机制并不是去占用250Byte的chunk,而是把 slab2中150Byte中的数据踢出去。其中用的算法就是操作系统中经典的算法 (LRU最近最久未使用算法);