memcached原理全面剖析
memcached会预先分配内存,memcached分配内存方式称之为allocator, 
首先,这里有3个概念: 1 slab   2 page   3 chunk 
一般来说一个memcahced进程会预先将自己划分为若干个slab,每个slab下又有若干个page,每个page下又有多个chunk,slab得数量是有限得,几个,十几个,或者几十个,这个跟进程配置得内存有关。而每个slab下得page默认情况是1m,也就是说如果一个slab占用100m得内存得话,那么默认情况下这个slab所拥有得page得个数就是100,而chunk就是我们得数据存放得最终地方。
stats slabs 
----------------------------- 
STAT 2:chunk_size 104 
STAT 2:chunks_per_page 10082 
STAT 2:total_pages 1 
STAT 2:total_chunks 10082 
STAT 2:used_chunks 12 
STAT 2:free_chunks 74 
STAT 2:free_chunks_end 9996 
STAT 2:mem_requested 996 
STAT 2:get_hits 0 
STAT 2:cmd_set 31761 
STAT 2:delete_hits 17 
STAT 2:incr_hits 991 
STAT 2:decr_hits 0 
STAT 2:cas_hits 0 
STAT 2:cas_badval 0 
STAT 2:touch_hits 0 
STAT 5:chunk_size 224 
STAT 5:chunks_per_page 4681 
STAT 5:total_pages 1 
STAT 5:total_chunks 4681 
STAT 5:used_chunks 29 
STAT 5:free_chunks 13 
STAT 5:free_chunks_end 4639 
STAT 5:mem_requested 6496 
STAT 5:get_hits 2954 
STAT 5:cmd_set 297 
STAT 5:delete_hits 10 
STAT 5:incr_hits 0 
STAT 5:decr_hits 0 
STAT 5:cas_hits 0 
STAT 5:cas_badval 0 
STAT 5:touch_hits 0 
..... 
..... 
STAT active_slabs 28 
STAT total_malloced 63283664 
----------------------------- 
chunk_size表示数据存放块得大小, 
chunks_per_page表示一个内存页page中拥有得chunk得数量, 
total_pages表示每个slab下page得个数。 
total_chunks表示这个slab下chunk得总数(=total_pages * chunks_per_page), 
used_chunks表示该slab下已经使用得chunk得数量, 
free_chunks表示该slab下还可以使用得chunks数量。
从上面得示例slab 1一共有1m得内存空间,而且现在已经被用完了,slab2也有1m得内存空间,也被用完了,slab3得情况依然如此。 而且从这3个slab中chunk得size可以看出来,第一个chunk为104b,第二个是224,基本上后一个是前一个得1.25倍,但是这个增长情况我们是可以控制得,我们可以通过在启动时得进程参数 f来修改这个值,比如说 f 1.1表示这个增长因子为1.1,那么第一个slab中得chunk为80b得话,第二个slab中得chunk应该是80*1.1左右。
memcached中新的value过来存放的地址是该value的大小决定的,value总是会被选择存放到chunk与其最接近的一个slab中,比如上面的例子,如果我的value是80b,那么我这所有的value总是会被存放到1号slab中,而1号slab中的free_chunks已经是0了,怎么办呢,如果你在启动memcached的时候没有追加-M(禁止LRU,这种情况下内存不够时会out of memory),那么memcached会把这个slab中最近最少被使用的chunk中的数据清掉,然后放上最新的数据。这就解释了为什么我的内存还有40%的时候LRU就执行了,因为我的其他slab中的chunk_size都远大于我的value,所以我的value根本不会放到那几个slab中,而只会放到和我的value最接近的chunk所在的slab中(而这些slab早就满了,郁闷了)。这就导致了我的数据被不停的覆盖,后者覆盖前者。
memcached server不能停啊,不要紧还有另外一个方法,就是memcached-tool,执行move命令,如:move 3 1,代表把3号slab中的一个内存页移动到1号slab中,有人问了,这有什么用呢,比如说我的20号slab的利用率非常低,但是page却又很多,比如200,那么就是200m,而2好slab经常发生LRU,明显page不够,我就可以move 20 2,把20号slab的一个内存页移动到2号slab上,这样就能更加有效的利用内存了
+++++++++++++++++++++++++++++++++++++++++++++++++++
其他参考文档:
Memcached 工作原理介绍
memcached原理全面剖析的更多相关文章
- Unity协程(Coroutine)原理深入剖析
		
Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 其实协程并没有那么复杂,网上很多地方都说是多 ...
 - Memcached原理与应用
		
Memcached原理与应用 标签: linux 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 1.Memcached是什么 高性能 支持高并发 分布式内存缓存 ...
 - Unity协程(Coroutine)原理深入剖析再续
		
Unity协程(Coroutine)原理深入剖析再续 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面已经介绍过对协程(Coroutine ...
 - 【转】Unity协程(Coroutine)原理深入剖析
		
Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 记得去年6月份刚开始实习的时候,当时要我写网 ...
 - 63、Spark Streaming:架构原理深度剖析
		
一.架构原理深度剖析 StreamingContext初始化时,会创建一些内部的关键组件,DStreamGraph,ReceiverTracker,JobGenerator,JobScheduler, ...
 - 【转帖】NAT类型及转换原理深入剖析
		
NAT类型及转换原理深入剖析 http://www.m6000.cn/other/459.html 2018年8月4日16:40:14发表评论 297 views 大家都知道.NAT是位于内.外网之 ...
 - Memcached原理分析
		
Memcached的内存管理方式 Memcached采用了名为Slab Allocation的机制分配,管理内存. Slab Allocation的原理相当简单.将分配的内存分割成各种尺寸的块(chu ...
 - Unity协程(Coroutine)原理深入剖析(转载)
		
记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是怎么样的,只是知道函数的返回值是IEnumerator类型,函数中使用yield r ...
 - memcached原理及介绍
		
memcached是一种缓存技术,在存储在内存中(高性能分布式内存缓存服务器).目的 : 提速.(传统的都是把数据保存在关系型数据库管理系统既RDBMS,客户端请求时会从RDBS中读取数据并在浏览器中 ...
 
随机推荐
- windows Server 2003修改远程连接限制
			
调整最大远程连接数: 1.开始->控制面板->添加或删除程序->添加/删除windows组件->选择“终端服务器”进行安装. 2.开始->运行->gpedit.ms ...
 - thinkphp 开发的获取用户信息
			
<?php namespace Home\Controller; use Think\Controller; use Com\Wechat; use Com\WechatAuth; class ...
 - CSS3+HTML5学习笔记(1)
			
box内阴影: -moz-box-shadow:inset 30px #; -webkit-box-shadow:inset 30px #; box-shadow:inset 30px #; 多重文字 ...
 - install pip3 for python 3.x
			
前言: 我目前使用的服务器为centos6.x 系统自带的python的版本为2.6.x,但是目前无论是学习还是使用python,python3都是首选,那么问题来了.---如何安装python3环境 ...
 - Java前辈:学习J2EE流程中的经验和教训
			
Java前辈:学习J2EE流程中的经验和教训 在这里我谈谈我在学习j2ee流程,并谈到在此过程中领会的经验和教训.以便后来者少走弯路. Java发展到现在,按应用来分主要分为三大块:J2SE,J2 ...
 - 转:VC中WORD,DWORD,unsigned long,unsigned short的区别(转)
			
typedef unsigned long DWORD;typedef int BOOL;typedef unsigned char BYTE; ...
 - CSS5.4 安装问题集
			
由于手痒,将5.2 卸载了,装了5.4 出现如下错误:install failed to install com.ti.ccstudio.debugserver.win32 corrctly. ... ...
 - Collections.shuffle源码阅读
			
java.util.Collections /** * Randomly permutes the specified list using a default source of * randomn ...
 - 王学长的AAA树
			
让我们响应王学长的号召勇敢的分开写splay和lct吧! 分开写大法好!!!!!!!!!!!杜教的ch[4]弱爆了!!!! #include <stdio.h> #include < ...
 - HDOJ 1197 Specialized Four-Digit Numbers
			
Problem Description Find and list all four-digit numbers in decimal notation that have the property ...