返回介绍

5.2 内存分配 slab allocation

发布于 2024-10-02 23:16:37 字数 1685 浏览 0 评论 0 收藏 0

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:为影响因子,可变。

memcached

缓存查找 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 值可能不同,有碰撞,可用拉链法解决)

效率评价:内存分配虽有部分浪费,但可重复使用。

缓存更新机制

  1. 内存未使用完之前,只通过 expiretime 进行更新。
  2. 内存使用完后,将通过 expiretime 和 LRU 进行更新。

expiretime

过期时间,是指每个缓存项都有设置一个过期时间如一小时,到了这个过期时间,在 get 取数据时,此项无效。(特别注意:memcache 此时的实 现,并没有线程来主动移除过期数据,只是在 get 操作时判断数据是否过期,如是则移除。如果没有数据来 get, 内存将一直不释放,事实上,分配了的内存不会再释放到系统,而是回归到进程内的空闲内存池,这是资源管理模式的 lease + prealloc 机制)

LRU

最近最少使用更新。这个策略中,可以考虑到 expiretime,可先将 expiretime 的替换,再把 LRU 的替换。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文