memcache 内存管理 机制

1、Memcache内存分配机制 数组

        关于这个机制网上有不少解释的,我我的的总结以下。缓存

  1. Page为内存分配的最小单位。memcached

    Memcached 的内存分配以page为单位,默认状况下一个page是1M,能够经过-I参数在启动时指定。若是须要申请内存时,memcached会划分出一个新的 page并分配给须要的slab区域。page一旦被分配在重启前不会被回收或者从新分配(page ressign已经从1.2.8版移除了)
    Memcached pages spa

  2. Slabs划分数据空间。内存

    Memcached 并非将全部大小的数据都放在一块儿的,而是预先将数据空间划分为一系列slabs,每一个slab只负责必定范围内的数据存储。以下图,每一个slab只存储 大于其上一个slab的size并小于或者等于本身最大size的数据。例如:slab 3只存储大小介于137 到 224 bytes的数据。若是一个数据大小为230byte将被分配到slab 4中。从下图能够看出,每一个slab负责的空间实际上是不等的,memcached默认状况下下一个slab的最大值为前一个的1.25倍,这个能够经过修 改-f参数来修改增加比例。
    Memcached slab get

  3. Chunk才是存放缓存数据的单位。im

    Chunk 是一系列固定的内存空间,这个大小就是管理它的slab的最大存放大小。例如:slab 1的全部chunk都是104byte,而slab 4的全部chunk都是280byte。chunk是memcached实际存放缓存数据的地方,由于chunk的大小固定为slab可以存放的最大值, 因此全部分配给当前slab的数据均可以被chunk存下。若是时间的数据大小小于chunk的大小,空余的空间将会被闲置,这个是为了防止内存碎片而设 计的。例以下图,chunk size是224byte,而存储的数据只有200byte,剩下的24byte将被闲置。
    Memcached chunk 总结

  4. Slab的内存分配。数据

    Memcached在启动时经过-m指定最大使用内存,可是这个不会一启动就占用,是随着须要逐步分配给各slab的。
             若是一个新的缓存数据要被存放,memcached首先选择一个合适的slab,而后查看该slab是否还有空闲的chunk,若是有则直接存放进去;如 果没有则要进行申请。slab申请内存时以page为单位,因此在放入第一个数据,不管大小为多少,都会有1M大小的page被分配给该slab。申请到 page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk的数组,在从这个chunk数组中选择一个用于存储 数据。以下图,slab 1和slab 2都分配了一个page,并按各自的大小切分红chunk数组。
    内存分配

  5. Memcached内存分配策略。

    综合上面的介绍,memcached的内存分配策略就是:按slab需求分配page,各slab按需使用chunk存储。
    这里有几个特色要注意,

    1. Memcached分配出去的page不会被回收或者从新分配

    2. Memcached申请的内存不会被释放

    3. slab空闲的chunk不会借给任何其余slab使用



有趣有爱有价值:http://www.qihu100.com