Memcached之Slab内存分配机制

版权声明:guojawee https://blog.csdn.net/weixin_36750623/article/details/84989012

如果你有动手习惯,可以现在就把电脑中的内存条拆开看下,发现内存条上有一个一个的单元格,嘻嘻~,每个单元格都是一个小房子,都能存放东西。
在这里插入图片描述

memcached的内存分配默认是采用了Slab Allocator的机制分配、管理内,在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。 但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下, 会导致操作系统比memcached进程本身还慢,Slab Allocator就是为解决该问题而诞生的。

memcached Slab Allocator内存分配机制

1.预先将内存分割成尺寸相同(默认是1MB)的Slab class1、Slab class2、… …、Slab classN
2.再将Slab class分成一个个尺寸相同的Chunk,Chunk是用于存放缓存记录的最小单位
在这里插入图片描述

在Slab中缓存记录的原理

Q1:将大小为N byte的内容存入memcached,选择存放在哪个Slab中的空闲Chunk中?
答案:原则是尽可能的不浪费空间的前提下,保证sizeof(Chunk) ≥ N。
在这里插入图片描述
Q2:假设此时要存放100byte的数据,但是112byte的Chunk全部使用完毕,那么100byte的数据将存放在哪里?是存放在144byte的Chunk中么?
答案:并不会使用144byte的Chunk去存放它,因为这样会造成空间的浪费。
解决方案:而是更新122byte仓库中数据,即踢除“旧”数据!===> Memcached之LRU删除机制https://blog.csdn.net/weixin_36750623/article/details/84989772

Slab Allocator的缺点

Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。

这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。
在这里插入图片描述
这种浪费是无法避免的,但是可以根据实际使用场景尽可能的降低空间的浪费。

调节chunk的增长因子

通过-f选项指定增长因子Growth Factor
memcached在启动时指定 Growth Factor增长因子(通过-f选项)控制每个chunk的大小,默认增长因子的值为1.25。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_36750623/article/details/84989012