最近手上某个项目跟新代码,新的代码里大量采用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. AppPoolService-IIS应用程序池辅助类(C#控制应用程序池操作)

    using System.Collections.Generic; using System.DirectoryServices; using System.Linq; using Microsoft ...

  2. Oracle11完全卸载方法 deinstall.bat如何用以及如何删除oracle注册表

    转自:http://blog.sina.com.cn/s/blog_68fe7e15010100an.html 之前因为不知道偶电脑是因为安装了oracle后,才导致的长达两周的开机速度要足足10分钟 ...

  3. 理解HTTP session原理及应用

    转自:http://www.2cto.com/kf/201206/135471.html 一.术语session在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣 ...

  4. 复制表结构和数据SQL语句

    select * into 目标表名 from 源表名 insert into 目标表名(fld1, fld2) select fld1, 5 from 源表名 以上两句都是将 源表 的数据插入到 目 ...

  5. VMware安装、配置CentOS

    出处:http://www.cnblogs.com/jlily/ 1. 准备CentOS安装镜像文件 官网下载地址:http://www.centos.org/download/ 官方有三个版本:DV ...

  6. Hark的数据结构与算法练习之煎饼排序

    算法说明 假设煎锅里边有N个煎饼摞在了一起,它们大小不一并且顺序不一致,我们需要通过拿铲子将它们不停的翻个,进行排序,最终得到一个底下是大的煎饼,上边是小的煎饼的序列.这个排序的过程就是煎饼排序. 这 ...

  7. poj 1611 The Suspects 并查集

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 30522   Accepted: 14836 De ...

  8. lua if

    function fact(n) then else ) end end print("输入一个数") a=io.read("*number") print(f ...

  9. BZOJ4032 : [HEOI2015]最短不公共子串

    第一问: 对B串建立SAM,暴力枚举A的每个子串,在SAM上走,若失配则可行. 第二问: 设g[i][j]表示B串的第i个字符之后最早出现的字符j的位置,暴力枚举A的每个子串,按照g贪心地走,若失配则 ...

  10. BZOJ3939 : [Usaco2015 Feb]Cow Hopscotch

    设f[i][j]表示到(i,j)的方案数,则有 $f[i][j]=\sum f[x][y](x<i,y<j,a[x][y]!=a[i][j])=\sum f[x][y](x<i,y& ...