最近手上某个项目跟新代码,新的代码里大量采用memcahce作为缓存。所以开始深入了解memcache的内存分配策略。以前就听说有个PHP写的memcache监控脚本,在网上搜索了一下,果断下载下来用 memcache.php。
修改一下php文件代码配置
define(‘ADMIN_USERNAME’,‘admin’); define(‘ADMIN_PASSWORD’,‘admin’); $MEMCACHE_SERVERS[] = ’127.0.0.1:11211′; $MEMCACHE_SERVERS[] = ’127.0.0.1:11212′;//可以多个监控
问题出现了
发现命中率 以每天0.5%的速度下降 从原来的97%下降到了94%。
Misses 的个数增长飞快。
从监控的Variables看出,几乎所有的items都集中在slab2里,有将近8737个Item。
那么问题肯定出现在slab2所缓存的数据上面。
开始查找问题~
从网上下载了一个memcached统计工具memcache-tool
在linux下运行 memcached-tool 127.0.0.1:11211
# Item_Size Max_age Pages Count Full? Evicted slabId chunk的大小 生命周期 page数量 缓存项个数 是否已满 被注销数?
看来slab 2 类的 page 数据储存已满 ,但page的个数并没有增加,count已达到8738.
memcache守护进程为
memcached -d -m 10 -u root -p 11211
分配的内存只有10M , Chunk的Size 的倍数因子 -f 为默认的1.25
[root@]# memcached -u root -vv slab class 1: chunk size 96 perslab 10922 slab class 2: chunk size 120 perslab 8738 slab class 3: chunk size 152 perslab 6898 slab class 4: chunk size 192 perslab 5461 slab class 5: chunk size 240 perslab 4369 slab class 6: chunk size 304 perslab 3449 slab class 7: chunk size 384 perslab 2730 slab class 8: chunk size 480 perslab 2184
0M的内存分给了过多的 slab,导致每个slab的pages 最多只能有1个,无法增加pages。
slab2的 count 已经达到了所能容纳的最高值8738。不断的有缓存数据被Evicted。
解决问题
新开一个memcache守护进程
memcached -d -m 10 -f 2 -u root -p 11212
在项目代码中将所有使用memcache 11211 slab2 的缓存数据 接口地址改为 11212
[root@ ~]# /home/duyumi/memcached-tool 127.0.0.1:11212 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 2 192B 5190s 2 8001 no 0 0 0
pages数增加为2,count达到了8001,并没有full,一个page的最大chunk为5461,每个chunk的大小为192B
[root@ ~]# memcached -u root -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 ....
缓存项并没有被Evicted。
ok,问题解决了
Memcache 提高缓存命中率,布布扣,bubuko.com
原文:http://my.oschina.net/u/231017/blog/303686