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) |