在上一家公司时,产品主要使用memcached做缓存。
虽然目前这家公司memcached使用的比较少(刚进公司做云存储相关服务时小规模使用了一下,后来做另一个系统时换redis做了缓存),但前几天整理资料时看到了原先写的memcached相关笔记,在此整理一下发上来。
---------------------------------------------------------------
一、Memcached特点:
1、协议简单(基于文本行的协议)。
2、基于libevent的事件处理。
3、内置内存存储方式。
4、Memcached不相互通信的分布式。
注:由于数据保存在内置的内存存储空间中,所以重启memcached会导致全部数据消失。内容容量达到指定值之后,就基于LRU算法自动删除不使用的缓存。Memcached服务器端没有分布式功能,这完全取决于客户端的实现。
二、启动参数:
-p 使用端口,默认11211。
-m 最大内存大小,默认64M。
-vv 用very verbose模式启动,调试信息和错误输出到控制台。
-d 作为daemon在后台启动。
三、Memcached的内存管理机制:
1、默认采用名为Slab Allocator的分配、管理内存机制。
2、该机制出现前,内存的分配是通过对所有记录简单的进行malloc和free来进行的。这种方式会导致内存碎片,加重操作系统内存管理器的负担。
3、Slab Allocator基本原理:按照预先规定的大小,将分配的内存分割成各种特定长度的块,并把尺寸相同的块分成组(chunk的集合),以完全解决内存碎片的问题。
4、Slab Allocator还有重复使用已分配内存的目的,分配的内存不会释放,而是重复利用。
5、Slab Allocator术语:
Page – 分配给Slab的内存空间,默认是1MB,分配给Slab之后跟据Slab大小切分成chunk。
Chunk – 用于缓存数据的内存空间。
Slab Class – 特定大小的chunk组。
Memcached根据收到数据的大小,选择最合适数据大小的Slab,Memcached内会保存slab内空闲chunk的列表。
四、Slab Allocator存在的问题:
由于分配的是特定长度的内存,因此无法有效利用分配的内存。
例如:将100字节的数据存入128字节的chunk,则浪费了28字节。
但如果预先知道客户端发送的数据的公用的大小,或者仅缓存大小相同的数据的情况下。只要使用适合数据大小的组的列表,就可以减少浪费。
五、调优:
启动时指定growth factor因子,就可以在某种程度上控制slab之间的差异,默认值为1.25。
Memcached –f 2 –vv
(查看growth factor为2时slab中chunk size的差异)
Memcached引入时,最好重新计算一下数据的预期平均长度,调整growth factor,以获得最恰当的设置。
六、连接Memcached 控制台:
telnet 主机名 端口号
如:telnet localhost 11211
输入stats回车,查看memcached的状态。
Memcached 软件包中Protocol.txt可以查看协议相关信息。
使用memcached-tool的Perl脚本,可以方便的获得slab的情况。
memcached-tool 主机:端口 选项
七、数据删除:
1、Memcached不会释放已分配的内存,其存储空间可以重复使用。
2、Lazy Expiration:
Memcached内部不会监视数据是否过期,而是在get时查看数据的时间戳,查看数据是否过期。被称为lazy expiration(惰性过期)。
3、当Memcached内存空间不足,即无法从slab class中获取到新的空间时,就从最近未被使用的数据中搜索,将其空间分配给新的数据。(如果要禁用LRU,使用-M参数,超出会报错)。
4、不指定具体值则默认数值为64M。
八、其它:
1、二进制协议:使用理由是不需要文本协议的解析处理,使得memcached性能更高。
2、分布式:将key保存在不同的服务器上。
3、性能可达到:请求最大15000qps,流量400Mbps,连接数超过10000个,性能非常高。
4、分布式hash算法:
(1)取模:
求得键整数的hash值,除以服务器台数,所得的余数决定服务器。
缺点:当添加或者移除服务器时,缓存重组的代价相当巨大,会影响缓存命中率。
(2)Consistent Hashing:
首先求出memcached节点的哈希值,并将其配置到0--2^32的圆上。然后用同样的方法求出存储数据的键的hash值,并映射到圆上。然后从存储数据映射的位置顺时针查找,将数据保存到找到的第一个服务器上。
Consistent Hashing最大程度的抑制了键的重新分布,只有从增加服务器地点到逆时针相邻第一台服务器之间的键会受到影响。
有的Consistent Hashing还采用了虚拟节点的思想,使用一般hash函数的话,服务器的映射地点分布非常不均匀。使用虚拟节点为每个服务器在环上分配100--200个点,这样能抑制分布不均匀,最大限度的减小服务器增减时缓存重新分布。
标签:总结,缓存,数据,Slab,Memcached,深入,内存,memcached From: https://blog.51cto.com/u_6978506/7470103