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内存管理分页架构更多 个人分类: ┈ ...
随机推荐
- 将 Shiro 作为应用的权限基础
Shiro 是 Java 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势.本文介绍了 Shiro 的 ...
- [系统开发] Python 实现的 Bind 智能 DNS Web 管理系统
在公司的运营中,DNS还是很重要的,不仅名称解析需要DNS,一些重要的服务,比如负载均衡.HTTP 虚拟主机也会用到它.Bind 手工管理方式有一定的危险性,一旦写错格式就会造成 DNS 服务瘫痪. ...
- 数据库整合数据报表SQL实战
协助同事整理sql统计报表. ---建立由avalue的视图,要过滤重复数据 CREATE VIEW vLectAnswerRecord as SELECT t2.OpenID,t2.Qguid,t1 ...
- .net 插件开发
http://blog.csdn.net/mailtogst/article/details/2073696
- 用HTML实现凸(凹)起的立体效果的表格
视觉效果如下: 实现这个效果主要用到的是<table>标签的bordercolorlight和bordercolordark两个属性.不过在测试的过程中,我发现有的浏览器不支持这两个属性, ...
- 彻底解决phpcms v9升级后,文章发布出现: Mysql 1267错误:MySQL Error : Illegal mix of collations 解决办法
彻底解决phpcms v9升级后,文章发布出现: MySQL Query : SELECT * FROM `withli_a`.`v9_keyword` WHERE `keyword` = '吼吼' ...
- Codeforces Round #377 (Div. 2) D. Exams(二分答案)
D. Exams Problem Description: Vasiliy has an exam period which will continue for n days. He has to p ...
- 【javascript进阶】异常
前言 最近有些时间了,今天看了看博客的后台记录,好多都没有写博客呢,争取尽快把以前的补上,javascrit中的异常在前端大家用的好像不是很多,其实javascript的异常和大多数的后端语言差不大, ...
- selenium查找动态的iframe的name
WebElement frame1 = driver.findElement(By.xpath("/html/body/div[9]/div[2]/div/iframe"));dr ...
- VC非法内存值的判断
0xcdcdcdcd - Created but not initialised0xdddddddd - Deleted0xfeeefeee - Freed memory set by NT's he ...