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
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 提高缓存命中率的更多相关文章
- [MySQL性能优化系列]提高缓存命中率
1. 背景 通常情况下,能用一条sql语句完成的查询,我们尽量不用多次查询完成.因为,查询次数越多,通信开销越大.但是,分多次查询,有可能提高缓存命中率.到底使用一个复合查询还是多个独立查询,需要根据 ...
- 合理配置MySQL缓存 提高缓存命中率
众所周知,系统读取数据时,从内存中读取要比从硬盘上速度要快好几百倍.故现在绝大部分应用系统,都会最大程度的使用缓存(内存中的一个存储区域),来提高系统的运行效率.MySQL数据库也不例外.在这里,笔者 ...
- 如何提高缓存命中率(Redis)
缓存命中率的介绍 命中:可以直接通过缓存获取到需要的数据. 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作.原因可能是由于缓存中根本不存在,或者缓存已经过期. 通常来讲 ...
- MySQL缓存命中率概述及如何提高缓存命中率
MySQL缓存命中率概述 工作原理: 查询缓存的工作原理,基本上可以概括为: 缓存SELECT操作或预处理查询(注释:5.1.17开始支持)的结果集和SQL语句: 新的SELECT语句或预处理查询语句 ...
- 关于如何提高缓存命中率(redis)
一.缓存命中率的介绍 命中:可以直接通过缓存获取到需要的数据. 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作.原因可能是由于缓存中根本不存在,或者缓存已经过期. 通常 ...
- Qunar机票技术部就有一个全年很关键的一个指标:搜索缓存命中率,当时已经做到了>99.7%。再往后,每提高0.1%,优化难度成指数级增长了。哪怕是千分之一,也直接影响用户体验,影响每天上万张机票的销售额。 在高并发场景下,提供了保证线程安全的对象、方法。比如经典的ConcurrentHashMap,它比起HashMap,有更小粒度的锁,并发读写性能更好。线程安全的StringBuilder取代S
Qunar机票技术部就有一个全年很关键的一个指标:搜索缓存命中率,当时已经做到了>99.7%.再往后,每提高0.1%,优化难度成指数级增长了.哪怕是千分之一,也直接影响用户体验,影响每天上万张机 ...
- 使用memcache处理缓存的三种方案
这篇文章主要讨论的问题是:如何为项目设计一个完整而简洁的缓存系统.只讲做法,不讲原理.在我们项目中,使用到了三种方法,来保证了缓存系统的有效简洁. 1) 第一种,最常见的方式 读取数据的主要步骤如下: ...
- Oracle 缓存命中率问题一则(里面有个问题咨询大佬们)
近日,核心数据库频繁抱出数据库缓存命中率过低,于是开始进行排查. 1.监控软件告警信息 2.抓取告警时间段内的awr报告进行分析 3.execute与parse命中率过低,说明分析(硬解析与软解析)的 ...
- Memcached的LRU和缓存命中率
缓存命中率 命中:直接从缓存中读取到想要的数据. 未中:缓存中没有想要的数据,还需要到数据库进行一次查询才能读取到想要的数据. 命中率越高,数据库查询的次数就越少. 读取缓存的速度远比数据库查询的速度 ...
随机推荐
- centos7下安装vsftpd配置
0. 首先安装ftp服务 yum install -y ftp 1. 通过yum install -y vsftp安装vsftp 2. 修改vi /etc/vsftpd/vsftpd.conf, ...
- thinkphp where()条件查询
今天来给大家讲下查询最常用但也是最复杂的where方法,where方法也属于模型类的连贯操作方法之一,主要用于查询和操作条件的设置.where方法的用法是ThinkPHP查询语言的精髓,也是Think ...
- Android 返回键双击退出程序
/** * 菜单.返回键响应 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == K ...
- Web安全性测试总结
一.工具扫描 目前web安全扫描器针对 XSS.SQL injection .OPEN redirect .PHP File Include漏洞的检测技术已经比较成熟. 商业软件web安全扫描器:有I ...
- Lazy Acquisition
为什么要延迟? 延迟加载模式是用于快速启动.保证初始化时不必浪费时间去加载和运算,而在需要的时候再去调用. 框架中有实现吗? .NET典型的使用在4.0中已经有了,Lazy<T> 特性:线 ...
- ural 1306. Sequence Median
1306. Sequence Median Time limit: 1.0 secondMemory limit: 1 MBLanguage limit: C, C++, Pascal Given a ...
- hbase0.95.2部署
hbase0.95.2部署 下载安装包 hbase-0.95.2-cdh5.0.0-beta-1.tar.gz hbase需对应hadoop版本 解压 tar zxvf hbase-0.95.2-cd ...
- BZOJ3829 : [Poi2014]FarmCraft
d[x]表示走完x的子树并回到x所需的时间 f[x]表示从走到x开始计时,x子树中最晚的点安装完的最早时间 d[x]=sum(d[i]+2),i是x的孩子 f[x]的计算比较复杂: 考虑将x的各棵子树 ...
- Java集合的线程安全用法
线程安全的集合包含2个问题 1.多线程并发修改一 个 集合 怎么办? 2.如果迭代的过程中 集合 被修改了怎么办? a.一个线程在迭代,另一个线程在修改 b.在同一个线程内用同一个迭代器对象进行迭代. ...
- 20145315 《Java程序设计》实验五实验报告
20145315 <Java程序设计>实验五实验报告 实验五 Java网络编程 我负责服务器部分,王嘉澜负责客户端部分:http://www.cnblogs.com/SJZGM10/p/5 ...