参考文章:memcached详细
参考文章:memcached深入理解
首先需要安装libevent
然后安装memcache
两者都是官网下载tar.gz,然后解压,执行./configure ,make , make install
启动memcached
执行 /usr/local/bin/memcached -p(设置端口号) 11211 -m(设置最大内存数) 64m -vv(调试信息和错误信息输出到控制台)-u(指定用户) root -d(作为daemon在后台启动)
-n 45指定chunk size 实际的chunksize = 大于等于(45+48(item 结构体的大小,64位机器为48,32位机器为32,这里用64位机器举例))且能除尽8 的最小那个数,93 不行,94 不行,95不行,96可以,于是就是96
想要终止memcached,使用ps -aux|grep memcached 查询进程号,然后使用kill命令杀死进程
memcached 内存存储:使用Slab Alloction机制
slab
page(默认为1M)
chunk
一个slab class 可以由多个page组成
每个slab class 中有大小相同的chunk空间用于存储键值对数据
slab Alloction的实现机制的缺点:不能充分利用内存的空间,选中的chunk多数时候都比要存储的数据要大,所以会造成浪费
优点:不容易产生内存碎片
Memcached还有其他的一些常用的命令如下:
-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
1.1 Memcached配置
Memcached服务器在启动时需要对关键的参数进行配置,下面我们就看一看Memcached在启动时需要设定哪些关键参数以及这些参数的作用。
1)-p Memcached的TCP监听端口,缺省配置为11211;
2)-U Memcached的UDP监听端口,缺省配置为11211,为0时表示关闭UDP监听;
3)-s Memcached监听的UNIX套接字路径;
4)-a 访问UNIX套接字的八进制掩码,缺省配置为0700;
5)-l 监听的服务器IP地址,默认为所有网卡;
6)-d 为Memcached服务器启动守护进程;
7)-r 最大core文件大小;
8)-u 运行Memcached的用户,如果当前为root的话需要使用此参数指定用户;
9)-m 分配给Memcached使用的内存数量,单位是MB;
10)-M 指示Memcached在内存用光的时候返回错误而不是使用LRU算法移除数据记录;
11)-c 最大并发连数,缺省配置为1024;
12)-v –vv –vvv 设定服务器端打印的消息的详细程度,其中-v仅打印错误和警告信息,-vv在-v的基础上还会打印客户端的命令和相应,-vvv在-vv的基础上还会打印内存状态转换信息;
13)-f 用于设置chunk大小的递增因子;
14)-n 最小的chunk大小,缺省配置为48个字节;
15)-t Memcached服务器使用的线程数,缺省配置为4个;
16)-L 尝试使用大内存页;
17)-R 每个事件的最大请求数,缺省配置为20个;
18)-C 禁用CAS,CAS模式会带来8个字节的冗余;
memcached的一致性hash算法(平衡性,单调性,分散性,负载)
它的最终目的是实现在移除、添加一个cache机器时对已经存在的key映射关系的影响能够尽可能的降到最小。
memcached的LRU算法是在slab中进行的
如果存在slab class1:chunk=80Bytes,slab class2:chunk=160Bytes,slab class3:chunk=240Bytes,如果slab class3 chunk被占满了,下一个数据还是选择了slab class3,首先memcached会尝试给该slab class3再分配一个page,但是如果分配失败了,就会在这个slab class里面执行LRU,将新数据存入,即使是slab class1,2都是空的也会这样做。
memcached的chunk里面到底存放了什么
chunk 里面包含了一个item ,item里面为 item结构体(固定的,32位系统为32Byte,64位系统为48Byte)+key+value
◎Memcached的理论参数计算方式
影响 memcached 工作的几个参数有:
常量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)
常量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全部分配满)。