memcache内存估算整理

memcache内存分配三个重要的概念: 
1.page 
系统分配给slab的内存空间(对应实际的物理空间),1个page默认为1M,可以使用-I参数进行调解(default: 1mb, min: 1k, max: 128m),分配给Slab之后根据chunk的大小切分成大小相同的chunk空间,chunk用于缓存记录。 
2.Chunk 
为固定大小的内存空间,默认为96Byte,可以使用-n参数进行调节,默认的-f大小为1.25,即每个slab的chunk大小会以1.25倍的大小增长 
3. slab class 
同样大小的chunk又称为slab class。

三个重要的参数 -m -f -n 
-m 分配的最大内存 
-f slab class(chunk组)的增长因子 
-n ( slab class 1中)chunk的初始大小

memcached -f 2 -vv命令看以看到,当增长因子为2(默认为1.25)的时候可以分配的slab class

test:~$ memcached -f 2 -vv
slab class   1: chunk size        96 perslab   10922
slab class   2: chunk size       192 perslab    5461
slab class   3: chunk size       384 perslab    2730
slab class   4: chunk size       768 perslab    1365
slab class   5: chunk size      1536 perslab     682
slab class   6: chunk size      3072 perslab     341
slab class   7: chunk size      6144 perslab     170
slab class   8: chunk size     12288 perslab      85
slab class   9: chunk size     24576 perslab      42
slab class  10: chunk size     49152 perslab      21
slab class  11: chunk size     98304 perslab      10
slab class  12: chunk size    196608 perslab       5
slab class  13: chunk size    393216 perslab       2
slab class  14: chunk size   1048576 perslab       1
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

chunk size(slab class i)=(default_size+item_size)*f^(i-1)+ CHUNK_ALIGN_BYTES 
default_size: 默认大小为48字节,也就是memcached默认的key+value的大小为48字节; 
item_size: item结构体的长度,默认为48字节,可以通过-n参数调节; 
CHUNK_ALIGN_BYTES是一个修正值,用来保证chunk的大小是某个值的整数倍。

假设要存储100bytes的item 
1、首先会找到包含其大小的chunk组,即slab class 2 
2、如果slab class 2已经存在同时也还有chunk空闲,即将item存储在此 
3、如果没有分配slab class 2的page或分配的chunk已满,则由系统重新分配一个page,设置其为slab class 2大小,并将item存储在此。

当使用stats slabs命令查看时,可以看到memcache所分配的slab class

memcached -p 50013 -l 0.0.0.0 -d -m 32 -f 1.001 -n 256 
如果-f的值是1.001即每个slab的大小都一样时,使用命令就只有STAT 1,class 1的大小为 256+48

stats slabs
STAT 1:chunk_size 304         //slab class 1的chunk大小,256+48=304 byte
STAT 1:chunks_per_page 3449   //每个page能存储的chunk数,1M/304byte = 1024*1024/304 = 3449,多余的空间会被浪费
STAT 1:total_pages 3          //分配给slab class 1的page数,即3M
STAT 1:total_chunks 10347     //总共分配的chunk数,3449 * 3
STAT 1:used_chunks 8194
STAT 1:free_chunks 1    //过期数据空出的chunk里还没有被使用的chunk数
STAT 1:free_chunks_end 2152   //分配了但是还没有被使用的chunk数
STAT 1:mem_requested 1001154  
STAT 1:get_hits 5681468
STAT 1:cmd_set 571263
STAT 1:delete_hits 0
STAT 1:incr_hits 0
STAT 1:decr_hits 0
STAT 1:cas_hits 0
STAT 1:cas_badval 0
STAT 1:touch_hits 0
STAT active_slabs 1
STAT total_malloced 3145488   //总共分配的内存大小 ,10347*34
END
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

如果free_chunks_end的数过大,表明这部分slab内存不能有效的利用;如果过小表明很快就不够用了;两种情况都需要做调整来使内存达到合理的利用。

memcached -p 50013 -l 0.0.0.0 -d -m 32 (-f 1.25 -n 48) 
当有一定的增长因子时,如按默认的1.25,查看slab时就会出现不同的slab class信息,-f -n使用默认值

stats slabs
STAT 1:chunk_size 96
STAT 1:chunks_per_page 10922
STAT 1:total_pages 1
STAT 1:total_chunks 10922
STAT 1:used_chunks 9
STAT 1:free_chunks 1
STAT 1:free_chunks_end 10912
STAT 1:mem_requested 818
STAT 1:get_hits 5
STAT 1:cmd_set 139
STAT 1:delete_hits 1
STAT 1:incr_hits 0
STAT 1:decr_hits 0
STAT 1:cas_hits 0
STAT 1:cas_badval 0
STAT 2:chunk_size 120
STAT 2:chunks_per_page 8738
STAT 2:total_pages 1
STAT 2:total_chunks 8738
STAT 2:used_chunks 24
STAT 2:free_chunks 0
STAT 2:free_chunks_end 8714
STAT 2:mem_requested 2794
STAT 2:get_hits 1
STAT 2:cmd_set 60
STAT 2:delete_hits 0
STAT 2:incr_hits 0
STAT 2:decr_hits 0
STAT 2:cas_hits 0
STAT 2:cas_badval 0
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

slab class的分配并不是按照顺序来分配的,所有当有不同的slab class时,使用stats slabs查看可能会出现 
STAT 1 
…… 
STAT 2 
…… 
STAT 5 
……. 
STAT 9 
…….

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值