请通过浏览器功能收藏网页

memcached内存分配规则模式内存回收顺序规则 Memcached

发布时间:2018-08-22 07:05:42  作者:本站编辑  来源:本站原创  浏览次数:
我有话说 | 分享 |
www.javainfo.com.cn 上干货 欢迎收藏

对memcached优化配置,我们必须了解其内存分配模型及内存组织结构,这样我们才能最大程度的优化其性能


了解文本资料:

Memcached的数据存储方式被称为Slab Allocator,其基本方式是:

1:先把内存分成很多个Slab,这个大小是预先规定好的,以解决内存碎片的问题。分配给Slab的内存空间被称为Page,默认是1M。一个Slab下可以有多个Page

2:然后把一个Page分成很多个chunk块,chunk块是用于缓存记录的空间。Chunk大小是先有一个基本值,然后根据增长因子来增大。

3slab class:内存区类别(48byte-1M),每个类别有一个slab classId

4Memcached里面保存着slab内空闲的chunk列表,当收到要保存的item的时候,它会根据item的大小,去选择一个最合适的slab,然后找到空闲的chunk,把数据存放进去

内存分配模型如下:

  blob.png


1:快速定位slab classid,先计算Item长度

    key键长+flag+suffix16字节)+value值长+结构大小(32字节)

        如果>1MB,无法存储丢弃

        取最小冗余的slab class    及算法为取余数  %最小值的slab

             如:有48,96,120,存90会选择96   

2:按顺序寻找可用chunk   内存利用顺序 按照如下顺序处理

    1slot:检查slab回收空间slot里是否有剩余chunk

        deletedelete时标记到slot

        exptimeget时检查的过期对象标记到slot

    2end_page_ptr:检查page中是否有剩余chunk

    3memory:内存还有剩余空间可以用于开辟新的slab

    4LRU   内存回收机制  优先回收很久没有使用过的chunks

 Memcached的数据存储方式的缺点

 由于chunks的大小是预先分配好的特定长度,因此如果数据不能完全填满chunk,那么剩余的空间就浪费了

 优先设置chunks的大小好处也很明显: 

长达大小已知,系统根据数据的大小进行存储的时候 不会出现超出分配的内存长度; 若采用可变长度存储的话,控制模块将会出现混乱。


 Lazy Expiration(延迟/惰性 过期)

Memcached不会监控记录是否过期,而是在外部来获取数据的时候,才检查

记录的时间戳,因此称为Lazy Expiration

 LRULeast Recently Used 最近最少使用)

当空间不足的时候,Memcached会优先使用已经过期的数据空间,如果还不

够,那么就会把最近最少使用的对象的空间释放出来使用。

 懒惰删除机制

删除item对象时,不释放内存,作删除标记,指针放入slot回收插槽,下

次分配的时候直接使用

 要特别注意:MemcachedLRU不是全局的,而是针对slab的,可以说是区域性的




如有疑问 请留言 欢迎提供建议
  • 0

    开心

  • 0

    板砖

  • 0

    感动

  • 0

    有用

  • 0

    疑问

  • 0

    难过

  • 0

    无聊

  • 0

    震惊

评论已有 0