转载:http://hi.baidu.com/software_one/blog/item/df09f126addddd218644f959.html
Memcached作为一个内存key-value存储容器有非常优秀的性能,但是在上次的使用中确发现大量的数据丢失情况发生,导致cache的功能基本消失。具体的检测方式如下:检测命中率
检测命中率是一个最基本的、最宏观的方式,使用telnet连接到memcached服务器,然后执行stats命令就可以看到宏观的一些信息,如下图。
这个命令中比较关键的属性是get_hits和get_misses,get_hits表示读取cache命中的次数,get_misses是读取失败的次数,即尝试读取不存在的缓存数据。
命中率=get_hits / (get_hits + get_misses)
命
中率越高说明cache起到的缓存作用越大。但是在实际使用中,这个命中率不是有效数据的命中率,有些时候get操作可能只是检查一个key存在不存在,
这个时候miss也是正确的,这就像用memcached作为一种定时器,将一些临时数据在memcache中存放特定时间长度,业务逻辑会根据
cache是否存在而作不同的逻辑,这种数据其实已经不是单纯的缓存了,也不应该统计到命中率中。再者,这个命中率是从memcached启动开始所有的
请求的综合值,不能反映一个时间段内的情况,所以要排查memcached的性能问题,还需要更详细的数值。但是高的命中率还是能够反映出
memcached良好的使用情况,突然下跌的命中率能够反映大量cache丢失的发生。
Stats items
Stats items命令可以查看每个slab中存储的item的一些详细信息,具体可以见下图。
关键属性有:
number |
存放的数据总数 |
age |
存放的数据中存放时间最久的数据已经存在的时间,以秒为单位 |
evicted |
被剔除的数据总数 |
evicted_time |
最后被剔除的数据在cache中存放的时间,以秒为单位 |
stats
items可以详细的观察各slab的数据对象的情况,因为memcached的内存分配策略导致一旦memcached的总内存达到了设置的最大内存,
代表所有的slab能够使用的page都已经固定,这个时候如果还有数据放入,将开始导致memcached使用LRU策略剔除数据。而LRU策略不是针
对所有的slabs,而是只针对新数据应该被放入的slab,例如有一个新的数据要被放入slab 3,则LRU只对slab 3进行。通过stats
items就可以观察到这些剔除的情况。
具体分析如下:
evicted属性
如果一个slab的evicted属性不是0,则说明当前slab出现了提前剔除数据的情况,这个slab可能是你需要注意的。evicted_time属性
如
果evicted不为0,则evicited_time就代表最后被剔除的数据时间缓存的时间。并不是发生了LRU就代码memcached负载过载了,
因为有些时候在使用cache时会设置过期时间为0,这样缓存将被存放30天,如果内存慢了还持续放入数据,而这些为过期的数据很久没有被使用,则可能被
剔除。需要注意的是,最后剔除的这个数据已经被缓存的时间,把evicted_time换算成标准时间看下是否已经达到了你可以接受的时间,例如:你认为
数据被缓存了2天是你可以接受的,而最后被剔除的数据已经存放了3天以上,则可以认为这个slab的压力其实可以接受的;但是如果最后被剔除的数据只被缓
存了20秒,不用考虑,这个slab已经负载过重了。age属性
age属性反应了当前还在缓存的数据中最久的
时间,它的大小和evicted_time没有必然的大小关系,因为可能时间最久的数据确实频繁被读取的,这时候不会被LRU清理掉,但是如果它小于
evicted_time的话,则说明数据在被下去读取前就被清理了,或者存放了很多长时间但是不被使用的缓存对象。Stats slabs
从Stats items中如果发现有异常的slab,则可以通过stats slabs查看下该slab是不是内存分配的确有问题。
Stats slabs结果如下图
Stats slabs的属性说明如下:
chunk_size |
当前slab每个chunk的大小 |
chunk_per_page |
每个page能够存放的chunk数 |
total_pages |
分配给当前slab的page总数 |
total_chunks |
当前slab最多能够存放的chunk数,应该等于chunck_per_page * total_page |
used_chunks |
已经被占用的chunks总数 |
free_chunks |
过期数据空出的chunk里还没有被使用的chunk数 |
free_chunks_end |
新分配的但是还没有被使用的chunk数 |
这个命令的信息量很大,所有属性都很有价值。下面一一解释各属性:
综合上面的数据,可以发现造成memcached的内存使用率降低的属性有:
chunk_size, chunk_per_page
这两个属性是固定的,但是它反映当前slab存
储的数据大小,可以供你分析缓存数据的散列区间,通过调整增长因子可以改变slab的区间分布,从而改变数据散列到的区域。如果大量的230byte到
260byte的数据,而刚好一个slab大小是250byte,则250byte到260byte的数据将被落到下一个slab,从而导致大量的空间浪
费。total_pages
这个是当前slab总共分配大的page总数,如果没有修改page的默认大小的情况下,这个数值就是当前slab能够缓存的数据的总大小(单位为M)。如果这个slab的剔除非常严重,一定要注意这个slab的page数是不是太少了。
我
上次处理的那个项目因为和另外的一个项目共用的memcache,而且memcache已经运行了很长时间,导致page都已经全部被分配完,而刚好两个
项目的缓存数据大小差别很多,导致新项目数据最多的slab 4竟然只有一个page,所以数据缓存不到22s就被替换了,完全失去了缓存的意义。
针
对我遇到的那个情况,解决方案是重新分配page,或者重启memcache服务。但是page
reassign方法从1.2.8版已经完全移除了,所以现在没有办法在线情况下重新分配page了。另外一种有些时候是不可以接受的,因为一次缓存服务
器的重启将导致所有缓存的数据将重新从DB取出,这个可能造成db的压力瞬间增大。而且有的缓存数据时不入库的,这个时候我们就需要做memcache的
导入和导出了。在下篇文章中我会总结下memcache的dump操作。total_chunks
这个的作用和total_pages基本相同,不过这个属性可以更准确的反应实际可以存放的缓存对象总数。used_chunks, free_chunks, free_chunks_end
这三个属性相关度比较高,从数值上来看它们满足:
total_chunks = used_chunks + free_chunks + free_chunks_end
used_chunks就是字面的意思,已经使用的chunk数;free_chunks却不是所有的未被使用的chunk数,而是曾经被使用过但是因为过期而被回收的chunk数;free_chunks_end是page中从来没有被使用过的chunk数。
从
上图可以看出,slab
1只放了一个对象,但是已经申请了一整个page,这个时候used_chunks为1,但是free_chunks却为0,因为还没有任何回收的空间,
而free_chunks_end却等于10081,说明这么多的chunk从来没有被使用过。下图就是这个数据过期后的stats
slabs数据,可以发现free_chunks有值了,就是过期的那个chunk,所以是1,used_chunks为
0,free_chunks_end不变。
为什么要分两种free chunk呢?
我的理解是这样的:如果free_chunks_end不为零,说明当前slab没有出现过容量不够的时候;而如果free_chunks始终为0,说
明很多数据过期时间过长或者在过期前就被剔除了,这个要结合剔除数据和数据保留的时间(age属性)来看待。所以分开统计这两个值可以准确的判断实际空闲
的chunk的状态,一旦所以的chunk被使用过一次以后,除非重新申请page,否则free_chunks_end始终为0。所以对于运行时间比较
久的memcached,可能大部分这个值都是0。active_slabs, total_malloced
在stats
slabs输出的最后两项是两个统计数据,一个是活动的slab总数,因为slab虽然带编号,但是这个编号不一定是连续的,因为有可能有些中间区间的
slab没有值就没有初始化,这样以后该slab有值的时候就不用改变slab的编号了。所以活动的slab总数不一定等于slab的最大编号。
total_malloced这个是实际已经分配的总内存数,单位为byte,这个数值决定了memcached实际还能申请多少内存,如果这个值已经达到设定的上限,则不会有新的page被分配,以前分配的page也已经固定slab了。
综合上面的数据,可以发现造成memcached的内存使用率降低的属性有:
page中从来没有被使用过的chunks;chunk中存放数据和chunk实际大小的差值;由于短时间的数据集中在某个slab区域,导致大量
page被分配,而之后被闲置的内存,这些即使有整个page的空闲也不会被分配给实际压力很大的slab区域(这个功能是不是以后memcached会
考虑实现呢?)。
分享到:
相关推荐
memcached,redis性能测试,内存缓存系统的性能测试;
这些测试类帮助开发者验证Memcached服务器的正确性和性能,确保在实际生产环境中能够稳定运行。 1. **基本操作**: - **设置数据**: 工具类会提供一个方法,允许开发者将键值对存储到Memcached中。这通常涉及到键...
这些测试用例可以帮助开发者理解如何在实际项目中正确使用客户端库,确保代码的稳定性和性能。 在`memcacheddotnet`中,我们可以期待找到以下内容: - 客户端对象的初始化和配置代码。 - 各种Memcached操作的示例,...
这个版本可能是1.4.5,这是一个较早的版本,可能需要检查是否有更新的版本以获取更好的安全性和性能优化。解压后,用户通常需要按照安装指南进行编译和安装,设置配置文件,并通过命令行工具启动和管理Memcached服务...
**Memcached Windows 下安装与测试详解** Memcached是一款高性能、分布式的内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载。它通过在内存中存储数据和对象来加速动态Web应用的运行速度。在Windows...
Memcached 和 Redis 性能测试 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态 Web 应用以减轻...在性能测试中,我们可以使用 benchmarks 工具来测试 Memcached 和 Redis 的性能,评价它们的性能和稳定性。
Memcached是一款高性能、分布式内存对象缓存系统,常用于减轻数据库负载,提高Web应用的性能。它通过在内存中存储数据来快速访问,避免了反复读取硬盘上的数据,从而提高了应用程序的响应速度。 标题“memcached...
Memcached是一款高性能、分布式内存对象缓存系统,用于减轻数据库负载,提高网站性能。 描述中提到的“详细你谷歌memcached安装教程”,暗示了用户可能需要通过搜索引擎(如Google)查找关于如何在Windows环境下...
- `memcached-1.5.4`源码包含多个主要目录:`src`存放核心代码,`doc`包含文档,`test`有测试用例,`config`存储配置脚本,`include`包含头文件等。 3. **编译与安装** - 首先,确保系统已经安装了必要的依赖,如...
- **测试类**:提供各个方法的测试用例,验证功能的正确性。 4. **源码实现细节** - **连接池管理**:为了提高性能,可能会实现连接池,复用已建立的连接,减少频繁创建和销毁连接的开销。 - **序列化与反序列化...
这个版本的hibernate-memcached已经过测试和优化,确保与1.2.2版本的兼容性,为开发者提供稳定且高效的缓存服务。 **jbossl-LICENSE.txt** 文件则包含了该软件包的许可协议,通常这些协议会详细说明软件的使用、...
标题 "memcached数据完整迁移到redis" 描述的是一个数据迁移的过程,从使用 memcached 存储的数据转换到使用 redis 存储。...通过合理的规划和测试,可以顺利完成这个转换,提升系统的整体性能和可靠性。
在提供的压缩包中,可能包含了一些关于如何使用或测试Memcached的资源,如`MemcachedTest`可能是用于测试Memcached的脚本或工具,而`网盘资源搜索-【51pansou.com】.txt`和`51pansou-海量网盘资源任意搜索.url`可能...
Memcached是一种高性能的分布式内存对象缓存系统,用于减轻数据库负载,提高应用程序的响应速度。而Hibernate则是一个Java持久化框架,它简化了数据库与Java对象之间的交互,使得开发人员能够更专注于业务逻辑而不是...
5. **键值管理**:允许用户直接查看和操作存储在MemCacheD中的键值对,支持添加、删除、更新操作,方便进行数据测试和故障排查。 6. **安全控制**:MemCacheD Manager可能包含安全管理功能,如设置访问权限,防止...
Redis是另一种常见的键值存储系统,相比Memcached,Redis提供了更丰富的数据结构(如列表、集合、有序集合等),支持持久化,且在网络故障后可以从磁盘恢复数据,具有更高的可用性。 总结,Memcached是一个高效、...
Memcached是一款高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库负载,提高数据访问速度。在Linux环境下安装Memcached,可以帮助我们优化服务器性能,提升应用程序的响应速度。本文将详细介绍...
本资源“memcached资源demo(已调试通过)”是一个经过实际测试和验证的Memcached应用示例,下面将详细介绍其核心知识点。 ### 1. Memcached基本概念 Memcached基于键值对存储,它将数据存储在内存中,以提供快速的...