memcached使用详解
一.memcached介绍1.基于libevent的事件处理
libevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:Windows/Linux/BSD/Solaris 等操作系统的的事件处理。
包装的接口包括:poll、select(Windows)、epoll(Linux)、kqueue(BSD)、/dev/pool(Solaris)
Memcached 使用libevent来进行网络并发连接的处理,能够保持在很大并发情况下,仍旧能够保持快速的响应能力。
libevent: http://www.monkey.org/~provos/libevent/
2.内置内存存储方式
为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。
数据存储方式:Slab Allocation
结构图如下:
http://blog.运维网.com/attachment/201105/110154625.png
Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块(chunk),并把尺寸相同的块分成组,以完全解决内存碎片问题。但由于分配的是特定长度的内存,因此无法有效利用分配的内存。比如将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。
Page:分配给Slab的内存空间,默认是1MB。分配给Slab之后根据slab的大小切分成chunk。
Chunk:用于缓存记录的内存空间。
Slab Class:特定大小的chunk的组。
memcached根据收到的数据的大小,选择最适合数据大小的slab。
memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。
数据过期方式:Lazy Expiration + LRU
Lazy Expiration
memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过
期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。
LRU
memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不
足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。当memcached的内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。
二.memcached安装
1.安装libevent
# wget http://www.monkey.org/~provos/libevent-2.0.11-stable.tar.gz
# tar zxvpf libevent-2.0.11-stable.tar.gz -C ../software/
# ./configure --prefix=/usr/local
# make
# make install
2.安装memcached
# wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz
# tar zxvf memcached-1.4.5.tar.gz -C ../software/
# ./configure --prefix=/usr/local/memcached-1.4.5 --with-libevent=/usr/local
# make
# make install
3.相关错误以及解决方案
错误信息:
./memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
解决方法:
# whereis libevent-2.0.so.5
libevent-2.0.so: /usr/local/lib/libevent-2.0.so.5
# ldd /usr/local/memcached-1.4.5/bin/memcached
libevent-2.0.so.5 => not found
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000032f2600000)
libc.so.6 => /lib64/libc.so.6 (0x00000032f1a00000)
/lib64/ld-linux-x86-64.so.2 (0x00000032f1600000)
# LD_DEBUG=libs ./memcached -v
9873: find library=libevent-2.0.so.5 ; searching
9873: search cache=/etc/ld.so.cache
9873: search path=/lib64/tls/x86_64:/lib64/tls:/lib64/x86_64:/lib64:/usr/lib64/tls/x86_64:/usr/lib64/tls:/usr/lib64/x86_64:/usr/lib64 (system search path)
9873: trying file=/lib64/tls/x86_64/libevent-2.0.so.5
9873: trying file=/lib64/tls/libevent-2.0.so.5
9873: trying file=/lib64/x86_64/libevent-2.0.so.5
9873: trying file=/lib64/libevent-2.0.so.5
9873: trying file=/usr/lib64/tls/x86_64/libevent-2.0.so.5
9873: trying file=/usr/lib64/tls/libevent-2.0.so.5
9873: trying file=/usr/lib64/x86_64/libevent-2.0.so.5
9873: trying file=/usr/lib64/libevent-2.0.so.5
9873:
./memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
搜索路径为:/lib64 /usr/lib64
因此做个软连接到/usr/lib64目录下:
# ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
# ldd /usr/local/memcached-1.4.5/bin/memcached
libevent-2.0.so.5 => /usr/lib64/libevent-2.0.so.5 (0x00002adde8270000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000032f2600000)
libc.so.6 => /lib64/libc.so.6 (0x00000032f1a00000)
librt.so.1 => /lib64/librt.so.1 (0x00000032f2a00000)
/lib64/ld-linux-x86-64.so.2 (0x00000032f1600000)
可看出已经ok了。很多时候遇到找不到lib库的问题可以通过上面的方法来解决。
三.启动memcached
1.memcached启动选项:
-p TCP监听端口 (default: 11211)
-U UDP 监听端口 (default: 11211, 0 is off)
-s UNIX socket监听路径,不支持网络
-a UNIX socket访问掩码, 八进制 (default: 0700)
-l 监听的服务器IP地址 (default: all addresses)
-d 启动一个守护进程
-r 最大限度利用核心文件限制
-u运行memcached用户
-m 最大的内存使用 (default: 64 MB)
-M 内存耗尽返回错误
-c 最大并发连接 (default: 1024)
-k 锁定所有分页内存
-v 输出警告和错误信息
-vv 同时打印客户端请求和返回信息
-vvv 打印内部状态转换信息
-i 打印memcached 和 libevent 版本信息
-P 设置保存pid文件, only used with -d option
-f 块大小增长倍数 (default: 1.25)
-n key+value+flags最小分配空间(default: 48)
-L 如何有效,尝试使用大内存页。增加内存页大小可以减少失误的TLB数量,提高性能。
-D 指定key和IDs的分隔符 default is ":" (colon). 如果指定此选项,统计信息收集自动开启;
-t 使用的线程数量 (default: 4)
-R 每个事件的最大请求数 (default: 20)
-C 禁止使用 CAS
-b 设置积压队列数限制 (default: 1024)
-B 绑定协议 - one of ascii, binary, or auto (default)
-I 分配给每个slab页(default: 1mb, min: 1k, max: 128m)
2.启动
# ./memcached -d -m 500 -u root -l 192.168.50.10 -p 12000 -c 256 -P /tmp/memcached.pid -vvv
slab class 1: chunk size 96 perslab 10922
slab class 2: chunk size 120 perslab 8738
slab class 3: chunk size 152 perslab 6898
slab class 4: chunk size 192 perslab 5461
slab class 5: chunk size 240 perslab 4369
slab class 6: chunk size 304 perslab 3449
slab class 7: chunk size 384 perslab 2730
slab class 8: chunk size 480 perslab 2184
slab class 9: chunk size 600 perslab 1747
slab class10: chunk size 752 perslab 1394
slab class11: chunk size 944 perslab 1110
slab class12: chunk size 1184 perslab 885
slab class13: chunk size 1480 perslab 708
slab class14: chunk size 1856 perslab 564
slab class15: chunk size 2320 perslab 451
slab class16: chunk size 2904 perslab 361
slab class17: chunk size 3632 perslab 288
slab class18: chunk size 4544 perslab 230
slab class19: chunk size 5680 perslab 184
slab class20: chunk size 7104 perslab 147
slab class21: chunk size 8880 perslab 118
slab class22: chunk size 11104 perslab 94
slab class23: chunk size 13880 perslab 75
slab class24: chunk size 17352 perslab 60
slab class25: chunk size 21696 perslab 48
slab class26: chunk size 27120 perslab 38
slab class27: chunk size 33904 perslab 30
slab class28: chunk size 42384 perslab 24
slab class29: chunk size 52984 perslab 19
slab class30: chunk size 66232 perslab 15
slab class31: chunk size 82792 perslab 12
slab class32: chunk size 103496 perslab 10
slab class33: chunk size 129376 perslab 8
slab class34: chunk size 161720 perslab 6
slab class35: chunk size 202152 perslab 5
slab class36: chunk size 252696 perslab 4
slab class37: chunk size 315872 perslab 3
slab class38: chunk size 394840 perslab 2
slab class39: chunk size 493552 perslab 2
slab class40: chunk size 616944 perslab 1
slab class41: chunk size 771184 perslab 1
slab class42: chunk size 1048576 perslab 1
页:
[1]