【Memcached一】Memcached内存管理

Memcached是基于客户端的一致性Hash算法来实现分布式的K/V缓存,Memcached的特性是高效以及简单,但是不能用它来持久的存储数据,也就说,使用Memcached的时候,必须考虑,Memcached挂了的影响。Memcached使用简单,不过还是了解下Memcached的内存管理机制。

Memcached内存特点

  • 基于slab的内存分配策略
  • 基于LRU的内存清除策略
  • 基于Hash的Item检索策略(也就是说,Memcached很想是个大的Hashtable)

Memcached内存管理机制

与Memcached内存管理相关的三个概念有Slab、Page、Chunk

  • Slab

Memcached将内存分成多个Slab(每个Slab),每个Slab有一个类型,这个类型了这个Slab中的块的大小,比如第一类Slab中的块大小是从0到96字节,第二类Slab是从97字节到120字节,...第42类Slab。第一块大小(默认96字节)可以通过参数调整、块大小的增长因子也是可以调整的,默认是增长25%

  • Page

Page是Memcached内存分配单位,Memcached每次分配一个Page的内存空间,默认情况下,一个Page的大小是1M。这个Page具体分解分成多少块,是由把Page分配给的Slab类型决定的

  • Chunk

内存分配单位,不同的Chunk在不同类型的Slab中大小是不同的,但是在相同的Slab中是相同的


Memcached Slab、Page和Chunk



 



 

 

内存利用不充分

 如下图,180字节的item存放在Slab 4中,放下此Item后,还有12字节没被使用,但是这12个字节永远被浪费了,即使此后有小于12字节的Item来了,也不会放到这里,



 

Memcached的Item存储结构



Memcached内存结构图  

 
 

Memcached内存回收策略

  •  Memcached数据清除并不是真正的清除,对于已经过期的数据占据的空间不会被回收
  •  Memcached优先使用已经过期的空间
  •  Memcached在内存空间不足时,就会使用LRU算法进行空间分配,将最近最不常使用的空间 腾出来给刚加入的Item使用,那么这些被踢的数据去哪了??另外,Memcached进行LRU是针对Slab进行的,而不是针对整个内存进行
  •  Memcached的命中率,受存储的数据、键值、过期以及增长因子等因素的制约
  •  懒惰过期检测机制

       1. 不主动检测对象是否过期

       2. Get到某个Item后,判断其是否过期,如果过期则删除,但是不能释放内存

 

  •  懒惰删除机制

      1. Memcached数据清除并不是真正的清除,即不进行内存释放,但是用户永远看不到这个数据了,其存储空间可以重复利用。 此时,Memcached会写清除位,内存指针放入slot回收插槽,下次内存分配时,直接使用。


  • LRU

     Memcached使用LRU算法从内存中删除有效的缓存数据。Memcached优先使用已超时的缓存数据的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为Least Recently Used(LRU)机制来 分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当Memcached的内存空间不足时(无法从slab class获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。

    从缓存的实用角度来看,该模型十分理想。 不过,有些情况下LRU机制反倒会造成麻烦。Memcached启动时通过“-M”参数可以禁止LRU,如下所示:  $ memcached -M -m 1024 启动时必须注意的是,小写的“-m”选项是用来指定最大内存大小的。不指定具体数值则使用默认值64MB。 指定“-M”参数启动后,内存用尽时Memcached会返回错误。话说回来,Memcached毕竟不是存储器,而是缓存,所以推荐使用LRU。     

Memcached常见问题

1. Memcached是否可以缓存超过1M的数据

可以,在启动Memcached时,需要指定-I参数,用于指定Memcached的最大的slab page(Memcached每次申请内存的大小是Page的大小,比如默认page是1M,那么Memcached每次申请大内存是1M)

2. Memcached的过期失效数据会回收内存吗?

不会。那么问题Memcached岂不是很快用完了??不会,虽然内存没有释放,但是数据会直接覆盖

3. Memcached如何进行LRU进行数据过期失效处理,并作相应的内存回收

 参见上面的LRU部分的描述

4. Memcached的Key的长度有什么限制?

Memcached的每个Key的长度不能超过250字节,并且Key是作为数据容量的一部分。

猜你喜欢

转载自bit1129.iteye.com/blog/2161711