首页 技术 正文
技术 2022年11月16日
0 收藏 923 点赞 4,153 浏览 1239 个字

一、内存的碎片化

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

二、slab allocator (对象缓存分配)缓解内存碎片化

  memcached 用 slab allocator 机制来管理内存。slab allocator 原理: 把内存划分成数个 slab class 仓库.(每个 slab class 大小 1M,注:Slab是一个内存块)各仓库,切分成不同尺寸的小块(chunk)。需要存内容时,判断内容的大小,为其选取合理的仓库。chunk就是用来存储key-value数据的最小单位。

  如图:

    Memcached 之内存管理与删除机制

三、系统如何选择合适的 chunk?

  memcached 根据收到的数据的大小,选择最适合数据大小的 chunk 组(slab class)。memcached 中保存着 slab class 内空闲 chunk 的列表,根据该列表选择空的 chunk,然后将数据缓存于其中。

  如图:

    Memcached 之内存管理与删除机制

  注意:如果有 100byte 的内容要存,但 122 大小的仓库中的 chunk 满了并不会寻找更大的,如 144 的仓库来存储,而是把 122 仓库的旧数据踢掉。

四、固定大小 chunk 带来的内存浪费

  由于 slab allocator 机制中,分配的 chunk 的大小是”固定”的, 因此,对于特定的 item,可能造成内存空间的浪费. 比如,将 100 字节的数据缓存到 122 字节的 chunk 中,剩余的 22 字节就浪费了。

  如图:

    Memcached 之内存管理与删除机制

  对于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 删除机制。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,082
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,557
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,406
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,179
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,815
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898