Memcached入门【三】---------内存管理与删除机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tacks/article/details/82219396

既然memcached是内存型的nosql,那么内存的合理使用自然是这项技术的核心。”
一个系统上动态分配内存,程序不断的申请和释放内存的过程中,会形成一些小的内存片段,无法利用。这种空闲,但是无法利用内存的现象,成为内存碎片化。例如假设当某个用户请求一个 33 字节的内存块时,因为没有适合大小的内存(有时候的内存可能是系统预设好的),所以它可能会获得 45字节的内存块、50字节的等稍大一点内存块,因而产生的多余空间,而又无法再使用。

(1)Memcached是如何面对内存碎片化的?

memcached是采用Slab Allocation机制:整理内存以便重复使用memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,所以这种技术就应运而生。

(2)Slab Allocation机制管理内存

原理:预先把内存划分成数个 slabclass 仓库,默认是1MB, 各仓库切分成不同尺寸(可以通过增长因子来控制这个尺寸的变化)的小块(chunk). 需要存内容时,判断内容的大小,为其选取合理的仓库.
slabclass
注意:Grow factor默认是1.25倍,可以根据自己网站缓存的大小来调整增长因子。
memcached根据收到的数据大小来选择合适大小的chunk,但是不免还是有内存的浪费,只是说这样可以相对有效的利用内存。

#增长因子可以在创建客户端的时候利用-f指定默认是1.25
#-m 指定内存分配默认是64mb  -p指定端口号默认是11211 
memcached.exe -m 64 -p 11211 -f 1.25 -vvv

grow-factor
-f

(3)系统如何来选择合适的chunk?

memcached 根据收到的数据的大小, 选择最适合数据大小的 chunk 组(slabclass) memcached 中保存着 slabclass 内空闲 chunk 的列表, 根据该列表选择空的 chunk, 然后将数 据缓存于其中。
举个例子吧:
eg

  • 如果有100byte的内容要存,但是这个时候slab class没有100大小刚刚号的内存块,所以这个时候要选择大一点的122chunk。
  • 如果这122byte的内存块满了,数据存储没有位置存了,那么它并不会寻找更大的仓库例如144,它会把chunk是122的内存块中旧数据踢出。(删除机制

(4)Slab Allocation 的缺点

Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了
bad
对于该问题目前还没有完美的解决方案。如果预先知道客户端发送的数据的公用大小,或者仅缓存大小相同的数据的情况下,只要使用适合数据大小的组的列表,就可以减少浪费。目前合理观察数据存储,设置合理的增长因子,因地制宜。

(5)过期数据机制(惰性删除)

原理:
1.当某个值过期后,并没有从内存删除,因此stats统计的时候,curr_item有其信息
2.如果之前没有get过,将不会自动删除,当某个新的值来占用他的位置,当成空的chunk来用
3.当get取这个值的时候,判断是否过期,如果过期,返回空,并且清空,curr_item就减少了
这个过期,只是让用户看不到这个数据而已,并没有在过期的瞬间立即从内存删除
这个称之为lazy expiration 惰性失效。好处:节省CPU时间和检测的成本

(6)LRU删除机制(LRU least Recently Used )

原理:当某个单元被请求的时候,维护一个计数器,通过计数器来判断最近谁最少使用,那就把谁踢出去。即使某个key设置的永久有效,也会被踢出来,这个就是永久数据被踢的现象。
举例:有一个122byte大小的chunk距离,122仓库都满了,又要有新的值120来
要挤掉谁?这个时候不管它是否设置为永久有效期,这个时候看谁最不活跃,没有访问过的,就把它删除。
memcached默认就是使用LRU机制的,但是你可以用-M去禁用LRU模式,内存用尽时memcached 会返回错误,但是还是建议使用LRU机制。

猜你喜欢

转载自blog.csdn.net/Tacks/article/details/82219396