`

memcached读书笔记一

 
阅读更多

      虽然之前项目中一直使用memcached缓存,但还没有深入了解一下,最近看了idv2的memcached全面剖析系列文章,在此总结一下,算是读书笔记吧~

 

参考链接:http://tech.idv2.com/2008/07/10/memcached-001/

                 http://tech.idv2.com/2008/07/11/memcached-002/

                 http://tech.idv2.com/2008/07/16/memcached-003/

                 http://tech.idv2.com/2008/07/24/memcached-004/

                 http://tech.idv2.com/2008/07/31/memcached-005/


/************ ******* *** memcached 基础 **** ******* ***********/

 

memcached 是什么?

       是一种高性能的分布式内存缓存服务器。

       使用环境:随着数据量的增大、访问的集中,就会出现数据库管理系统的负担加重、数据库响应恶化、 网站显示延迟等重大影响;

       使用目的:通过缓存数据库查询结果,减少数据库访问次数,以提高动态web的访问速度,提高可扩展性。

 

memcached 特性:

  • 协议简单
  • 基于libevent的事件处理
  • 内置内存存储方式
  • memcached不互相通信的分布式

1、协议简单:使用简单的基于文本行的协议;

2、基于libevent的事件处理:libevent是一个程序库,它将linux的epoll、BSD类操作系统的kqueue等事件处理功能,封装成统一的接口。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。

3、内置内存存储方式:为了提高性能,memcached将数据存储在内置的内存存储空间中。因此,重启memcached、重启操作系统,会导致全部数据消失。另外存储容量达到指定值之后,就基于LRU算法自动删除最近未使用缓存记录。

memcached本身就是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

4、memcached不互相通信的分布式:尽管是分布式缓存服务器,但服务端并互不通信,无分布式功能。分布式完全取决于客户端的实现。

 


/************ ******* *** memcached 内存存储 **** ******* ***********/

 

Slab Allocation 机制:

      整理内存以便重复使用。

      memcached默认情况下采用了slab allocation机制,在该机制以前,内存的分配时通过对所有的记录简单的进行malloc(申请) 和free(释放)来进行的。

      但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况,会导致操作系统比memcached进程本身还要慢。slab allocation机制因此应运而生。

 

     Slab Allocation基本原理:按照预先规定的大小,将分配的内存分割成特定的块(trunk),已完全解决内存碎片的问题。还有重复使用已分配内存的目的,也就是说,分配的内存不会释放,而是重复利用。

Slab Allocation 主要术语:
  page:分配给slab的内存空间,默认是1m,分配给slab之后根据slab的大小切割成块(trunk)。
  trunk:用于缓存记录的内存空间。
  slab class:特定大小的trunk数组。

 

Alab Allocation 中缓存记录的原理:

      针对客户端发送的数据,选择slab并缓存到chunk中。

      memcached根据收到的数据的大小,选择最适合数据大小的slab。 memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk, 然后将数据缓存于其中。

Slab Allocation 的缺点:

      Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。

      这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。 例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。

 

对于该问题目前还没有完美的解决方案,但有比较有效的解决方案:
      如果预先知道客户端发送的数据的公用大小,或者仅缓存大小相同的数据的情况下, 只要使用适合数据大小的组的列表,就可以减少浪费。


使用Growth Factor进行调优:
      memcached在启动时指定 Growth Factor因子(通过-f选项),就可以在某种程度上控制slab之间的差异,默认值为1.25。

      在该选项出现之前,这个因子曾经固定为2,称为“powers of 2”策略。

slab class   1: chunk size    128 perslab  8192
slab class   2: chunk size    256 perslab  4096
slab class   3: chunk size    512 perslab  2048
slab class   4: chunk size   1024 perslab  1024
slab class   5: chunk size   2048 perslab   512
slab class   6: chunk size   4096 perslab   256
slab class   7: chunk size   8192 perslab   128
slab class   8: chunk size  16384 perslab    64
slab class   9: chunk size  32768 perslab    32
slab class  10: chunk size  65536 perslab    16
slab class  11: chunk size 131072 perslab     8
slab class  12: chunk size 262144 perslab     4
slab class  13: chunk size 524288 perslab     2

      可见,从128字节的组开始,组的大小依次增大为原来的2倍。 这样设置的问题是,slab之间的差别比较大,有些情况下就相当浪费内存。 因此,为尽量减少内存浪费,两年前追加了growth factor这个选项。

slab class   1: chunk size     88 perslab 11915
slab class   2: chunk size    112 perslab  9362
slab class   3: chunk size    144 perslab  7281
slab class   4: chunk size    184 perslab  5698
slab class   5: chunk size    232 perslab  4519
slab class   6: chunk size    296 perslab  3542
slab class   7: chunk size    376 perslab  2788
slab class   8: chunk size    472 perslab  2221
slab class   9: chunk size    592 perslab  1771
slab class  10: chunk size    744 perslab  1409

      可见,组间差距比因子为2时小得多,更适合缓存几百字节的记录。

      将memcached引入产品,或是直接使用默认值进行部署时, 最好是重新计算一下数据的预期平均长度,调整growth factor, 以获得最恰当的设置。内存是珍贵的资源,浪费就太可惜了。

 


/************ ******* *** memcached 删除机制 **** ******* ***********/

 

memcached是缓存,所以数据不会永久保存在服务器上,这是向系统中引入memcached的前提。


数据不会真正从memcached中消失

      memcached不会释放已分配的内存。记录超时后,客户端就无法再看见该记录(即:invisible,透明), 其存储空间即可重复使用。

 

Lazy Expiration 惰性过期
      memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。 这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。

 

LRU原理--least recently used

      memcached 会优先使用已过期的记录空间,即使如此,也会发生追加新记录时空间不足的情况(无法从slab class获取新空间),此时就依据LRU原理,从最近未被使用的记录中搜索,并将空间分配给新的记录。
      缓存使用角度看,十分理想,不过有些情况下反倒会造成麻烦,通过-M可以禁止LRU 
       $ memcached -M -m 1024
      -M启动后,内存使用不足时,memcached会返回错误,
       memcached毕竟不是存储器,而是缓存,所以推荐使用LRU!

 

  • 大小: 11 KB
  • 大小: 28.2 KB
  • 大小: 11.7 KB
  • 大小: 23.4 KB
  • 大小: 7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics