### Memcached Slab 分配器及其 LRU 机制详解 #### 第一章 前言 本文档将详细介绍 memcached 的内存管理机制,特别是 slab 分配器和 LRU(Least Recently Used)置换算法的工作原理。这些机制对于 memcached 的高效运行至关重要。 #### 第二章 Slab 机制 在 memcached 中,数据存储在一个称为 slab 的结构中。slab 可以被视为一系列固定大小的内存页的集合,每个页内包含多个 chunk。chunk 是实际用来存储缓存数据的单位,每个 slab 中的 chunk 大小相同,但不同 slab 之间的 chunk 大小不同。 - **Slab Class**: 每个 slab 被归属于一个 slab class。slab class 定义了该 slab 内的 chunk 大小。 - **Chunk**: 单个内存块,用于存储实际的缓存条目。不同 slab class 中的 chunk 大小不同。 - **Page**: 由若干个 chunk 组成的固定大小的内存块。默认情况下,每个 page 的大小为 1MB。 - **LRU**: 一种缓存淘汰策略,用于在内存不足时移除最久未使用的条目。 #### 第三章 启动参数 memcached 提供了一系列配置选项来控制其行为,尤其是内存分配方面: - **`-m`**:设定 memcached 可使用的最大内存。当内存消耗接近此值时,memcached 将开始执行 LRU 策略以释放空间。 - **`-M`**:禁用 LRU 机制。一旦达到 `-m` 设置的限制,memcached 将不再接受新的条目。 - **`-f`**:增长因子,决定了 slab class 之间 chunk 大小的增长比例。默认值为 1.25。 - **`-n`**:chunk 的最小大小。默认值为 48 字节,加上 chunk 结构本身的大小,使得最小可用的 chunk 大小为 96 字节。 - **`-L`**:一次性申请所有 `-m` 配置的最大内存。这种方式下,memcached 不会再从操作系统请求额外的内存。 - **`-I`**:每个 slab page 的大小。默认值为 1MB,但可调整至最大 128MB。 #### 第四章 详细逻辑 ##### 4.1 初始化 Slab Class 初始化 slab class 的核心函数为 `slabs_init`。该函数接收三个参数: - `maxbytes`:等同于 `-m` 参数,表示 memcached 可使用的最大内存。 - `factor`:等同于 `-f` 参数,增长因子。 - `preallocate`:等同于 `-L` 参数,决定是否一次性申请全部内存。 如果设置了 `-L` 参数,`slabs_init` 函数将尝试一次性申请 `-m` 规定的内存总量,并将这块内存的指针保存在全局变量 `mem_base` 中。之后的所有内存操作都是从这块内存中进行的。 初始化过程中还包括以下步骤: - 创建并初始化 slab class 的结构体数组,默认初始化为 200 个。 - 计算每个 slab class 中的 chunk 尺寸。 - 计算每个 slab page 可容纳的 chunk 数量,即 perslab(每页可容纳的 chunk 数量)。 ##### 4.2 申请资源 申请资源包括以下几个步骤: - **确认 class id**:根据需要存储的 item 大小选择合适的 slab class。 - **申请 chunk**:从选定的 slab class 中分配一个空闲的 chunk。 - **线程安全**:确保在并发环境下正确分配资源。 - **LRU**:维护一个 LRU 列表,确保当内存不足时,能够有效地回收最近最少使用的 chunk。 ##### 4.3 释放资源 当不再需要某个 item 时,会触发 chunk 的释放过程。释放操作通常涉及更新 LRU 列表并将 chunk 标记为可用状态,以便将来重新使用。 #### 第五章 内存分配的其它问题 ##### 5.1 LRU 策略 LRU 策略是 memcached 用于管理内存的关键部分之一。当内存消耗接近 `-m` 设置的最大值时,memcached 开始根据 LRU 算法淘汰缓存中的条目,以确保有足够的空间接受新的条目。 LRU 算法的具体实现细节包括: - 每个 slab class 维护一个 LRU 链表,链表头部是最近最常访问的 chunk,尾部则是最近最少使用的 chunk。 - 当需要释放内存时,memcached 从每个 slab class 的 LRU 链表尾部开始删除 chunk,直到释放足够的空间为止。 - 如果启用了 `-M` 参数,则不会执行 LRU 淘汰,而是拒绝新的条目。 通过理解 memcached 的 slab 分配器和 LRU 算法的工作原理,可以更好地配置和优化 memcached 在特定环境下的性能。
- heyhehey2012-12-10非常有帮助的文章 ,不错!
- 粉丝: 88
- 资源: 48
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助