当前位置:
文档之家› Memcached 原理剖析
Memcached 原理剖析
余问题都解决了,空间利用率会大大提升。
修改 slabs_clsid 函数,让它直接返回一个定值(比如 1 )
unsigned int slabs_clsid(size_t size) {return 1;}
修改slabs_init函数,去掉循环创建所有classid属性的部分,直接添加
slabclaபைடு நூலகம்s[1]:
• 数据存储方式:Slab Allocation • 数据过期方式:Lazy Expiration + LRU
7
Memcache原理分析
数据存储方式:Slab Allocation
Slab Alloction 构造图
Slab Allocator的基本原理是按照预先 规定的大小,将分配的内存分割成特定 长度的块,以完全解决内存碎片问题。
Memcached 入门
作者:
2009-01
Tech Talk 目录索引
Memcache是什么 Memcache,ehcache的比较 Memcache原理分析 Memcache安装和基本配置 Memcache的在大型网站中的使用策略 Memcache的一些经验和技巧 Memcache一致性算法(consistent hasing)
一个id,在数据量非常大的情况下,slab链会很长(因为所有数据都挤在一条
链上了),遍历起来的代价比较高。
前面介绍了三种空间冗余,设置chunk长度等于item长度,解决了第一种空间
浪费问题,不预申请空间解决了第二种空间浪费问题,那么对于第一种问题
(slab内剩余)如何解决呢,这就需要修改POWER_BLOCK常量,使得每一
15
Memcache原理分析:
常量POWER_BLOCK 1048576 默认slab大小 常量CHUNK_ALIGN_BYTES (sizeof(void *)) 保证chunk大小是这个数值的整数倍,防止越界(void *的长度在不同系统上不 一样,在标准32位系统上是4) 常量ITEM_UPDATE_INTERVAL 60 队列刷新间隔 常量LARGEST_ID 255 最大item链表数(这个值不能比最大的classid小) 变量hashpower(在1.1中是常量HASHPOWER) 决定hashtable的大小 根据上面介绍的内容及参数设定,可以计算出的一些结果: 1、在memcached中可以保存的item个数是没有软件上限的,之前我的100万的 说法是错误的。 2、假设NewHash算法碰撞均匀,查找item的循环次数是item总数除以 hashtable大小(由hashpower决定),是线性的。 3、Memcached限制了可以接受的最大item是1MB,大于1MB的数据不予理会。 4、Memcached的空间利用率和数据特性有很大的关系,又与 DONT_PREALLOC_SLABS常量有关。 在最差情况下,有198个slab会被浪费 (所有item都集中在一个slab中,199个id全部分配满)。
3
Memcache, EhCache的比较
项目
分布式
Memcache
不完全,集群默认不实现
EhCache
支持
集群 持久化
效率 容灾 缓存数据方式
缓存过期移除策略 缺点 优点
可通过客户端实现
支持
可通过第三方应用实现,如sina研发的memcachedb, 将cache的数据保存到Berkerly DB
个slab大小正好等于chunk长度的整数倍,这样一个slab就可以正好划分成n个
chunk。这个数值应该比较接近1MB,过大的话同样会造成冗余,过小的话会
造成次数过多的alloc,根据chunk长度为200,选择1000000作为
POWER_BLOCK的值,这样一个slab就是100万字节,不是1048576。三个冗
//得出的结果是1,那么对应的机器就是 node[id] == node[1]
13
Memcache原理分析:
基于客户端的Memcached分布式
写入操作
读取操作
14
Memcache原理分析:
Memcache的理论参数计算方式
常量REALTIME_MAXDELTA 60*60*24*30 最大30天的过期时间 conn_init()中的freetotal(=200) 最大同时连接数 常量KEY_MAX_LENGTH 250 最大键长 settings.factor(=1.25) factor将影响chunk的步进大小 settings.maxconns(=1024) 最大软连接 settings.chunk_size(=48) 一个保守估计的key+value长度,用来生成id1中的chunk长度(1.2)。id1的 chunk长度等于这个数值加上item结构体的长度(32),即默认的80字节。 常量POWER_SMALLEST 1 最小classid(1.2) 常量POWER_LARGEST 200 最大classid(1.2)
Chunk:用于缓存记录的内存空间。
Slab Class:特定大小的chunk的组。
memcached根据收到的数据的大小,选 择最适合数据大小的slab。 memcached中保存着slab内空闲chunk的 列表,根据该列表选择chunk,然后将 数据缓存于其中。
9
Memcache原理分析:
数据存储方式:Slab Allocation
CODE:
slabclass[1].size = 200;
//每chunk200字节
slabclass[1].perslab = 5000; //1000000/200
18
Memcache安装、配置和使用:
• Memcache 安装 • Memcache 配置 • Memcache 结合java客户端的使用
• LRU memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不 足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。顾名思义, 这是删除“最近最少使用”的记录的机制。因此,当memcached的内存空间不足时(无法 从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配 给新的记录。从缓存的实用角度来看,该模型十分理想。
Slab Alloction 缺点
这个问题就是,由于分配的是特定长度的内存,因此无法有效利用 分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩 余的28字节就浪费了。
10
Memcache原理分析:
数据过期方式
• Lazy Expiration memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过 期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费 CPU时间。
2
Memcache是什么:
Memcache是国外社区网站 LiveJournal 的开发团队开发的高性能的分布式内 存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访 问次数,以提高动态Web应用的速度、提高可扩展性。目前全世界不少人使用 这个缓存项目来构建自己大负载的网站,来分担数据库的压力。
Memcache原理分析:
要定义DONT_PREALLOC_SLABS来避免另外的预分配浪费。另一种方法是
建立一个hash关系,来从item确定classid,不能使用长度来做键,可以使用key
的NewHash结果等不定数据,或者直接根据key来做hash(定长数据的key也一
定等长)。这里简单起见,选择第一种方法,这种方法的不足之处在于只使用
11
Memcache原理分析:
基于客户端的Memcached分布式
12
Memcache原理分析:
基于客户端的Memcached分布式
//按照Key值,获取一个服务器ID int getServerId(char *key, int serverTotal) {
int c, hash = 0; while (c = *key++) {
高
支持。持久化到本地硬盘,生成一 个.data和.index文件。Cache初始化 时会自动查找这两个文件,将数据放 入cache
高于memcache
可通过客户端实现
支持
缓存在memcached server向系统申请的内存中 LRU
可以缓存在内存(jvm)中,也可以缓存 在 硬盘。通过CacheManager管理 cache.多个CacheManager可管理多个 cache
LRU,FIFO,LFU
功能不完善,相对于ehcache效率低
简单,灵活,所有支持socket的语言都可以编写他的 客户端
只适用于java体系,只能编写java客 户端
效率高,功能强大
4
Memcache原理分析
Memcache工作方式?
5
Memcache原理分析
6
Memcache原理分析
自主的内存存储处理
Slab Allocation的原理相当简单。 将 分配的内存分割成各种尺寸的块 (chunk),并把尺寸相同的块分成组 (chunk的集合)
8
Memcache原理分析
数据存储方式:Slab Allocation
Slab Classes 分配图
Page:分配给Slab的内存空间,默认是 1MB。分配给Slab之后根据slab的大小 切分成chunk。
Memcache可以对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是 在内存中开辟一块空间,然后建立一个HashTable,Memcache自管理这些 HashTable. Memcache的官方网站:/memcached/ 为什么会有Memcache和Memcached两种名称? 其实Memcache是这个项目的名称,而Memcached是它服务器端的主程序文 件名。