memcache遭遇out of memory错误

现象比较很灵异,设置一个很小的value的时候就会出现这个错误

[root@slave1 bin]# telnet localhost 11211 Trying 127.0.0.1... Connected to localhost (127.0.0.1). Escape character is '^]'. set key1 0 0 2 SERVER_ERROR out of memory

如果设置一个较大的value,反而Stored成功。

翻看了几篇关于memcache内存分配的介绍,大概有一些了解。

其中后一篇有实际操作的介绍,更为实用。根据个人理解先写个大概。

Memcache为了避免产生内存碎片,采用Slab Allocation机制来整理内存。比如某前端机分配了1G内存给memcache,那么它会将内存按照不同尺寸的小块(chunk)分成若干个组(classes),组的数目不是很固定,每个组分配1M内存。见下图:

当一条记录插入memcache中的时候,首先会寻找一个合适的能足够容纳这条记录的class。比如你insert一条100字节的数据,它会使用128字节的class来存储这条记录,只有28字节被浪费。

如果用memcached-tool来查看memcache的使用情况,会看到类似下面列出的情况。

[root@sql-slave1 bin]# ./memcached-tool localhost
# Item_Size 	Max_age		1MB_pages	Full?
6 64 B 		0 s 		0 		no
7 128 B 	742970 s 	4 		yes
8 256 B		1174852 s 	2 		yes
9 512 B		1279658 s 	1 		yes
10 1 kB		6494118 s 	1 		yes
11 2 kB 	434918 s 	71 		yes
12 4 kB 	917228 s 	140 	yes
13 8 kB 	794192 s 	30 		no
14 16 kB	1373208 s 	6 		yes
15 B 		0 s 		0 		yes
16 B 		0 s 		0 		yes

此时插入一条很小的记录,比如只有2个字节,那么memcache会尝试用最小的class(64字节)来保存这条记录,这时候由于64字节的class已满或未分配内存,写入数据的时候就会遭遇到前面所说的out of memcache错误了。

更糟糕的是,这时候增加cache大小似乎也不能解决问题。可行的办法是利用memcached-tool对内存进行移动操作:

[root@sql-slave1 bin]# ./memcached-tool localhost move 14 6

上面的操作会移动class 14的一个page到class 6。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值