memcached内存分配机制以及过期机制

一、操作系统内存分配机制

操作系统中会马内存分配成以一定大小为单位的区块(chunk),如果有这么这几个区块,10字节,50字节,100字节,200字节的区块,

如果有一个数据块,它的大小为85字节,那它只能放到100字节的区块中,但是它使用了100字节的这个区块后,其他数据就不能再使用这个区块了

所以,会出现15字节的空间浪费。

二、memcached内存分配机制

memcached把分配给memcached的总的内存(我们可以把它想象成一个大块)划分为若干大小不一的区段(slab),每个区段中放的是相同大小的区块,比如有100字节的区段,里面放的全都是100字节的区块(这个区块叫chunk),120字节的区段放的全是120字节的区块

  • (1)slab:预分配的区段(不同的区段大小不一致,每个slab中的chunk大小是一值的)

  • (2)page:为memcached中内存最小的分配单位,默认为1M。

  • (3)chunk:实际的区块(它的大小是由它所在slab决定的,它是在page中划分的,如果存储的数据没有达到chunk的最大值,则不能再存储其他数据),是实际存储的最小单位。

    每个chunk的占用的大小不仅是存储的数据的大小,还有chunk的数据结构也需要占用48B

    通过 memcached中的参数 -vv可以查看:

分析:

  • chunk size每个chunk的大小

  • perslab为每个slab的大小

可以通过参数 -n来设置最小的chunk的大小,-f 设置增长因子

比如上图中最小的chunk大小为80.

增长因子:是每个chunk大小的比例(从小到大排列,后面一个与前面一个的比值),如上例中的:

  1. 104/80 = 1.3;
  2. 136/104 = 1.3
  3. 176/136 = 1.29

所以这个增长因子是1.3

合理分配增长因子可以减少memcached的内存的浪费。

三、删除机制LRU

LRU(Least Recently Used)最近最少使用的数据

这个机制会删除最近最少使用的数据