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

时间: 2024-08-28 02:01:45

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

memcached的内存管理与删除机制

memcached的内存管理与删除机制 简介 注意:Memcache最大的value也只能是1M的空间,超过1M的数据无法保存(修改memcache源代码). ? 注意:内存碎片化永远都存在,只是哪一种方式可以使得内存碎片最小. ? 1. 什么是内存碎片化? 在使用这种内存缓存系统的时候,由于不断的申请,释放,就会形成一些很小的内存片段,无法被利用,这种现象就叫做,内存的碎片化.这个小块就是操作系统无法使用的空间. ????注意:内存碎片化永远存在,无法消除,但是可以利用最好的算法,降到最低.

memcached 的内存管理与删除机制

一.内存的碎片化 如果用c语言直接 malloc,free 来向操作系统申请和释放内存时,在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用,这种空闲,但无法利用内存的现象称为内存的碎片化. 二.slab allocator 缓解内存碎片化 memcached 用 slab allocator 机制来管理内存.slab allocator 原理: 预告把内存划分成数个 slab class 仓库.(每个 slab class 大小 1M)各仓库,切分成不同尺寸的小块(chunk).需

MC的内存管理和删除机制

先看一下,什么叫做内存的碎片化: 1 如果用c语言直接 malloc,free 来向操作系统申请和释放内存时, 2 在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用. 3 这种空闲,但无法利用内存的现象,---称为内存的碎片化. 因此,为了解决这个内存碎片化带来的浪费,那MC采用的是slab  allocator来进行缓解内存的碎片化 MC使用 slab allocator的机制来管理内存的 我们来看一下slab allocator的原理: 1 预告把内存划分成数个slabclas

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

1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本文将主要以X86架构为例来介绍Linux内存管理的分页机制. 2.分页机制 5. Linux中的汇编 6.Linux系统地址映射示例

JVM内存管理及GC机制

一.概述 JavaGC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.经过这么长时间的发展,javaGC机制已经日臻完善,几乎可以自动的为我们做绝大多数的事情. 虽然java不需要开发人员显示的分配和回收内存,这对开发人员确实降低了不少编程难度,但也可能带来一些副作用: 1. 有可能不知不觉浪费了很多内存 2. JVM花费过

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

目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象清理资源 使用实现了Dispose模式的类型 C#的using语句 手动监视和控制对象的生存期 对象复活 代 线程劫持 大对象 一.理解垃圾回收平台的基本工作原理 值类型(含所有枚举类型).集合类型.String.Attribute.Delegate和Event所代表的资源无需执行特殊的清理操作.

java内存管理与GC机制(一)

计算机cpu运转速度越来越快,硬盘远远跟不上cpu的读写速度,就设计可内存.随着cpu的发展,内存的读写速度也跟不上cpu处理速度,就在每颗cpu上加入了高速缓存.在多处理器系统中,每个处理器有自己的高速缓存,同时又共享内存(主存),这就有了缓存一致性问题.于是引入了一些协议,各个处理器运行时都要遵循,保证数据的一致性. Java中通过多线程机制使得多个任务同时执行处理,所有的线程共享JVM内存区域main memory,而每个线程又单独的有自己的工作内存,当线程与内存区域进行交互时,数据从主存

JVM内存管理与GC机制(一)

一  判断对象是否存活 1.1 引用计数法 给对象加一个引用计数器,每当有一个地方引用它时,计数器值加1:当引用失效的时候,计数器值减1:任何时刻计数器为0的对象就是不可能再被使用的. 引用计数法的实现简单,判断效率也很高,但是主流的java虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间的循环引用的问题. 举个例子: 对象objA和对象objB都有字段instance,赋值令objA.instance = objB 以及objB.instance = objA,除

Memcached源码分析之内存管理

先再说明一下,我本次分析的memcached版本是1.4.20,有些旧的版本关于内存管理的机制和数据结构与1.4.20有一定的差异(本文中会提到). 一)模型分析在开始解剖memcached关于内存管理的源代码之前,先宏观上分析一下memcached内存管理的模型是怎样子的: 提个建议,我觉得memcached内存管理的模型与我们平时做作业的作业本“画格子给我们往格子里面写字”的逻辑很像,一本本作业本就是我们的内存空间,而我们往里写的字就是我们要存下来的数据,所以分析的时候可以想像一下用方格作业