Memcache 提高缓存命中率

mac2022-06-30  23

最近手上某个项目跟新代码,新的代码里大量采用memcahce作为缓存。所以开始深入了解memcache的内存分配策略。以前就听说有个PHP写的memcache监控脚本,在网上搜索了一下,果断下载下来用 memcache.php修改一下php文件代码配置

? 1 2 3 4 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

? 1 2 #        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

? 1 2 3 4 5 6 7 8 9 [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

? 1 2 3 [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

? 1 2 3 4 5 [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,问题解决了

来源:http://my.oschina.net/u/231017/blog/303686

转载于:https://www.cnblogs.com/lidj/p/5265684.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)