内存分配原理
在内存中申请一个page页。再分割成固定大小的几个区(slab),每个区里再分割相同大小的块(chunk)。在使用memcached的添加缓存值时,它自动选择合适的chunk来储存信息大的value用大的chunk,小的value用小的chunk。同时slab的大小由 memcached能使用的内存和增长比例(growth factor,默认1.25)来决定。启动memcached时,分别可以使用-m 和- f参数来设定
注意:
1.Page分配给Slab的内存空间,默认是1MB
2.chunk的大小默认48B
3.Memcached分配出去的page不会被回收或者重新分配
4.Memcached申请的内存不会被释放
5.slab空闲的chunk不会借给任何其他slab使用(新版本memcached有slab_reassign,slab_automove的功能)
数据存储
获取待存储对象的大小,根据这个大小,从最小的Chunk Size开始查找,找到第一个(即最小的)能放下size大小的对象的Chunk.找不到(size大于最大的Chunk Size)返回0(这就是为什么slab class从1开始而不是从0开始)
如果某个Slab没有剩余的Chunk了,系统便会给这个Slab分配一个新的Page以供使用,如果没有Page可用,系统就会触发LRU机制,通过删除冷数据来为新数据腾出空间,这里有一点需要注意的是:LRU不是全局的,而是针对Slab而言的
产生内存碎片
内存碎片:空闲,但无法被利用的内存空间
产生原因:在多次申请/释放过程中,形成的零碎空间,没法利用
注:chunks为固定大小,造成浪费,不能完全解决,可以通过调整Growth Factor因子来缓解
1.slab中chunk size的大小等于前一个slab的chunk size乘以factor(
增长因子
)
2.估算我们item的大小:key键长+suffix+value值长+结构大小(48字节)
3.逐步调整slab增长因子,使得某个slab的大小和我们的item大小接近(必须大于我们item的大小)
数据过期与删除
1.懒惰检查(Lazy Expiration)
memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过
期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。2.LRU(Least recently used,最近最少使用)淘汰
memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不
足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。
因此,当memcached的内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空
间分配给新的记录。