• MC的内存管理和删除机制


    先看一下,什么叫做内存的碎片化:

    1 如果用c语言直接 malloc,free 来向操作系统申请和释放内存时,
    2 在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用.
    3 这种空闲,但无法利用内存的现象,---称为内存的碎片化.

    因此,为了解决这个内存碎片化带来的浪费,那MC采用的是slab  allocator来进行缓解内存的碎片化

    MC使用 slab allocator的机制来管理内存的

    我们来看一下slab allocator的原理:

    1 预告把内存划分成数个slabclass仓库.(每个slabclass大小1M)
    2 各仓库,切分成不同尺寸的小块(chunk).
    3 需要存内容时,判断内容的大小,为其选取合理的仓库.

    我们来看看官方给的一张图,很明显的一张图,能够直接的看出来它的内存的划分的一个情况:

    系统如何选择合适的chunk?

    1 memcached根据收到的数据的大小, 选择最适合数据大小的chunk组(slabclass)。
    2 memcached中保存着slabclass内空闲chunk的列表, 根据该列表选择空的chunk, 然后将数
    3 据缓存于其中。

    我们来看一下上面的这张图示,当要缓存一个100字节的数据的时候,MC会将它存放到能够容纳下这个字节的最小的单位里面。

    1 警示:
    2 如果有100byte的内容要存,但122大小的仓库中的chunk满了
    3 并不会寻找更大的,如144的仓库来存储,
    4 而是把122仓库的旧数据踢掉! 

    固定大小chunk带来的内存浪费:

    由于slab allocator机制中,分配的chunk的大小是固定的,因此,对于特定的item,可能造成空间的浪费。

    比如,当我们将100字节的数据缓存到122字节的chunk中的时候,剩余的22字节就浪费了

    那对于上面的chunk的浪费问题,无法进行彻底的解决,只能够缓解该问题。

    开发者可以对网站中缓存的item的长度进行统计,并制定合理的slab class中的chunk的大小。

    可惜的是。我们目前还不能自定义chunk的大小,但我们可以通过参数来进行调整各slab class中的chunk大小的增长速度,即增长因子,grow factor

    grow factor 调优:

    memcached 在启动时可以通过 ­f 选项指定Growth Factor 因子, 并在某种程度上控制slab之
    间的差异. 默认值为1.25. 但是,在该选项出现之前,这个因子曾经固定为2, 称为”powersof2”
    策略。
    我们分别用grow factor 为2和1.25来看一看效果:

    1 memcached ­f 2 ­vvv
    2 slab class 1:chunk size 128 perslab 8192
    3 slab class 2:chunk size 256 perslab 4096
    4 slab class 3:chunk size 512 perslab 2048
    5 slab class 4:chunk size 1024 perslab 1024

    可见,从128字节的组开始,组的大小依次增大为原来的2倍.
    来看看f=1.25时的输出:

    1 memcached -f 1.25 -vvv
    2 slab class 1:chunk size 88 perslab 11915
    3 slab class 2:chunk size 112 perslab 9362
    4 slab class 3:chunk size 144 perslab 7281
    5 slab class 4:chunk size 184 perslab 5698

    对比可知, 当f=2时, 各slab中的chunksize增长很快,有些情况下就相当浪费内存.
    因此,我们应细心统计缓存的大小,制定合理的增长因子.

    1 注意:
    2 当f=1.25时,从输出结果来看,某些相邻的slab class的大小比值并非为1.25,可能会觉得有些计算误差,这些误差是为了保持字节数的对齐而故意设置的.

    memcached的过期数据惰性删除:

    1 1:当某个值过期后,并没有从内存删除, 因此,stats统计时,curr_item有其信息
    2 2:当某个新值去占用他的位置时,当成空chunk来占用.
    3 3:当get值时, 判断是否过期,如果过期 ,返回空, 并且清空,curr_item就减少了.
    1 即--这个过期,只是让用户看不到这个数据而已,并没有在过期的瞬间立即从内存删除.
    2 这个称为lazyexpiration,惰性失效.
    3 好处--- 节省了cpu时间和检测的成本

    memcached此处用的lru 删除机制:

    如果以122byte大小的chunk举例,122的chunk都满了, 又有新的值(长度为120)要加入, 要挤掉谁?

    1 memcached此处用的lru 删除机制.
    2 (操作系统的内存管理,常用fifo,lru删除)
    3 lru:least recently used 最近最少使用
    4 fifo:first in,first out

    原理: 当某个单元被请求时,维护一个计数器,通过计数器来判断最近谁最少被使用.就把谁踢出去
    1 注: 即使某个key是设置的永久有效期,也一样会被踢出来!
    2 即--永久数据被踢现象

    memcached中的一些参数限制:

    1 key 的长度:250字节,(二进制协议支持65536个字节)
    2 value 的限制:1m,一般都是存储一些文本,如新闻列表等等,这个值足够了.
    3 内存的限制:32位下最大设置到2g.
    4 
    5 如果有30g数据要缓存,一般也不会单实例装30g,(不要把鸡蛋装在一个篮子里),
    6 一般建议开启多个实例(可以在不同的机器,或同台机器上的不同端口)
  • 相关阅读:
    MySQL行级锁和表级锁
    轮询、长轮询、长连接、socket连接、WebSocket
    Http请求的TCP连接
    TCP的三次握手和四次挥手
    面试:做过sql优化吗?
    Java线程池
    C#代码审查工具 StyleCop
    C#中图片切割,图片压缩,缩略图生成的代码
    一个对称加密、解密的方法C#工具类
    C# 音频操作系统项目总结
  • 原文地址:https://www.cnblogs.com/shangzekai/p/4696394.html
Copyright © 2020-2023  润新知