美文网首页
memcached 内存存储Slab Allocator 笔记整

memcached 内存存储Slab Allocator 笔记整

作者: Eric新之助 | 来源:发表于2016-02-06 11:00 被阅读441次

    Slab Allocator内存分配机制

    Memcache按照预先规定的大小,将分配的内存分割成特定长度的块,以解决内存碎片问题.


    Memcache的存储涉及到slab,page,chunk三个概念,三者是包含关系,从小到大如下:
    1.Chunk为固定大小的内存空间,默认为96Byte。
    2.page对应实际的物理空间,1个page默认为1M。
    所以memcache默认最大存储1M的对象,每个Slab中按照Page来申请内存, Page的大小默认为1M,可以通过-l参数调整,最小1k,最大128m.
    3.同样大小的chunk又称为slab。
    三者的关系如下图:

    Paste_Image.png

    比较重要的几个启动参数:
    -f:增长因子,chunk的值会按照增长因子的比例增长(chunk size growth factor).
    -n:每个chunk的初始大小(minimum space allocated for key+value+flags),chunk大小还包括本身结构体大小.
    -I:每个slab page大小(Override the size of each slab page. Adjusts max item size)
    -m:需要分配的大小(max memory to use for items in megabytes)


    Slab Allocator 的缺点

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

    Image.png

    对于该问题目前还没有完美的解决方案,但是可以通过分析目标应用缓存的大小,来调整chunk的大小以减少浪费。


    使用Growth Factor进行调优

    memcached 在启动时指定Growth Factor 因子(通过f 选项),就可以在某种程度上控制slab 之间的差异。默认值为1.25。但是,在该选项出现之前,这个因子曾经固定为2,称为“powers of 2”策略。
    下面是启动后的verbose 输出:
    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 这个选项来看看现在的默认设置(f=1.25)时的输出(篇幅所限,这里只写到第10 组):
    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 内存存储Slab Allocator 笔记整

          本文链接:https://www.haomeiwen.com/subject/fbcykttx.html