memcached内存管理

本文详细解释了Memcached中chunk、page及stabclass的概念,并通过具体实例展示了它们如何共同作用于内存分配,确保数据高效缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结下我对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使用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值