linux memcached 安装和使用

来源:互联网 发布:一对一聊天的软件 编辑:程序博客网 时间:2024/04/29 16:14

参考文章: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全部分配满)。

Memcached 的存储数据过程

存储:存储的数据的key+value的长度找到合适的slabs,如果没有空间则分配新page,如果没有page了则使用LRU置换旧数据,然后存储到相应位置
查询:存储的key+value 长度找到合适的slabs,然后遍历slabs上面的元素,直到找到,感觉有点像hashmap。
如果要用到分布式,需在客户端使用分布式算法定位到对应的memcached服务器,然后再执行上面步骤,一般使用一致性hash算法。
0 0
原创粉丝点击