Memcached Slab分配器:零碎片的极速内存管理
Memcached 的内存分配器采用 Slab Allocation 机制管理内存,其工作原理如下:
⚙️ 一、内存分配器工作原理
-
三级内存结构
- Page(页):内存分配基本单位,默认为 1MB。启动时按需分配,不被回收。
- Slab Class(分片类):每个 Page 划分给特定 Slab Class,Slab Class 按 固定比例(默认 1.25)递增 chunk 大小。
- Chunk(块):存储数据的固定单元,大小由所属 Slab Class 决定(如 96B/120B/…)。
-
数据存储流程
- 新数据写入时,匹配能容纳其大小的最小 Chunk(如 230B 数据匹配 280B Chunk)。
- 若 Slab Class 无空闲 Chunk,分配新 Page 分割为 Chunk 数组。
- 释放数据后,Chunk 标记为空闲,原地复用不归还 OS。
-
内存池特性
- 所有 Chunk 大小固定,避免内存碎片。
- 通过
stats slabs
命令监控各 Slab Class 利用率。
❌ 二、为什么不使用 malloc/free?
问题 | malloc/free 缺陷 | Slab 解决方案 |
---|---|---|
内存碎片 | 频繁分配释放 → 外部碎片 → 内存利用率↓ | 固定大小 Chunk → 零碎片 |
性能瓶颈 | 高并发时锁竞争开销大 → 响应延迟↑ | 无锁操作空闲链表 → 微秒级分配 |
OS 负担 | OS 需搜索连续内存块 → 挤压应用资源 | 应用层自主管理 → 减少 OS 交互 |
不确定性 | 执行时间不可预测 → 实时性差 | 恒定时间分配 → 高确定性 |
🔧 三、为何使用 Slabs?
-
根治内存碎片
通过 预分割固定大小 Chunk,消除外部碎片,内存利用率趋近 100%。 -
极速分配性能
- 分配操作简化为 空闲链表指针移动,速度比 malloc 快 10 倍以上。
- 无锁设计适应高并发场景。
-
CPU 缓存友好
同尺寸 Chunk 连续存储 → 提升 CPU 缓存命中率。 -
精细资源控制
- 通过
-f
调节 Chunk 增长因子,优化业务数据类型匹配。 - 内存超限时自动淘汰旧数据(LRU)。
- 通过
💡 本质取舍:Slab 以 少量内部碎片(如 230B 数据用 280B Chunk)换取 零外部碎片+超高分配性能,完美契合缓存系统的高吞吐需求。