多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 4.3 memcached的内存管理 最近的 memcached 默认情况下采用了名为 Slab Allocator 的机制分配、管理内存。在该机制出现以 前,内存的分配是通过对所有记录简单地进行 malloc 和 free 来进行的。但是,这种方式会导致内存 碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比 memcached 进程本身还 慢。Slab Allocator 就是为解决该问题而诞生的。 下面来看看 Slab Allocator 的原理。 下面是 memcached 文档中的 slab allocator 的目标: >the primary goal of the slabs subsystem in memcached was to eliminate memory fragmentation issues totally by using fixed­size memory chunks coming from a few predetermined size classes. 也就是说,Slab Allocator 的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块, 以完全解决内存碎片问题。 Slab Allocation 的原理相当简单。将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块 分成组(chunk 的集合) ![](https://img.kancloud.cn/49/27/4927e12dd85486012fbef7186a0771ba_914x684.png) 而且,slab allocator 还有重复使用已分配的内存的目的。也就是说,分配到的内存不会释放,而是重复利用。 Slab Allocation 的主要术语 `Page` 分配给 Slab 的内存空间,默认是 1MB。分配给 `Slab` 之后根据 slab 的大小切分成 chunk。 `Chunk` 用于缓存记录的内存空间。 `Slab Class 特定大小的 chunk 的组。 下面说明 memcached 如何针对客户端发送的数据选择 slab 并缓存到 chunk 中。 memcached 根据收到的数据的大小,选择最适合数据大小的 slab。memcached 中保存着 slab 内空闲 chunk 的列表,根据该列表选择 chunk,然后将数据缓存于其中。 ![](https://img.kancloud.cn/d9/39/d9395eb47a314aa6aa6a21e5c7e89033_674x476.png)