Memcache Slab Eviction 功能测试

1 功能简述

1.1 Automove功能背景

由于memcache的内存分配是基于slab的,每个1M的page内只能存放对应slab大小范围的value值。具体原理见:http://dev.mysql.com/doc/refman/5.0/en/ha-memcached-using-memory.html 。

因为这种模式带来的问题也会随着实例的运行时间的增加而凸显。假设实例在运行初期,业务模型存放的都是1k大小的value值,并且把memcache的内存耗尽。此时,memcache的内部全部都是1k类型的slab。随着业务发展value大小变化到了2k,此时需要2k类型的slab存放,这时memcache就会在一个2k类型的page内不断evict为新的key腾出空间。而之前已经分配完毕的1k-slab则毫无用途。这样的情况显然会造成内存使用的不合理,和2k类型key的命中率大幅度降低,以及memcached eviction计数器大量增加的情况。

memcache为了解决因slab引起的内存使用不合理的问题,在1.4.11中引入了slab automove的功能。本文将围绕这个功能进行功能和性能上的测试。

slab automove实现原理简单叙述如下:

The algorithm is slow and conservative. If a slab class is seen as having the highest eviction count 3 times 10 seconds apart, it will take a page from a slab class which has had zero evictions in the last 30 seconds and move the memory. (摘自memcache wiki,详见http://code.google.com/p/memcached/wiki/ReleaseNotes1411

1.2 Automove 功能的使用

automove分配手动重分配和自动重分配。

手动:

memcache启动时加上参数:memcached -o slab_reassign

cache运行时,执行以下命令:

echo "slabs reassign 1 4" | nc localhost 11211

自动重分配:

memcache启动时加上参数:memcached -o slab_reassign,slab_automove

之后cache就会以每10秒一次的频率进行重分配。

也可以临时停止自动重分配:echo "slabs automove 0" | nc localhost 11211

2 测试过程和结果分析

2.1 测试环境

操作系统:CentOS release 6.3 (Final)

内核版本:2.6.32-279.el6.x86_64

CPU:Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz

memcache版本:1.4.15

memcache内存:128M

2.2 测试方法

测试通过多个并发访问memcache,记录响应时间后作图的方式进行比较。

测试脚本为自己编写的perl脚本。主要步骤如下:

从一个并发到二十并发循环进行以下操作

  • slab预分配(保证内存被某种slab耗尽)

  • slab 超时get(清空之前所有的slab,并保证之前分配的slab类型不变)

  • 测试正式开始

  • 预分配slab类型的set,并记录响应时间,作为比较基准

  • 新slab类型的set ,并记录响应时间,作为比较对象

2.3 slab富裕 vs slab紧张

测试目的:分析slab类型紧张和富裕时的set响应时间是否有差异,来说明当某个slab类型紧缺时是否会对前端业务产生响应时间的影响

从下图的测试结果可以看到当slab类型分配紧张时的set响应时间明显高于slab类型分配富裕的时候。从理论上也比较容易理解这个结果。因为当该类型的所有slab均满的时候,memcache需要做LRU list上的eviction才能腾出空间记录新的key,而这个额外步骤也造成了set响应时间的增加。

2.4 automove开启 (未使用)vs automove关闭

测试目的:由于automove是由一个额外的异步线程实现的功能。因此这个测试通过比较功能的开关是否会对set响应时间有影响,来说明额外线程是否有额外性能损耗。

从第一章的介绍可以看出,slab的automove是一个10秒循环的异步线程管理的。因此当测试时间少于10秒时,就可以模拟automove开启但未使用的情况。

测试结果:从下图可以看到, 后台线程的存在对原有响应时间的pattern并没有很大的影响。因此,开启slab automove后在没有使用的情况下,没有不良影响

2.5 automove开启(且使用) vs automove关闭

测试目的:这个测试用于观察automove开启后,slab类型重新分配后对性能是否能带来显著提升。

测试结果:从下图可以看出,相较automove关闭时,slab的重新分配确实能够带来一定程度上响应时间的提升。但效果并不明显,主要是因为slab的重新分配只是10秒一次的后台作业,需要一段非常长的时间后,slab的类型才能趋于合理稳定。当然automove的主要目的并不在于直接提高cache的响应速度,而在于slab分配合理后,key的命中率能有一定程序的提高,减少后端数据库和service的访问压力。

从测试结束后的slab情况来看,开启automove后,因为测试时间较短,只有少量slab被重新分配。

memcached-tool localhost:11211 display

# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM

12 1.2K 9s 120 106072 yes 0 0 0

13 1.4K 0s 8 5664 yes 74051 0 0

3 测试结论

以下是测试的主要结论:

  • 因为slab不足的cache miss的响应时间,会比cache hit的响应时间略多

  • 开启automove后台线程对于响应时间没有副作用

  • 开启automove对于cache访问的响应时间提升有限

  • 开启automove的主要意义在于合理使用内存,提升key的命中率,降低后端系统压力

综上,认为automove可以比较放心的在线上开启使用。

 
 

Memcache Slab Eviction 功能测试的更多相关文章

  1. memcache 原理 & 监测 & 查看状态 & stats & 结构

    Mencache内存存储方式:slab/LRU,采用预先申请固定大小的内存页(slab/page),然后再把内存分成多个块(chunk) 先放一张从网上找到的memcache内存结构图,觉得非常的赞:

  2. 从源码角度理清memcache缓存服务

    memcache作为缓存服务器,用来提高性能,大部分互联网公司都在使用.   前言    文章的阅读的对象是中高级开发人员.系统架构师. 本篇文章,不是侧重对memcache的基础知识的总结,比如se ...

  3. 深入研究memcache 特性和限制

    深入研究memcache 特性和限制在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 .Memcached 单进程最大使用内存为2G,要使用更多内存,可以分多个端口开启多个M ...

  4. memcache的内存管理机制

    Memcache使用了Slab Allocator的内存分配机制:按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题Memcache的存储涉及到slab,page,chunk三 ...

  5. Memcache笔记(1)

    缓存主要分为:页面缓存和数据缓存 Memcache .redis.mongodb都是做数据缓存的 Memcache是什么? 是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的ha ...

  6. memcache学习资料

    memcached是国外社区网站LiveJournal团队开发,通过缓存数据库查询结果,减少数据库访问次数,从而提高动态web站点性能.官方站点 http://memcached.org/memcac ...

  7. 走进缓存的世界(三) - Memcache

    系列文章 走进缓存的世界(一) - 开篇 走进缓存的世界(二) - 缓存设计 走进缓存的世界(三) - Memcache 简介 Memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用 ...

  8. MemCache超详细解读

    MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...

  9. 前端学PHP之PHP操作memcache

    × 目录 [1]安装 [2]连接 [3]增删改查[4]分布式[5]状态[6]安全[7]应用 前面的话 和访问mysql服务器类似,PHP也是作为客户端API访问memcached服务器的,所以同样需要 ...

随机推荐

  1. 10个实用的PHP正则表达式汇总

    原文 10个实用的PHP正则表达式汇总 正则表达式是程序开发中一个重要的元素,它提供用来描述或匹配文本的字符串,如特定的字符.词或算式等.但在某些情况下,用正则表达式去验证一个字符串比较复杂和费时.本 ...

  2. DirectX11 学习笔记2 - 加入关键事件 实现视角转换 旋转

    上的程序的的基础上.在基类D3DBase添加摄像头功能 //录影机 void D3DBase::setCamera() { //关键事件 //假定A,S,D,W,Q,E,Z,X,C键被按下.动摄像机 ...

  3. iOS MapKit导航及地理转码辅助类

    头文件: #import <Foundation/Foundation.h> #import <MapKit/MapKit.h> @interface DirectionRou ...

  4. 【Java&amp;Android开源库代码分析】のandroid-async-http の开盘

          在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正 ...

  5. Spring之SpringMVC(源码)启动初始化过程分析

    1.说明 SpringMVC作为Spring提供的MVC实现,可以实现与Spring的天然无缝联合,因为具有很广泛的用途.具体的关于SpringMVC的处理流程逻辑我在这里就不在赘述了.还是来通过源码 ...

  6. style、currentStyle、getComputeStylel的使用

    (1)js中使用obj.style的用法,是为了获得内联样式,即style属性中的值. 如果想获取obj.style.display,但内联样式表中没有定义display,那么将返回一个空的字符串. ...

  7. 让Xcode Lua 语法高亮

    本人不太喜欢用code ide 还是喜欢XCODE的风格 1.让Xcode支援Lua语法高亮(Syntax Highlighting) 1. 下载https://github.com/breinhar ...

  8. Ubuntu 14.04 字体设置

    ubuntu 14.04消息公布后,我迫不及待地安装和使用.不知道怎么搞的,整个系统彻底改变了字体.有罪,看. 后来.听说文泉驿米黑效果不错.就试了一下,确实还行. 以下是设置方法: 1.安装文泉驿米 ...

  9. wpf的datagrid和winform的datagridview刷新

    DataGrid的数据源的加载需要大量IO操作,不可能等数据全部读取之后才显示到UI上.由于对WPF数据绑定不很熟悉,对ObserveCollection等内容没有太多时间去研究,只能用一些取巧的办法 ...

  10. sugarcrm关于邮件设置几个不好理解的地方

    陈沙克日志 把我的过程记录下来,以免以后忘了     2008-06-11 12:32 sugarcrm关于邮件设置几个不好理解的地方 最近看sugarcrm的使用,别的基本使用,没有什么问题,几天就 ...