memcached的内存管理机制Slab Allocation

memcached的内存管理机制Slab Allocation是怎么回事?

喜欢这个问题 | 分享 | 新建回答

回答

jerkzhang

Jun 18, 2020
0 赞

Memcached是基于内存进行缓存的,而具体的内存管理方式则是基于Slab Allocation机制。本文参考《Memcached内存管理》




Memcached 内存管理

Memcached的内存管理使用的是Slab Allocation方式。该机制出现前,内存的分配若简单地使用malloc和free来进行,则很容易导致内存碎片,加重对内存资源的消耗。

而Slab Allocation的基本原理则是将分配的内存分割成各种尺寸的块(chunk);并把尺寸相同的块(chunk)分成组(chunk的集合)。这种特定大小的组就是下图中的某个Slab;而分配给单个Slab的内存空间,就是所谓的Page;Memcached中默认的Page大小为1MB。

Memcached内存管理

当Memcached要把某个数据存入内存中,则会根据该数据的大小,选择最适合该数据大小的Slab中的某个空闲的块(chunk)进行数据缓存。




Slab Allocation的不足之处

Slab Allocation机制也是存在一些弱点的,比如将108字节(byte)的数据存入128字节大小的chunk块中,则剩余的20字节的内存则无法利用,也就是被浪费了。目前该问题还没有完美的解决方案,不过还是根据具体情况,使用growth factor进行优调。

但是这里并不建议这种方式,不应该把精力花在这个细节问题上,这里唯一推荐的解决方式就是用钱砸,简单、直接、有效。




另外,Slab Allocation是会重复使用已分配的内存,因此被分配到的内存是不会释放,而是留着继续重复使用。正因为这种机制,Memcached的进程的稳定性相对都很高。