1、内存的碎片化缓存
若是用c语言直接 malloc,free 来向操做系统申请和释放内存时,在不断的申请和释放过程当中,造成了一些很小的内存片段,没法再利用,这种空闲,但没法利用内存的现象称为内存的碎片化。memcached
2、slab allocator (对象缓存分配)缓解内存碎片化网站
memcached 用 slab allocator 机制来管理内存。slab allocator 原理: 把内存划分红数个 slab class 仓库.(每一个 slab class 大小 1M,注:Slab是一个内存块)各仓库,切分红不一样尺寸的小块(chunk)。须要存内容时,判断内容的大小,为其选取合理的仓库。chunk就是用来存储key-value数据的最小单位。操作系统
如图:对象
3、系统如何选择合适的 chunk?blog
memcached 根据收到的数据的大小,选择最适合数据大小的 chunk 组(slab class)。memcached 中保存着 slab class 内空闲 chunk 的列表,根据该列表选择空的 chunk,而后将数据缓存于其中。内存
如图:开发
注意:若是有 100byte 的内容要存,但 122 大小的仓库中的 chunk 满了并不会寻找更大的,如 144 的仓库来存储,而是把 122 仓库的旧数据踢掉。get
4、固定大小 chunk 带来的内存浪费it
因为 slab allocator 机制中,分配的 chunk 的大小是”固定”的, 所以,对于特定的 item,可能形成内存空间的浪费. 好比,将 100 字节的数据缓存到 122 字节的 chunk 中,剩余的 22 字节就浪费了。
如图:
对于chunk 空间的浪费问题,没法完全解决,只能缓解该问题。开发者能够对网站中缓存中的 item 的长度进行统计,并制定合理的 slab class 中的 chunk 的大小。惋惜的是,咱们目前还不能自定义 chunk 的大小,但能够经过参数来调整各 slab class 中 chunk大小的增加速度。即增加因子, grow factor。
5、grow factor (增加因子)调优
memcached 在启动时能够经过f 选项指定 Growth Factor 因子,并在某种程度上控制 slab 之间的差别。默认值为 1.25. 可是,在该选项出现以前,这个因子曾经固定为 2,称为”powers of 2” 策略。
6、memcached 的过时数据惰性删除
1. 当某个值过时后,并无从内存删除,所以,stats 统计时, curr_item 有其信息。
2. 当某个新值去占用他的位置时,当成空 chunk 来占用。
3. 当 get 值时,判断是否过时,若是过时,返回空,而且清空,curr_item 就减小了。
数据没有在过时的瞬间当即从内存删除,这个称为 lazy expiration,惰性失效。节省了cpu时间和检测的成本。
7、lru(最近最少使用) 删除机制
若是以 122byte 大小的 chunk 举例, 122 的 chunk 都满了, 又有新的值(长度为 120)要加入, 要挤掉谁? memcached 此处用的 lru 删除机制。