MC的内存管理和删除机制
先看一下,什么叫做内存的碎片化:
- 如果用c语言直接 malloc,free 来向操作系统申请和释放内存时,
- 在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用.
- 这种空闲,但无法利用内存的现象,---称为内存的碎片化.
因此,为了解决这个内存碎片化带来的浪费,那MC采用的是slab allocator来进行缓解内存的碎片化
MC使用 slab allocator的机制来管理内存的
我们来看一下slab allocator的原理:
- 预告把内存划分成数个slabclass仓库.(每个slabclass大小1M)
- 各仓库,切分成不同尺寸的小块(chunk).
- 需要存内容时,判断内容的大小,为其选取合理的仓库.
我们来看看官方给的一张图,很明显的一张图,能够直接的看出来它的内存的划分的一个情况:
系统如何选择合适的chunk?
- memcached根据收到的数据的大小, 选择最适合数据大小的chunk组(slabclass)。
- memcached中保存着slabclass内空闲chunk的列表, 根据该列表选择空的chunk, 然后将数
- 据缓存于其中。
我们来看一下上面的这张图示,当要缓存一个100字节的数据的时候,MC会将它存放到能够容纳下这个字节的最小的单位里面。
- 警示:
- 如果有100byte的内容要存,但122大小的仓库中的chunk满了
- 并不会寻找更大的,如144的仓库来存储,
- 而是把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来看一看效果:
- memcached f vvv
- slab class :chunk size perslab
- slab class :chunk size perslab
- slab class :chunk size perslab
- slab class :chunk size perslab
可见,从128字节的组开始,组的大小依次增大为原来的2倍.
来看看f=1.25时的输出:
- memcached -f 1.25 -vvv
- slab class :chunk size perslab
- slab class :chunk size perslab
- slab class :chunk size perslab
- slab class :chunk size perslab
对比可知, 当f=2时, 各slab中的chunksize增长很快,有些情况下就相当浪费内存.
因此,我们应细心统计缓存的大小,制定合理的增长因子.
- 注意:
- 当f=.25时,从输出结果来看,某些相邻的slab class的大小比值并非为1.,可能会觉得有些计算误差,这些误差是为了保持字节数的对齐而故意设置的.
memcached的过期数据惰性删除:
- :当某个值过期后,并没有从内存删除, 因此,stats统计时,curr_item有其信息
- :当某个新值去占用他的位置时,当成空chunk来占用.
- :当get值时, 判断是否过期,如果过期 ,返回空, 并且清空,curr_item就减少了.
- 即--这个过期,只是让用户看不到这个数据而已,并没有在过期的瞬间立即从内存删除.
- 这个称为lazyexpiration,惰性失效.
- 好处--- 节省了cpu时间和检测的成本
memcached此处用的lru 删除机制:
如果以122byte大小的chunk举例,122的chunk都满了, 又有新的值(长度为120)要加入, 要挤掉谁?
- memcached此处用的lru 删除机制.
- (操作系统的内存管理,常用fifo,lru删除)
- lru:least recently used 最近最少使用
- fifo:first in,first out
- 原理: 当某个单元被请求时,维护一个计数器,通过计数器来判断最近谁最少被使用.就把谁踢出去
- 注: 即使某个key是设置的永久有效期,也一样会被踢出来!
- 即--永久数据被踢现象
memcached中的一些参数限制:
- key 的长度:250字节,(二进制协议支持65536个字节)
- value 的限制:1m,一般都是存储一些文本,如新闻列表等等,这个值足够了.
- 内存的限制:32位下最大设置到2g.
- 如果有30g数据要缓存,一般也不会单实例装30g,(不要把鸡蛋装在一个篮子里),
- 一般建议开启多个实例(可以在不同的机器,或同台机器上的不同端口)
MC的内存管理和删除机制的更多相关文章
- memcached的内存管理与删除机制
memcached的内存管理与删除机制 简介 注意:Memcache最大的value也只能是1M的空间,超过1M的数据无法保存(修改memcache源代码). 注意:内存碎片化永远都存在,只是哪一 ...
- memcached整理の内存管理及删除机制
内存的碎片化 如果用C语言直接malloc,free来向操作系统申请和释放内存时,在不断申请和释放的过程中,形成了一些很小的内存片段,无法再利用.这种空闲但无法利用内存的现象称为内存的碎片化. sla ...
- memcached 的内存管理与删除机制
1:内存的碎片化 如果用 c 语言直接 malloc,free 来向操作系统申请和释放内存时, 在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用. 这种空闲,但无法利用内存的现象,--- ...
- Memcached 之内存管理与删除机制
一.内存的碎片化 如果用c语言直接 malloc,free 来向操作系统申请和释放内存时,在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用,这种空闲,但无法利用内存的现象称为内存的碎片化 ...
- Linux内存管理3---分页机制
1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本 ...
- JVM内存管理及GC机制
一.概述 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露 ...
- [CLR via C#]21. 自动内存管理(垃圾回收机制)
目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象 ...
- 【摘录】JAVA内存管理-JVM垃圾收集机制
很多公司都有自己的JVM实现,被Oracle收购的sun公司开发的JVM实现名为HotSpot.这一实现是我们最常用到的. 还有哪些JVM实现呢?比较有名的有Oracle之前收购的BEA公司(就是以前 ...
- [转帖]Linux分页机制之概述--Linux内存管理(六)
Linux分页机制之概述--Linux内存管理(六) 2016年09月01日 19:46:08 JeanCheng 阅读数:5491 标签: linuxkernel内存管理分页架构更多 个人分类: ┈ ...
随机推荐
- 应用C#和SQLCLR编写SQL Server用户定义函数
摘要: 文档阐述使用C#和SQLCLR为SQL Server编写用户定义函数,并演示用户定义函数在T-SQL中的应用.文档中实现的 Base64 编码解码函数和正则表达式函数属于标量值函数,字符串分割 ...
- WPF ListBox
记录一些ListBox的用法 设置ListBox选中项的背景颜色 如何为标准的ListBox添加ItemClick事件 连续选择同一项时SelectionChanged 事件不响应的问题 1.设置Li ...
- Rails : 产品环境(生产环境)的部署
bundle install rails server (默认为开发环境) rails server -p80 -e production (指定为生产环境 ,并自定义指定站点端口) rake RAI ...
- Dephi 和 Pascal 的关系
Pascal是一个有影响的面向对象和面向过程编程语言,由尼古拉斯·沃斯在1968年9月设计,在1970年发行,作为一个小型的和高效的语言,意图鼓励使用结构化编程和数据结构进行良好的编程实践. Delp ...
- HelloWorld!
爪哇岛上程序猿,5载忙忙未等闲, 醉里挑灯秒登VPN解决Bug,梦里手撕产品战PM: 但行好事,莫问前程, 泰山崩于前,我依然沐浴更衣焚香沏茶: ...
- SparkSQL(源码阅读三)
额,没忍住,想完全了解sparksql,毕竟一直在用嘛,想一次性搞清楚它,所以今天再多看点好了~ 曾几何时,有一个叫做shark的东西,它改了hive的源码...突然有一天,spark Sql突然出现 ...
- python(30) 获取网页返回的状态码,状态码对应问题查询
获取访问网页返回的状态码 html = requests.get(Url) respon = html.status_code 以下内容来自于维基百科:点击查看网页 1xx消息 这一类型的状态码,代表 ...
- java中final 、finally、finalize的区别
比较java中常用关键字以免混淆 final :用来修饰变量,表示变量为最终变量,不能被改变 finally:在处理异常的时候使用,表示最终要执行的代码块 finalize:java Object类中 ...
- 评论Final版本发布
1. 新蜂:俄罗斯方块 产品方面:俄罗斯方块在Beta版本基础上新增了许多功能,其中游戏中按A键可以开启瞄准,这个功能在市面上是具有先发优势的,算是一个较大的亮点:在改进了文字ui和方块的贴图以及游 ...
- CentOS7:Puppet推送Zabbix Agent
创建zabbix模块目录: $ mkdir -p /etc/puppet/modules/zabbix/{manifests,templates} 创建init.pp清单: $ cat /etc/pu ...