zoukankan      html  css  js  c++  java
  • Memcache 提高缓存命中率

    最近手上某个项目跟新代码,新的代码里大量采用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

  • 相关阅读:
    Python 正则表达式简单了解
    scrapy 框架简单 爬取 4K高清 壁纸
    解决验证注解随机问题
    @ConfigurationProperties
    ConstraintValidator自定义注解
    通过日志解读Spring-Mybatis执行顺序
    Spring整合mybatis配置文件
    设计模式——代理模式
    Mybatis框架配置
    设计模式——单例模式
  • 原文地址:https://www.cnblogs.com/lidj/p/5265684.html
Copyright © 2011-2022 走看看