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

10M的内存分给了过多的 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://www.duyumi.net/41.html?replytocom=2

Memcache 提高缓存命中率的更多相关文章

  1. [MySQL性能优化系列]提高缓存命中率

    1. 背景 通常情况下,能用一条sql语句完成的查询,我们尽量不用多次查询完成.因为,查询次数越多,通信开销越大.但是,分多次查询,有可能提高缓存命中率.到底使用一个复合查询还是多个独立查询,需要根据 ...

  2. 合理配置MySQL缓存 提高缓存命中率

    众所周知,系统读取数据时,从内存中读取要比从硬盘上速度要快好几百倍.故现在绝大部分应用系统,都会最大程度的使用缓存(内存中的一个存储区域),来提高系统的运行效率.MySQL数据库也不例外.在这里,笔者 ...

  3. 如何提高缓存命中率(Redis)

    缓存命中率的介绍 命中:可以直接通过缓存获取到需要的数据. 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作.原因可能是由于缓存中根本不存在,或者缓存已经过期. 通常来讲 ...

  4. MySQL缓存命中率概述及如何提高缓存命中率

    MySQL缓存命中率概述 工作原理: 查询缓存的工作原理,基本上可以概括为: 缓存SELECT操作或预处理查询(注释:5.1.17开始支持)的结果集和SQL语句: 新的SELECT语句或预处理查询语句 ...

  5. 关于如何提高缓存命中率(redis)

    一.缓存命中率的介绍 命中:可以直接通过缓存获取到需要的数据. 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作.原因可能是由于缓存中根本不存在,或者缓存已经过期. 通常 ...

  6. Qunar机票技术部就有一个全年很关键的一个指标:搜索缓存命中率,当时已经做到了>99.7%。再往后,每提高0.1%,优化难度成指数级增长了。哪怕是千分之一,也直接影响用户体验,影响每天上万张机票的销售额。 在高并发场景下,提供了保证线程安全的对象、方法。比如经典的ConcurrentHashMap,它比起HashMap,有更小粒度的锁,并发读写性能更好。线程安全的StringBuilder取代S

    Qunar机票技术部就有一个全年很关键的一个指标:搜索缓存命中率,当时已经做到了>99.7%.再往后,每提高0.1%,优化难度成指数级增长了.哪怕是千分之一,也直接影响用户体验,影响每天上万张机 ...

  7. 使用memcache处理缓存的三种方案

    这篇文章主要讨论的问题是:如何为项目设计一个完整而简洁的缓存系统.只讲做法,不讲原理.在我们项目中,使用到了三种方法,来保证了缓存系统的有效简洁. 1) 第一种,最常见的方式 读取数据的主要步骤如下: ...

  8. Oracle 缓存命中率问题一则(里面有个问题咨询大佬们)

    近日,核心数据库频繁抱出数据库缓存命中率过低,于是开始进行排查. 1.监控软件告警信息 2.抓取告警时间段内的awr报告进行分析 3.execute与parse命中率过低,说明分析(硬解析与软解析)的 ...

  9. Memcached的LRU和缓存命中率

    缓存命中率 命中:直接从缓存中读取到想要的数据. 未中:缓存中没有想要的数据,还需要到数据库进行一次查询才能读取到想要的数据. 命中率越高,数据库查询的次数就越少. 读取缓存的速度远比数据库查询的速度 ...

随机推荐

  1. wp8 --退出程序

    重写OnBackKeyPress事件,设置 e.cancel=true:然后加弹窗代码,为确定按钮订阅事件委托,委托方法里加Application.Current.Terminate();退出方法即可

  2. 调整Excel的打印线

  3. Android权限设置android.permission

    android.permission.ACCESS_NETWORK_STATE: 允许程序访问有关GSM网络信息(Allows applications to access information a ...

  4. oracle中如何对字符串进行去除空格的方法

    oracle中如何对字符串进行去除空格的方法 今天学习了一下oracle中如何对字符串进行去除空格的方法,这里总结一下.了解到的方法主要有两种:Trim函数以及Replace函数.下面我详细的介绍一下 ...

  5. n个元素进栈,共有多少种出栈顺序?

    1.基于栈的问题分析 我们把n个元素的出栈个数的记为f(n), 那么对于1,2,3, 我们很容易得出:                                   f(1) = 1     / ...

  6. wait、notify、notifyAll和Condition

    wait().notify()和notifyAll()是基于synchronized Condition是基于Lock的. Condition是在java 1.5中才出现的,它用来替代传统的Objec ...

  7. Underscore.js 中 _.throttle 和 _.debounce 的差异

    两个方法都是用来控制事件的频率的,在mousemove,resize等这种高频率触发事件中,控制其响应频率可以明显提高程序的流畅性,减少资源的占用. 通过分析其源代码: _.throttle方法源码 ...

  8. html5 filereader读取流注意事项

    对于截取读入的文件,一定要new FileReader,不可写全局调用同一个reader. 错误代码!!!function readAsBinaryString(file,callback){ rea ...

  9. BestCoder Round #73

    这场比赛打完后可以找何神玩了orz(orz)* T1Rikka with Chess 嘿嘿嘿.输出n/2+m/2即可. 我能说我智商捉鸡想了4min吗? T2Rikka with Graph 由于N个 ...

  10. RN组件之ViewPagerAndroid

    一.ViewPagerAndroid 1.一个允许在子视图之间左右翻页的容器.每一个ViewPagerAndroid的子容器会被视作一个单独的页,并且会被拉伸填满 ViewPagerAndroid.注 ...