zoukankan      html  css  js  c++  java
  • Memcache的内存管理与删除机制

    内存碎片
      在不断的申请和释放内存时候(如C语言中malloc、free),在内存中往往会出现一些很小的内存片段,无法再使用,这种空闲的内存被称为内存碎片

    memcache内存管理
      memcache使用slab allocator机制来内存管理。
      slab allocator原理:先将内存划分为多个slab class仓库,每个仓库切分成不同尺寸的小块chunk
      需要存储内容时候,判断内容大小,为其选择合理的仓库。如下图:

    memcache如何选择合适的chunk

    首先我们可以通过如下命令,查看memcache中chunk。

    memcache -vvv

    效果如下图

    现在有114byte内存需要存放,首先memcache会检查chunk组,找到内容大于114byte且二则差的绝对值最小的那个chunk。如果此时128chunk(即slab class 3 里面的chunk)已经用完,此时并不会去使用大小为160的chunk,而是将chunk为122里面的旧数据踢掉,以备使用

    固定大小的chunk带来的内存浪费
      在上面,我们存储的是114byte,但是使用的却是128byte。由于slab allocator机制中,分配的chunk大小事‘固定’的,应此可能会造成内存的浪费。对于chunk 空间的浪费问题,无法彻底解决,只能缓解该问题。

    chunk增长因子调优
      memcached 在启动时可以通过f选项指定Growth Factor 因子, 并在某种程度上控制slab 之间的差异. 默认值为1.25. 但是,在该选项出现之前,这个因子曾经固定为2,称为”powers of 2”策略。
    增长因子为3时候:

     增长因子为2.25

     增长因子为1.25

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

    memcache 的过期数据惰性删除
      (1)当某个值过期后,并没有从内存删除, 因此,stats 统计时, curr_item 有其信息。 当某个新值去占用他的位置时,当成空chunk 来占用。

      (2)当get 值时,判断是否过期,如果过期,返回空,并且清空, curr_item 就减少了。即这个过期,只是让用户看不到这个数据而已,并没有在过期的瞬间立即从内存删除。这个称为惰性失效。好处是节省了cpu 时间和检测的成本。

    memcache中LRU删除机制

           如果以 128byte的chunk举例, 128byte的chunk都满了, 又有新的值(长度为 120)要加入, 要剔除掉哪个数据?
    在操作系统系统中,常用的删除机制有fifo、lru删除

    lru:least recently used 最近最少使用
    fifo:first in,first out 最先插入,最先离开

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

    参数限制

    • key 的长度: 250 字节, (二进制协议支持 65536 个字节)
    • value 的限制: 1m, 一般都是存储一些文本,如新闻列表等等,这个值足够了. 内存的限制: 32 位下最大设置到 2g.

    如果有 30G数据要缓存,一般也不会单实例装 30G,可以开启多个实例(在不同的机器,或同台机器上的不同端口)

  • 相关阅读:
    memcached使用入门
    winform代码生成器(三)
    Spark + sbt + IDEA + HelloWorld + MacOS
    CentOS下Hive搭建
    36. 有效的数独
    HADOOP依赖
    判别数字图片能否「一笔完成」
    【网易微专业】图表绘制工具Matplotlib
    【18.065】Lecture2
    【18.065】Lecture1
  • 原文地址:https://www.cnblogs.com/cy0628/p/15206958.html
Copyright © 2011-2022 走看看