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,然后将数据缓存于其中。

  如图:

    

  注意:如果有 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,称为”powers of 2” 策略。

六、memcached 的过期数据惰性删除

  1. 当某个值过期后,并没有从内存删除,因此,stats 统计时, curr_item 有其信息。

  2. 当某个新值去占用他的位置时,当成空 chunk 来占用。

  3. 当 get 值时,判断是否过期,如果过期,返回空,并且清空,curr_item 就减少了。

  数据没有在过期的瞬间立即从内存删除,这个称为 lazy expiration,惰性失效。节省了cpu时间和检测的成本。

七、lru(最近最少使用) 删除机制

  如果以 122byte 大小的 chunk 举例, 122 的 chunk 都满了, 又有新的值(长度为 120)要加入, 要挤掉谁? memcached 此处用的 lru 删除机制。

原文地址:https://www.cnblogs.com/yang-2018/p/10105200.html

时间: 2024-10-10 12:08:20

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花费过

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

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

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

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

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内存管理的模型与我们平时做作业的作业本“画格子给我们往格子里面写字”的逻辑很像,一本本作业本就是我们的内存空间,而我们往里写的字就是我们要存下来的数据,所以分析的时候可以想像一下用方格作业