5.2 内存分配 slab allocation
Note: 内存分配的一些参数可通过配置文件获取或取缺省值。
内存分配:Slab Allocation 机制。stab classa page a chunk_size
stab class 数目由启动参数确定,stab class 中的 page 使用完后,则调用 LRU 算法。chunk_size 预分配若干固定尺寸,用来存储数据项,单个数据项不要超过此值,若超过,性能急降,存储项最大受限于 stab class 中的 page 总额。
page(1M)--> chunk (fixed-size) -a slabclass.
slabs_init(): 初始化 POWER_LARGEST 个 subclass, 为每个 Slab 分配一个 Page 的内存空间,Page 缺省为 1MB,每个 Page 根据 Slab 规格被划分为若干个相同 Size 的 Chunk,每个 Chunk 里保存一个 Item,每个 Item 同时包含了 Item 结构体、k 和 V,相同 Size 的 Chunk 合成一组 Slab Class, subclass 是个 chunk 的集合,每个 chunk 大小为 2^n
(n: classid) 或者 init_size*factor^n
。
如图例:
\#define POWER_LARGEST 200 //定义 subclass id 最大值
factor:为影响因子,可变。
缓存查找 find
accoc_find 函数:
uint32_t hv = hash(key, nkey, 0);
bucket = hv & hashbucket_num //default hashbucket_num = 1<<16 = 2^16 = 65536
通过 bucket 定位到相应的 hashtable,然后通过 memcmp(key, item)的方式找到 value.(此时 key 值可能不同,有碰撞,可用拉链法解决)
效率评价:内存分配虽有部分浪费,但可重复使用。
缓存更新机制
- 内存未使用完之前,只通过 expiretime 进行更新。
- 内存使用完后,将通过 expiretime 和 LRU 进行更新。
expiretime
过期时间,是指每个缓存项都有设置一个过期时间如一小时,到了这个过期时间,在 get 取数据时,此项无效。(特别注意:memcache 此时的实 现,并没有线程来主动移除过期数据,只是在 get 操作时判断数据是否过期,如是则移除。如果没有数据来 get, 内存将一直不释放,事实上,分配了的内存不会再释放到系统,而是回归到进程内的空闲内存池,这是资源管理模式的 lease + prealloc 机制)
LRU
最近最少使用更新。这个策略中,可以考虑到 expiretime,可先将 expiretime 的替换,再把 LRU 的替换。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论