总结下我对memcached的内存管理的理解,有不对的地方请不吝指正^_^。
我用的版本是最新的1.4.5
chunk:咱cache数据的地方,数据的大小不能超过1M。
page:分配给stab class的内存页,默认为1M,chunk的内存就是在这上面划分出去的。
stab class:很多相同size的chunk在一起组成一个stab class。
memcached和这三者之间的关系:
memcached启动时会按尺寸生成一组stab class,stab class的数量是根据你设置的参数决定的,在整个生命周期内不会再新增。
每个stab class在启动时会预分配一个page,在这个page上划分特定size的chunk。
当一个stab class的chunk使用完成后,memcached会查找是否有空余page可以使用,如果有则将page加入该stab class,没有则执行LRU(前提是你没有使用 -M参数启动)。
注意:
LRU是针对stab class的,不是全memcached的。
看一个具体的例子
[root@p2ash004 ~]# memcached -p 11211 -u root -m256 -n 512 -vv
slab class 1: chunk size 560 perslab 1872
slab class 2: chunk size 704 perslab 1489
slab class 3: chunk size 880 perslab 1191
slab class 4: chunk size 1104 perslab 949
slab class 5: chunk size 1384 perslab 757
slab class 6: chunk size 1736 perslab 604
slab class 7: chunk size 2176 perslab 481
slab class 8: chunk size 2720 perslab 385
slab class 9: chunk size 3400 perslab 308
slab class 10: chunk size 4256 perslab 246
slab class 11: chunk size 5320 perslab 197
slab class 12: chunk size 6656 perslab 157
slab class 13: chunk size 8320 perslab 126
slab class 14: chunk size 10400 perslab 100
slab class 15: chunk size 13000 perslab 80
slab class 16: chunk size 16256 perslab 64
slab class 17: chunk size 20320 perslab 51
slab class 18: chunk size 25400 perslab 41
slab class 19: chunk size 31752 perslab 33
slab class 20: chunk size 39696 perslab 26
slab class 21: chunk size 49624 perslab 21
slab class 22: chunk size 62032 perslab 16
slab class 23: chunk size 77544 perslab 13
slab class 24: chunk size 96936 perslab 10
slab class 25: chunk size 121176 perslab 8
slab class 26: chunk size 151472 perslab 6
slab class 27: chunk size 189344 perslab 5
slab class 28: chunk size 236680 perslab 4
slab class 29: chunk size 295856 perslab 3
slab class 30: chunk size 369824 perslab 2
slab class 31: chunk size 462280 perslab 2
slab class 32: chunk size 577856 perslab 1
slab class 33: chunk size 722320 perslab 1
slab class 34: chunk size 1048576 perslab 1
在这里,我给memcached分配了256M内存(-m 256),chunk的初始值设置为512bytes(-n 512)
slab class 1: chunk size 560 perslab 1872
为什么chunk size 是560呢?因为还有48bytes来存储结构信息。
slab class 2: chunk size 704 perslab 1489
no:2的chunk size 为 704,是因为默认的增长因子是1.25,704 = 560 * 1.25 +4,后面的+4是为了内存对齐,保证为8的倍数。
no:n就类推就可以了。
我们可以看到memcached一个预生成了34个slab class,每个slab class占用1M内存(也就是预分配了一个page)。
还有(256-34=222)个page是可以根据需要分配给各个slab class使用的。