内存的碎片化
C语言中,直接malloc,free 来向操作系统申请和释放内存时,不断的申请和释放过程中,形成了一些很小的内存片段,无法再利用。这种无法利用内存的现象—称之为内存的碎片化。
Memacache如何克服内存碎片化
- memcached 用slab allocator 机制来管理内存。
- 原理:预先把申请到的内存划分成数个slab class仓库(即不同尺寸的小块)
如下图所示
- 需要内存时,判断内容大小,为器选择合理的块。
备注:如果选到的块为100byte,而内容为80byte,那么20byte,是无法利用的(即浪费了),如果100byte已经满了,不会寻找更大的120byte的仓库存储,会把相应的100byte的仓库中的旧数据剔除掉。
Memcached 增长因子
memcached在启动时,可以通过-f选项指定Growth Factor因子,并在某种程度上控制slab之间的差异。(默认值:1.25)
Memcache的删除机制
- 当某个值过期后,并没有从内存删除,因此,stats统计时,curr_item有其信息
- 当某个新支去占用他的位置时,当成空chunk来占用
- 当get值时,判断是否过期,如果过期,返回空,并且清空,curr_item就减少了。
备注:过期,只是用户看不到这个数据而已,并没有在过期的瞬间立即从内存删除。这个称为lazy expiration(惰性失效)—节省了cpu时间和检测的成本。
lru删除机制
原理:当某个单元被请求时,维护一个计数器,通过计数器来判断最近谁最少被使用,就把谁剔除。
注:即时某个key被设置为永久有效,也一样会被剔除。