Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29307275
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: 系统运维

2010-08-25 23:53:51

1. slab allocator 的基本原理:按照预先规定的大小,将分配的内存分割成特定长度的块以解决内存磁片的问题。将分配的内存分割成各种尺寸的块(chunk)将把尺寸相同的块分成组(chunk的集合)。而且它具备了重复使用已分配的内存的目的,即分配到的内存不会释放掉而是继续被利用。

它的缺点
它主要是为了解决内存磁片的问题。它的缺点就是分配的是特定长度的内存,因此无法有效利用分配的内存。例如把100字节的数据缓存到128的chunk中那剩下来的28字节就是浪费了!

2.4 使用growth factor选项进行调优
启动memcached的时候指定growth factor因子(通过-f选项),就可以在某种程度上控制slab之间的差异。默认值是1.25。在这个选项出现之前这个因子曾经固定为2称为"powers of 2"策略。

[root@rzfyZhou memcached-1.2.5]# ./memcached -u root -f 2 -vv
slab class   1: chunk size    128 perslab  8192
slab class   2: chunk size    256 perslab  4096
slab class   3: chunk size    512 perslab  2048
slab class   4: chunk size   1024 perslab  1024
slab class   5: chunk size   2048 perslab   512
slab class   6: chunk size   4096 perslab   256
看到没有增长因子定为2的时候依次就变成为:128 256 512 1024
这样的话容易出现内存浪费了。

2.5 查看memcachd的内部状态
可以使用stats的命令进行获取各种信息。操作方法
# telnet 127.0.0.1 11211
输入stats
stats
STAT pid 20950                  进程ID值PID
STAT uptime 94
STAT time 1282774264
STAT version 1.2.5
STAT pointer_size 32             32位机型?
STAT rusage_user 0.000000
STAT rusage_system 0.000999
STAT curr_items 0
STAT total_items 0
STAT bytes 0
STAT curr_connections 2
STAT total_connections 4
STAT connection_structures 3
STAT cmd_get 0
STAT cmd_set 0
STAT get_hits 0
STAT get_misses 0
STAT evictions 0
STAT bytes_read 20
STAT bytes_written 465
STAT limit_maxbytes 134217728
STAT threads 1
END

优点:能够减少内存的大碎片。
缺点:怕是浪费内存所以可以指定growth 参数-f 指定增长因子

3.1 Lazy Expiration
memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期了。这种技术叫lazy expiration.这样的话就不会浪费memcached在监视过期的东西的CPU了。

3.2 LRU:从缓存中有效地删除数据
memcached会优先使用已超时的记录的空间,但就算这样也会发生追加新记录时空间不足的情况,这时就要使用LRU机制来分配内存空间了。这个机制的含义:删除最近最少使用(就是把最近最少使用的记录给删除掉)
因此:当memcached的内存空间不足时(无法从slab class获取新的空间时)它就会从最近未被使用的记录中搜索,然后将空间分配给新的记录。

不过,有些情况下LRU机制反倒是会造成麻烦。那怎么办呢?启动的时候加-M参数来禁止LRU就行
示例:memcached -M
如果你用了-M的话当内存用尽了就会报错了。所以官方推荐是使用LRM就是不带这个参数了!

3.3 memcached的最新发展方向
memcached的roadmap有两个大的目标
3.3.1 二进制协议的策划与实现
3.3.2 外部引擎的加载功能

二进制协议中键的大小用2字节表示,因此理论上来讲最大可使用65536长的键。K-V 中的K这么大用得着吗

4.1 memcached的分布式
其实服务器端并没有实现分布式的功能。
至于它的分布式完全是由客户端程序库来实现的。

假设布置了三台memcached服务器node1--node3三台,保存的键名为:tokyo chiba
首先向memcached中添加tokyo将tokyo传给客户端程序库。在客户端实现的算法就会根据键来决定保存数据的memcached服务器了,选择好服务器之后就把命令将其保存起来!

客户端 -- 算法 --- 选择不同的memcached服务器!其算法是由客户端来处理的!





阅读(1113) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~