zoukankan      html  css  js  c++  java
  • 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, (不要把鸡蛋装在一个篮子里),一般建议开启多个实例(可以在不同的机器,或同台机器上的不同端口)。

  • 相关阅读:
    JavaScript cookie详解
    Javascript数组的排序:sort()方法和reverse()方法
    javascript中write( ) 和 writeln( )的区别
    div做表格
    JS 盒模型 scrollLeft, scrollWidth, clientWidth, offsetWidth 详解
    Job for phpfpm.service failed because the control process exited with error code. See "systemctl status phpfpm.service" and "journalctl xe" for details.
    orm查询存在价格为空问题
    利用救援模式破解系统密码
    SSH服务拒绝了密码
    C# 调用 C++ DLL 中的委托,引发“对XXX::Invoke类型的已垃圾回收委托进行了回调”错误的解决办法
  • 原文地址:https://www.cnblogs.com/tomcatx/p/4276614.html
Copyright © 2011-2022 走看看