Memcached作为一个主要用作访问加速的不落地Cache,其内存主要是使用程序上的堆内存(heap memory),而且内存一旦分配不再释放;同时为了加速对对应内存块访问,采用了Hash桶管理内存的方式;在数据淘汰算法方面使用了LRU。 Memcached的内存分配是按照对于相同的页大小(1MB)分割成相同大小的Chunk实现的,对于不同的slab组,只是体现在具体的Chunk大小不同,每一组slab可以包含若干多的页内存。slab组的定义如下: static slabclass_t slabclass[POWER_LARGEST+1]; 所有的内存分配都给予这个全局静态变量,下边说明一下单个slabclass结构体中各个变量的定义: typedef struct { } slabclass_t; size:指当前slabclass中页内存中chunk块的大小,也就是单个item的大小; perslab:指一个页内存中可以划分为多少个chunk块,大小为1M/2^currentId,currentId指的是当前slab在slabclass的数组索引号。 slots:指向free chunk块的指针数组,slots的指针指向一个void *的数组,该数组中的每一个元素的内容均指向一个空闲的chunk块,而且相同slabclass上的所有slab中的free chunk块均挂接到这个链表上; sl_total:当前slots指针数组的大小,如果大小不够则将以2*sl_total的大小重新分配; sl_curr:指向当前空闲数组链表的{dy}个可用位置; end_page_ptr:指向当前slabclass中{zh1}分配的内存页的{dy}个可用chunk的地址,或者指向NULL表示目前的内存页已经用完; end_page_free:当前slabclass中{zh1}分配的内存也中下一个可用chunk的索引位置; slabs:当前slabclass中分配的页内存个数; slab_list:当前slabclass所分配的页内存(slab)的指针数组,每一个数组元素的内容均是一个指向页内存地址的指针; list_size:当前分配的内存页的个数; killing:在slab assign的过程中会用到。 http://blog.sina.com.cn/s/blog_4d6f62190100gwiz.html |