分类: 数据库开发技术
2011-05-14 11:37:07
1.
本手册介绍安装、运行和运维Memcached。
目标读者:开发、测试和运维人员。
memcached 是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于减少数据库负载,提升性能。
l 协议简单
l 基于libevent的事件处理
l 内置内存存储方式
l memcached不互相通信的分布式。
官方网站: ,列出一些memcached Users。下面是使用memcached的一般架构。
Figure 2—壹:memcached使用案例
l libevent:libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。编译库代码时,编译脚本会判断OS支持哪种类型的事件机制(select、epoll或 kqueue),然后条件编译相应代码,供上层使用的接口仍然是保持统一的。
,安装软件到$HOME/local/。详细目录约定参见UC讨论区--基础技术板块。
wget ~provos/libevent-1.4.13-stable.tar.gz
tar zxvf libevent-1.4.13-stable.tgz
cd libevent-1.4.13-stable/
./configure --prefix=$HOME/local/libevent
make;make install
如果有链接打不开,请登录页面:下载对应版本。
wget
tar zxvf memcached-1.4.5.tar.gz
cd memcached-1.4.5
./configure --prefix=$HOME/local/memcached \
--with-libevent=$HOME/local/libevent
make;make install
请用新版memcached-1.4.5,如有下载链接不可用,请尝试页面:下载该版本。
不指定--with-libevent则后面运行memcached时可能提示找不到libevent.so:
./memcached
./memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
需要设置环境变量,在~/.bash_profile内加个lib的查找路径,即可解决:
vi ~/.bash_profile
export LD_LIBRARY_PATH= $HOME/local/libevent/lib:$LD_LIBRARY_PATH
source ~/.bash_profile
运维部署时:
./memcached -d -P $HOME/local/memcached/bin/memcached.pid -t 8 -m 2048 -f 1.1 -l 192.168.3.173 -p 11211
测试或调试时:
./memcached -t 8 -m 16 -l localhost -p 31211 -vv
监听unix socket时:
./memcached -d -t 8 -m 2048 -s /home/cws/local/memcached/memcache.sock
备注:
因为32位系统的应用程序最大可管理的内存上限为3G,如果32位机器有很多内存,请启动多个memcached,每个最大可配置-m参数为 2.8GB 内存。
请多线程方式启动memcached,线程数不要超过cpu个数,用-t选项,例如-t 8,表示启动8条线程。
-P参数可用来脚本停止memcached和监控。
-f指明chunk size的增长因子,用较小值1.1可减少内存分配方面的浪费,详见下述启动参数一节。
启动参数注释如下:
-p
指定服务TCP端口,默认为11211
-U
指定服务UDP端口 默认11211表示打开, 设置0表示关闭
-s
指定unix domain socket的文件名,则关闭端口绑定
-a
UNIX domain socket文件属性屏蔽字。8进制,默认0700(和-s配合使用)
-l
指定监听IP地址(默认对所有网卡IP都生效)
-d run as a daemon
以精灵程序的方式运行
-r maximize core file limit
设置coredump文件SIZE至上限
-u
指定进程用户身份(只有以root运行时才有效,且root身份必须指定用户身份,memcached禁止以进程用户身份为root)
-m
分配给memcached用作缓存的内存大小,单位为MB。默认64MB。
注意32位系统最大可管理的内存上限为3G,预留一些,测试分配2.8G是有效的。
不要给memcached分配超过机器内存数,否则会自动使用swap分区,让性能大降,产生超时。
(调优参数)
-M return error on memory exhausted (rather than removing items)
LRU算法开关。缓存满时不使用LRU算法替换旧的数据,返回错误
每个slab内的数据使用LRU,不是全局的。因此,在一些情况下,反而会影响命中率
(例如多数KEY-VALUE大小近似,都保存在同一slab的情况下)
-c
最大并发连接数。默认1024。
memcached使用libevent, 可以支持10K个连接。且memcached推荐客户端缓存连接(长连接)
(调优参数)
-k lock down all paged memory. Note that there is a
limit on how much memory you may lock. Trying to
allocate more than that would fail, so be sure you
set the limit correctly for the user you started
the daemon with (not for -u
under sh this is done with 'ulimit -S -l NUM_KB').
是否调用mlockall()锁定内存页。
注意:如果锁定了内存页,则若申请内存大小超过锁定值(可以通过ulimit -l查看)时就有可能失败
(不建议使用。默认ulimit -l只有64KB)
-v verbose (print errors/warnings while in event loop)
输出详细信息(在event轮询时输出错误或警告信息,以daemon方式运行无效)
-vv very verbose (also print client commands/reponses)
输出更详细的信息(包括输出客户端的命令及回应信息)
-vvv extremely verbose (also print internal state transitions)
输出最详细的信息(包括输出内部的状态信息)
-h print this help and exit
打印版本、帮助信息及退出
-i print memcached and libevent license
打印memcached及libevent的licence
-P
保存进程ID到指定文件。与-d配合使用
-f
chunk size的增长因子(合理范围1.05~2,默认:1.25)
(1.2版本之前默认是2)
(调优参数)
-n
每个ITEM保存数据占用的最小空间。最小空间大小=KEY的长度+value的长度+flags的长度(默认为48字节)
而每个ITEM的实际占用空间为 ITEM保存占用数据保存的最小空间 + ITEM结构占用的空间 = 48 + 32 = 80字节。
因此chunk size的默认初始值为80字节
(调优参数)
-L Try to use large memory pages (if available). Increasing
the memory page size could reduce the number of TLB misses
and improve the performance. In order to get large pages
from the OS, memcached will allocate the total item-cache
in one large chunk.
尝试使用大容量内存页(如果可能的话)。增加内存页容量可以减少虚存-物理内存映射页表缓冲命中失败(TLB-MISSED)的次数,
并提高性能。但memcached会在启动的时候立即向OS申请-m参数指定的最大缓存块。
(调优参数)
-D
This is used for per-prefix stats reporting. The default is
":" (colon). If this option is specified, stats collection
is turned on automatically; if not, then it may be turned on
by sending the "stats detail on" command to the server.
指定统计报告时ID同KEY之间的分隔符。默认的分隔符为“:”。
如果指定了此参数,统计采集功能就会自动启动;否则,可以通过发送“stats detail on”命令启动统计采集功能。
-t
memcached启动的工作线程数。默认为4。
默认会创建4个工作线程,主线程用于监听客户建立的连接请求、accpet请求,
然后通过管道通知子线程,由子线程处理读写请求。
memcached的多线程主要是通过实例化多个libevent实现的,
分别是一个主线程和n个工作(workers)线程,无论是主线程还是workers线程全部通过libevent 管理网络事件,
实际上每个线程都是一个单独的libevent实例。
建议不要超过系统CPU的个数。
(调优参数)
-R Maximum number of requests per event, limits the number of
requests process for a given connection to prevent
starvation (default: 20)
每次事件触发响应新连接的最大数目。设置此限制是防止其他I/O事件“挨饿”,得不到响应。
每个工作线程都单独建立了libevent事件触发。
(调优参数,一般不需要调整)
-C Disable use of CAS
关闭'CAS'指令。
“cas” is a check and set operation which means
“store this data but only if no one else has updated since I last fetched it.”
意思是说如果这个值我最后一次取的没有被修改的话才存储这个值,
比如我先获取一个key为”update_time”的值,然后有其他进程修改了这个值,
此时我再调用cas设置这个值时则会返回一个EXSISTS的错误表示修改失败。
默认支持cas指令。则每次value的修改,都会记录一个CAS序列号(CAS_UNIQUE)。
gets指令会返回CAS_UNIQUE。
-b Set the backlog queue limit (default: 1024)
指定监听队列长度(listen()的参数)。默认为1024。
(调优参数。不需要调整,内核对监听队列长度有个上限)
-B Binding protocol - one of ascii, binary, or auto (default)
指定绑定的memcached协议。包括:ascii: 文本协议;binary: 二进制协议;auto: 自动检测(默认选项)
-I Override the size of each slab page. Adjusts max item size
改变slab page的容量大小,以调整ITEM容量的最大值,默认为1MB。
设置参数:
不能少于1024bytes(即1K),不能大于128MB。memcached不推荐大于1MB。
(调优参数)
-S Turn on Sasl authentication
启动SSL认证。需要在编译支持SSL。
使用SSL认证时,只能使用二进制协议,不能使用文本协议。