Memcache 内存分配策略

memcached默认采用了名为Slab Allocator的机制分配和管理内存。
在该机制出现以前,内存的分配是通过对所有记录简单的进行mallocfree来进行了。但是这种方式会导致内存碎片化严重,加重操作系统内存管理器的负担。Slab Allocator就是位了解决该问题而诞生的。

Slab Allocator的基本原理是:按照预先规定的大小,将分配的内存以page为单位,默认情况下一个page是1M(可以通过-I参数在启动memcached的时候指定),分割成各种尺寸的块(chunk),并把尺寸相同的块(chunk)分成组(chunk集合)。如果需要申请内存时,memcached会划分出一个新的page并分配给需要的slab区域。
page一旦被分配,在memcached重启前不会被回收或者重新分配,以解决内存碎片问题。

slab的内存分配具体过程如下:
memcached在启动的时候通过-m参数指定最大内存,但是这个不会一启动就占用完,而是逐步分配给各个slab的。如果一个新的数据要被存放,首选选择一个合适的slab,然后查看该slab是否还有空闲的chunk,如果有则直接存放进去;如果没有则要进行申请,slab申请内存是以page为单位的,无论大小为多少,都会有1M大小的page被分配给该slab。
申请到page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk的组,再从这个chunk组中选择一个用于存储数据。

猜你喜欢

转载自blog.csdn.net/github_26672553/article/details/82858279