Memcached内存管理机制
Slab 分配机制
?
Memcached 不是把所有大小的数据都放在一起的,而是预先分配一系列的 slab,每个
slab 负责一定范围内的数据存储。
初始时,Memcached 为每一个 slab 分配 一个Page(1M) 的内存, slab内再把page切分
成一个一个 Chunk, 组成 Chunk数组,每个Chunk 的大小等于该 slab 的数据存储范围
的最大值。
?
?
缓存记录的原理
memcached 根据记录的大小选择最适合的 slab, 从该 slab 中找一个空闲 chunk, 将数据缓存其中。
?
?
Slab 分配机制的缺点
由于 slab 内的 Chunk 大小是固定的,所以无法有效利用内存。例如将 100 字节的记录缓存到
128 字节的 chunk, 就有 28 字节的内存浪费。
?
Slab的内存分配
memcached 启动时通过 -m 参数指定最大使用内存, 不过这个最大内存不会一次性分配。
而是随着使用不断分配的。缓存一条记录,首先找到合适的 slab, 然后从 slab 中找空闲
chunk,如果没有空闲 chunk,则一次性分配一个 page(1M) 的内存给该 slab,slab
根据 chunk 的大小将 page 进行切分,组成 chunk 数组。如下图,Slab 1 和 Slab 2 都分配
了 1 Page的内存,切分成 chunk 数组。
?
?
总结一下,memcached 内存分配的策略是,slab 按需分配,没有空闲 chunk 就分配,每次分配 1个 page。
另外,memcached 分配出去的内存不会回收,不会释放,slab 的空闲 chunk 不会借给其他 slab 使用。
?
?