内存的碎片化

  如果用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, (不要把鸡蛋装在一个篮子里),一般建议开启多个实例(可以在不同的机器,或同台机器上的不同端口)。

memcached整理の内存管理及删除机制的更多相关文章

  1. memcached的内存管理与删除机制

    memcached的内存管理与删除机制 简介 注意:Memcache最大的value也只能是1M的空间,超过1M的数据无法保存(修改memcache源代码).   注意:内存碎片化永远都存在,只是哪一 ...

  2. memcached 的内存管理与删除机制

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

  3. Memcached 之内存管理与删除机制

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

  4. MC的内存管理和删除机制

    先看一下,什么叫做内存的碎片化: 如果用c语言直接 malloc,free 来向操作系统申请和释放内存时, 在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用. 这种空闲,但无法利用内存的 ...

  5. Linux内存管理3---分页机制

    1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本 ...

  6. JVM内存管理及GC机制

    一.概述 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露 ...

  7. [CLR via C#]21. 自动内存管理(垃圾回收机制)

    目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象 ...

  8. 【摘录】JAVA内存管理-JVM垃圾收集机制

    很多公司都有自己的JVM实现,被Oracle收购的sun公司开发的JVM实现名为HotSpot.这一实现是我们最常用到的. 还有哪些JVM实现呢?比较有名的有Oracle之前收购的BEA公司(就是以前 ...

  9. Memcached源码分析之内存管理

    先再说明一下,我本次分析的memcached版本是1.4.20,有些旧的版本关于内存管理的机制和数据结构与1.4.20有一定的差异(本文中会提到). 一)模型分析在开始解剖memcached关于内存管 ...

随机推荐

  1. LinkedHashMap学习

    一.概述 LinkedHashMap继承自HashMap,是Map接口的一个具体实现,它是有序的,可以按照插入顺序先后和访问时间先后进行排序,选择哪种排序方式取决于在新建LinkedHashMap的时 ...

  2. Android 4 学习(20):ActionBar

    参考<Pro Android 4.0> ActionBar 11.0之后,ActionBar在Activity中默认存在,可以在代码中设置其显示与否: ActionBar actionBa ...

  3. Java Servlet调用数据库复习

    首先要导入jar包. 剩下的基本就是模版式的代码了: public class main { // JDBC 驱动名及数据库 URL static final String JDBC_DRIVER = ...

  4. DataMatrix二维条码源码分析检测识别图像位置

    发布时间:2014-10-31 DataMatrix的代码结构和QR码基本相同: 其中Detector的功能还是从原始图像中找出符号码的部分,并且进行透视转换纠正扭曲. 其解码流程与QR码差不多,关键 ...

  5. delphi BLE 学习

    TBluetoothLE 控件 TBluetoothLE.FManager: TBluetoothLEManager; class constructor TBluetoothLEManager.Cr ...

  6. PHP - 用户异常断开连接,脚本强制继续执行,异常退出回调

    试想如下情况.如果你的用户正在执行一个需要非常长的执行时间的操作.他点了执行了之后,浏览器就开始蛋疼地转.如果执行5分钟,你猜他会干啥,显然会觉得什么狗屎垃圾站,这么久都不响应,然后就给关了.当然这个 ...

  7. Oracle中关于DateTime的一些描述

    转载自:http://www.cnblogs.com/fmxyw/archive/2008/08/26/1276850.html 在做话务报表,参考一下信息   to_date()与24小时制表示法及 ...

  8. Linux实战教学笔记53:开源虚拟化KVM(一)搭建部署与概述

    一,KVM概述 1.1 虚拟化概述 在计算机技术中,虚拟化意味着创建设备或资源的虚拟版本,如服务器,存储设备,网络或者操作系统等等 [x] 虚拟化技术分类: 系统虚拟化(我们主要讨论的反向) 存储虚拟 ...

  9. 将中国标准时间转成yyyy-MM-dd

    public static void main(String[] args) throws ParseException { String s = "Tue Jul 12 00:00:00 ...

  10. Comet OJ - Contest #2 D 枚举重心

    题面 思路: 函数f相当于是求一个点集f的直径,有一个性质是如果这个点集有多个直径一定相交于某一个点,或者一条边的中心,所以我们暴力枚举重心,计算以某个点为重心的点集对答案的贡献. 具体实现的时候,我 ...