• memcached整理の内存管理及删除机制


      内存的碎片化

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

      slab allocator 缓解内存碎片化

      memcached用slab allocator机制来管理内存。

      slab allocator原理:预告把内存划分成数个slab class仓库(每个 slab class 大小为1M),各仓库切分成不同尺寸的chunk块,需要存内容时,判断内容大小,然后选取合理的仓库。

      

      系统如何选择合适的chunk?

      memcached依据收到数据的大小,选择最合适数据大小的chunk组(slab class)。

      memcached中保存着slab class内空闲的chunk列表,根据该列表选择空的chunk,然后将数据缓存与其中。

      

      tips:如果有100byte的内容要存,但仓库中122大小的chunk满了,并不会寻找更大的,如144的chunk来存,而是把122chunk的旧数据t掉!

      固定大小chunk带来的浪费

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

      比如,将100 字节的数据缓存到122 字节的chunk 中, 剩余的22 字节就浪费了。

      

      对于chunk空间的浪费问题,无法彻底解决,只能缓解该问题。

      开发者可以对网站中缓存中的item 的长度进行统计,并制定合理的slab class 中的chunk 的大小.可惜的是,我们目前还不能自定义chunk 的大小,但可以通过参数来调整各slab class 中chunk大小的增长速度. 即增长因子, grow factor!(学过物理的,肯定知道加速度,我的理解是一个意思)。
      grow factor调优

      memcached在启动时可以设置 -f 参数指定grow factor大小,并在某种程度上控制相邻slab大小的差异,默认值为1.25。

      我们来仔细观察一下增长因子为2与增长因子为1.25之间的差别:

      增长因子为1.25:

      

      增长因子为2:

      

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

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

      memcached的过期数据惰性删除

      1、当某个值过期后,并没有从内存删除,因此,stats统计时,curr_item还保留其信息。

      2、当新数据去占用他的位置时,当成空chunk来用。

      3、当get值时,判断是否过期,如果过期,则返回空,并且清空,这样curr_item就减少了。  

      即--这个过期,只是让用户看不到这个数据而已,并没有在过期的瞬间立即从内存删除。这个称为lazy expiration, 惰性失效.好处--- 节省了cpu 时间和检测的成本。

      memcached 此处用的lru 删除机制

      如果122byte的chunk挤满了,又来了一个长度为120byte的数据要加入,t谁?memcached此处用了lru删除机制(操作系统的内存管理,常用fifo,lru 删除),当某个单元被请求是,维护一个计数器,通过计数器来判断谁最少被使用,就把谁t掉。

      lru: least recently used 最近最少使用;fifo: first in ,first out。

      tips:即使某个key 是设置的永久有效期,也一样会被踢出来!即--永久数据被踢现象。

      memcached 中的参数限制

      key:250个字节

      value:1M

      内存:32位最大设置2G  

      如果有30g 数据要缓存,一般也不会单实例装30g, (不要把鸡蛋装在一个篮子里),一般建议开启多个实例(可以在不同的机器,或同台机器上的不同端口)。

  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    用 C 语言开发一门编程语言 — 字符串与文件加载
    用 C 语言开发一门编程语言 — 条件分支
    PTA刷题笔记(C语言) | 7-38 支票面额 (15分)
    PTA刷题笔记(C语言) | 7-33 统计素数并求和 (20分)
  • 原文地址:https://www.cnblogs.com/tomcatx/p/4276614.html
Copyright © 2020-2023  润新知