`
wenjinglian
  • 浏览: 806280 次
  • 性别: Icon_minigender_1
  • 来自: 株洲->深圳
社区版块
存档分类
最新评论

[转]Memcached性能检测

阅读更多

Memcached性能检测

        Memcached作为一个内存key-value存储容器有非常优秀的性能,但是在上次的使用中确发现大量的数据丢失情况发生,导致cache的功能基本消失。具体的检测方式如下:

  1. 检测命中率

    检测命中率是一个最基本的、最宏观的方式,使用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丢失的发生。

  2. Stats items

    Stats items命令可以查看每个slab中存储的item的一些详细信息,具体可以见下图。

    关键属性有:

    Stats items属性 属性名称属性说明
    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就可以观察到这些剔除的情况。
    具体分析如下:

    1. evicted属性
      如果一个slab的evicted属性不是0,则说明当前slab出现了提前剔除数据的情况,这个slab可能是你需要注意的。
    2. evicted_time属性
      如果evicted不为0,则evicited_time就代表最后被剔除的数据时间缓存的时间。并不是发生了LRU就代码memcached负载过载了,因为有些时候在使用cache时会设置过期时间为0,这样缓存将被存放30天,如果内存慢了还持续放入数据,而这些为过期的数据很久没有被使用,则可能被剔除。需要注意的是,最后剔除的这个数据已经被缓存的时间,把evicted_time换算成标准时间看下是否已经达到了你可以接受的时间,例如:你认为数据被缓存了2天是你可以接受的,而最后被剔除的数据已经存放了3天以上,则可以认为这个slab的压力其实可以接受的;但是如果最后被剔除的数据只被缓存了20秒,不用考虑,这个slab已经负载过重了。
    3. age属性
      age属性反应了当前还在缓存的数据中最久的时间,它的大小和evicted_time没有必然的大小关系,因为可能时间最久的数据确实频繁被读取的,这时候不会被LRU清理掉,但是如果它小于evicted_time的话,则说明数据在被下去读取前就被清理了,或者存放了很多长时间但是不被使用的缓存对象。
  3. Stats slabs

    从Stats items中如果发现有异常的slab,则可以通过stats slabs查看下该slab是不是内存分配的确有问题。
    Stats slabs结果如下图

    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的内存使用率降低的属性有:

    1. chunk_size, chunk_per_page
      这两个属性是固定的,但是它反映当前slab存储的数据大小,可以供你分析缓存数据的散列区间,通过调整增长因子可以改变slab的区间分布,从而改变数据散列到的区域。如果大量的230byte到260byte的数据,而刚好一个slab大小是250byte,则250byte到260byte的数据将被落到下一个slab,从而导致大量的空间浪费。
    2. 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操作。
    3. total_chunks
      这个的作用和total_pages基本相同,不过这个属性可以更准确的反应实际可以存放的缓存对象总数。
    4. 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。
    5. active_slabs, total_malloced
      在stats slabs输出的最后两项是两个统计数据,一个是活动的slab总数,因为slab虽然带编号,但是这个编号不一定是连续的,因为有可能有些中间区间的slab没有值就没有初始化,这样以后该slab有值的时候就不用改变slab的编号了。所以活动的slab总数不一定等于slab的最大编号。
      total_malloced这个是实际已经分配的总内存数,单位为byte,这个数值决定了memcached实际还能申请多少内存,如果这个值已经达到设定的上限,则不会有新的page被分配,以前分配的page也已经固定slab了。

 

    综合上面的数据,可以发现造成memcached的内存使用率降低的属性有:

  1. page中从来没有被使用过的chunks;
  2. chunk中存放数据和chunk实际大小的差值;
  3. 由于短时间的数据集中在某个slab区域,导致大量page被分配,而之后被闲置的内存,这些即使有整个page的空闲也不会被分配给实际压力很大的slab区域(这个功能是不是以后memcached会考虑实现呢?)。

原文:Memcached性能检测

童城咖啡关于 memcached 文章: http://www.tanktong.com/category/programming/memcache/

memcached全面剖析:http://blog.charlee.li/memcached-002/

 

分享到:
评论

相关推荐

    memcached的性能测试

    全面的memcached测试案列和详细讲解

    memcached&redis;性能测试

    memcached,redis性能测试,内存缓存系统的性能测试;

    memcachedredis性能测试.docx

    memcachedredis性能测试.docx

    memcached-redis性能测试.docx

    memcached-redis性能测试

    memcache redis tair 性能测试报告

    memcache redis tair 性能测试报告,精心准备的常用缓存工具的性能测试报告,非常详细

    Memcached缓存资料

    memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。 Memcached 的守护进程(daemon )是用C写的,但是客户端可以...

    memcached1

    最近一直在做一个项目的前期设计工作,考虑到后期系统的扩展和性能问题也找了很多解决方法,有一个就是用到了数据库的缓存工具memcached(当然该工具并不仅仅局限于数据库的缓存)。先简单的介绍下什么是memcached。...

    LinQ to Memcached with SQL Server Change Tracking

    3.性能测试、通信数据结构设计 4.SQL Server Change Tracking了解并应用 5.SQL Server Change Tracking集成Memcached 6.项目应用(IM基础数据缓存,例:Category、Brand、Manufacturer等) 7.了解Memcached实现机制...

    java_memcached-release_2.5.1

    服务集成平台5.6的性能测试进入尾声,这期的优化也算告一段落。这次主要的优化工作还是在三个方面:应用服务器(Apache,JBoss)配置,业务流程,Cache Client包...

    分布式缓存技术-Redis和Memcached选型对比-性能测试

    不光有含金量,还很有颜值。 Redis-vs-Memcached-Infographic-ScaleGrid-Blog

    memcached的java示例工程

    第一行是启动memcached的,作为测试我们就简单的只分配32M内存了, 然后监听本机端口和以守护进行运行。执行完毕后,我们就可以在任务管理器中见到memcached.exe这个进程了。 好了,我们的服务器已经正常运行了, ...

    基于memcached的云缓存ARCUS.zip

    arcus-memcached 经过大幅度的修改,可以支持 NAVER 的功能和性能要求。Arcus 支持多种数据机构 (List, Set, B tree),除了支持基本的memcached 键值数据模型,还可以一个结构化的形式存储和回取多个数值。 Arcus ...

    session共享 memcached-session-manager 1.9.6 jar

    网上下载过N种jar版本,启动tomcat报各种错误;浪费了很多时间;本资源经tomcat7、tomcat8测试,均正常实现负载均衡,session共享功能。

    memcached(五)单台服务器部署单线程性能测试

    NULL 博文链接:https://phl.iteye.com/blog/1947118

    实战Nginx高性能Web服务器

    6、高性能Web服务器Nginx的配置与部署研究(6)核心模块之主模块的测试常用指令 内容:详解Nginx的主模块中,测试时经常使用的指令。 7、高性能Web服务器Nginx的配置与部署研究(7)核心模块之主模块的非测试常用...

    用Python的Tornado框架结合memcached页面改善博客性能

    Blog是一个更新并不很频繁的一套系统,但是每次刷新页面都要更新数据库反而很浪费资源,添加静态页面生成是一个解决办法,同时缓存是一个更好的主意,可以结合Memcached添加少量的代码进行缓存,而且免去去了每次更新文章...

    cl-memcached:Memcached 对象缓存系统的快速、线程安全接口

    根据主页: memcached是一种高性能、分布式内存对象缓存系统,本质上是通用的,但旨在通过减轻数据库负载来加速动态 Web 应用程序。 在 SBCL、CCL 和 CMUCL 上测试。 全局变量*memcache* 大多数命令都将此作为后备...

    Memcached2:.NET Core 3版本的C#Memcached客户端(测试版,使用后果自负,欢迎使用PRsbug报告)

    面向.NET的完全异步,流水线的高性能库 (完整重写 。) 局限性 仅支持二进制协议(除非使用非常老的Memcached服务器,否则它不应成为阻止程序) 使用Memory<T> / Span<T> ,因此当前它仅在.NET Core 3.0...

Global site tag (gtag.js) - Google Analytics