Memcached的内存分配算法

100 阅读2分钟

Memcached 使用了一种名为 Slab Allocation 的内存分配算法。Slab Allocation 是为了避免内存碎片化问题,并提高内存分配和释放的效率而设计的。以下是对 Slab Allocation 的详细解释:

Slab Allocation 概述

Slab Allocation 将内存预先划分为大小固定的块(slabs),每个 slab 又进一步划分为大小相同的单元(chunks)。每个 chunk 用来存储一个缓存对象。Memcached 根据缓存对象的大小,将其分配到合适大小的 slab 中。

Slab Allocation 工作原理

  1. 预先划分内存

    • Memcached 启动时,将可用内存划分为多个 slab,每个 slab 的大小是固定的。
    • 每个 slab 中包含多个大小相同的 chunk。
  2. 分配 slab class

    • Slabs 按照一定的增长因子,形成不同的大小类别(class)。
    • 例如,增长因子为 1.25,第一个 slab class 的 chunk 大小为 96 字节,则第二个 slab class 的 chunk 大小为 120 字节,以此类推。
  3. 存储数据

    • 当有数据需要缓存时,Memcached 根据数据大小选择合适的 slab class,将数据存储在该 class 的一个空闲 chunk 中。
  4. 内存复用

    • 当缓存数据过期或被删除时,其所在的 chunk 会被标记为空闲,以便新的数据存储时复用。

优点

  • 减少内存碎片化:通过固定大小的 slab 和 chunk,减少了由于不同大小的对象频繁分配和释放而导致的内存碎片化问题。
  • 高效的内存管理:预先分配和复用内存块,提高了内存分配和释放的效率。
  • 简单性:Slab Allocation 简化了内存管理逻辑,便于实现和维护。

示例

假设 Memcached 配置了 64MB 的内存,增长因子为 1.25,slab class 初始大小为 96 字节。则 slab class 和 chunk 的大小如下:

  1. 第一个 slab class:chunk 大小为 96 字节。
  2. 第二个 slab class:chunk 大小为 120 字节(96 * 1.25)。
  3. 第三个 slab class:chunk 大小为 150 字节(120 * 1.25)。
  4. 依此类推。

当一个 100 字节的数据需要缓存时,Memcached 会选择第二个 slab class,将数据存储在一个 120 字节的 chunk 中。

结论

Slab Allocation 是 Memcached 高效内存管理的核心算法,通过固定大小的内存块和增长因子策略,有效减少了内存碎片化,提高了内存分配和复用的效率。这使得 Memcached 在处理大量小对象缓存时,能够保持高效和稳定的性能。