memcached内存分配规则模式内存回收顺序规则 Memcached
对memcached优化配置,我们必须了解其内存分配模型及内存组织结构,这样我们才能最大程度的优化其性能
了解文本资料:
Memcached的数据存储方式被称为Slab Allocator,其基本方式是:
1:先把内存分成很多个Slab,这个大小是预先规定好的,以解决内存碎片的问题。分配给Slab的内存空间被称为Page,默认是1M。一个Slab下可以有多个Page。
2:然后把一个Page分成很多个chunk块,chunk块是用于缓存记录的空间。Chunk的大小是先有一个基本值,然后根据增长因子来增大。
3:slab class:内存区类别(48byte-1M),每个类别有一个slab classId
4:Memcached里面保存着slab内空闲的chunk列表,当收到要保存的item的时候,它会根据item的大小,去选择一个最合适的slab,然后找到空闲的chunk,把数据存放进去
内存分配模型如下:

1:快速定位slab classid,先计算Item长度
key键长+flag+suffix(16字节)+value值长+结构大小(32字节)
如果>1MB,无法存储丢弃
取最小冗余的slab class 及算法为取余数 %最小值的slab
如:有48,96,120,存90会选择96
2:按顺序寻找可用chunk 内存利用顺序 按照如下顺序处理
(1)slot:检查slab回收空间slot里是否有剩余chunk
delete:delete时标记到slot
exptime:get时检查的过期对象标记到slot
(2)end_page_ptr:检查page中是否有剩余chunk
(3)memory:内存还有剩余空间可以用于开辟新的slab
(4)LRU 内存回收机制 优先回收很久没有使用过的chunks
Memcached的数据存储方式的缺点
由于chunks的大小是预先分配好的特定长度,因此如果数据不能完全填满chunk,那么剩余的空间就浪费了
优先设置chunks的大小好处也很明显:
长达大小已知,系统根据数据的大小进行存储的时候 不会出现超出分配的内存长度; 若采用可变长度存储的话,控制模块将会出现混乱。
Lazy Expiration(延迟/惰性 过期)
Memcached不会监控记录是否过期,而是在外部来获取数据的时候,才检查
记录的时间戳,因此称为Lazy Expiration。
LRU(Least Recently Used 最近最少使用)
当空间不足的时候,Memcached会优先使用已经过期的数据空间,如果还不
够,那么就会把最近最少使用的对象的空间释放出来使用。
懒惰删除机制
删除item对象时,不释放内存,作删除标记,指针放入slot回收插槽,下
次分配的时候直接使用
要特别注意:Memcached的LRU不是全局的,而是针对slab的,可以说是区域性的
如有疑问 请留言 欢迎提供建议











评论已有 0 条