## 原理
memcached是一个高性能内存对象缓存系统. 它基于libevent,可方便地拓展为任意大小, 而且对防止内存swap和使用非阻塞IO做了大量优化工作.
memcached内存分配:
memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存.
如果我们在启动memcached时没有指定-m
参数的话, 那么memcached能使用的最大内存为默认的64M,但是memcached启动的时候并不会一次性就都分配出来,而是当发现memcached已被分配的内存不够用的时候才会进行申请. memcached申请内存时一次会申请一个Slab(默认为1M). 然后会将这一个Slab分成不同的Class, 每个Class内部都有N个大小相等的Chunk.每个chunk中都保存了一个item结构体、一对key value键值对.
安装
Memcached依赖libevent,所以我们首先需要安装libevent
1 | wget http://jaist.dl.sourceforge.net/project/levent/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz |
接下来安装Memcached
1 | wget http://memcached.org/latest |
memcached
命令选项
网络相关
-s <file>
: Unix socket path to listen on (disables network support).-a <perms>
: 当通过s选项创建socket的时候,我们可以通过-a选项指定创建socket使用的权限(权限为八进制).-l <ip_addr>
: 监听的主机地址. 默认是本机任何可用的地址.-d
: 以后台进程方式运行memcached-u <username>
: memcached不能以root用户运行,如果当前用户为root, 我们需要通过该参数指定用户为root-c <num>
: 设置最大同时连接数.(默认是1024).-C
: 关闭CAS. (每个对象都会减少8bytes大小).-p <num>
: 设置监听TCP端口号, 默认是11211.-P
: 设置pid存储文件.-U <num>
: 设置监听UDP端口号, 默认是11211, 0 表示关闭UDP监听.-r
: 将最大的核心文件大小限制提升到允许的最大值.-v
: 设置为verbose 同时会输出发生的errors 和warnings.-i
: 打印memcached 和libevent 授权.-R <num>
: 这个选项是设置服务器可以处理一个独立客户端连接顺序请求的数量,以防止产生其他客户端饥饿的情况. 一旦设置了这个值当服务器处理一个连接超过20个(默认值)请求之后,就会尝试处理其他的连接请求.
内存相关
-m <num>
: 设置对象存储能使用的最大内存(单位是MB,默认是64M)-M
: 关闭对象存储所需内存超过最大内存时,自动删除缓存对象的功能. 如果memcached的配置内存达到最大值就不可再存储新的对象.-f <factor>
: Class的成长因子(默认是1.25). 也就是说如果Class1是100B,那么Class2就是125B.-n <size>
: key, value, and flags分配到的最小字节数(默认是48字节). 如果你的键值对的值都很小,你可以调低这个值来达到更高的性能. 如果你的成长因子比较大,那么你可以调高这个值,提升命中率.-t <threads>
: 处理请求的线程数(默认是4). 这个选项只有memcached被编译的时候指定了线程开启才有用.-k
: 锁定所有的分页内存. 在巨大的缓存系统中,使用这个选项是非常危险的,使用的使用要参考README文件和memcached homepage进行配置.-L
: 尝试使用尽可能使用到的内存叶. 增加内存叶大小可以减少TLB未命中和提供性能. 为了可以从OS获得更大的内存页,memcached会在一个巨大的chunk上分配所有的item-I <size>
: 指定slab page大小(默认是1mb,最小是1k, 最大是128m). 改变这个值会增加每个item大小的值. 使用-vv来查看更改后的值-F
: 关闭flush_all
命令.
1 | memcached -d -p 10021 -l 10.234.10.12 -u root -c 1024 -P ./memcached1.pid |
java使用
我们使用spymemcached作为java客户端连接memcached. 在Maven项目中添加以下依赖
1 | <groupId>net.spy</groupId> |
然后连接memcached
1 | MemcachedClient client = new MemcachedClient(new InetSocketAddress("10.234.10.12", 10021)); |
通过这一行我们就成功的连接上了memcached.然后我们就可以使用spymemcached提供的大量api来操作memcached
memcached信息统计
我们可以使用telnet命令直接连接memcachedtelnet 127.0.0.1 10021
,然后输入下列命令查看相关信息
stats
统计memcached的各种信息
STAT pid 20401
memcache服务器的进程IDSTAT uptime 47
服务器已经运行的秒数STAT time 1447835371
服务器当前的unix时间戳STAT version 1.4.24
memcache版本STAT libevent 2.0.22-stable
libevent版本STAT pointer_size 64
当前操作系统的指针大小(32位系统一般是32bit)STAT rusage_user 0.002999
进程的累计用户时间STAT rusage_system 0.001999
进程的累计系统时间STAT curr_connections 10
当前打开着的连接数STAT total_connections 11
从服务器启动以后曾经打开过的连接数STAT connection_structures 11
服务器分配的连接构造数STAT reserved_fds 20
STAT cmd_get 0
get命令(获取)总请求次数STAT cmd_set 0
set命令(保存)总请求次数STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0
总命中次数STAT get_misses 0
总未命中次数STAT delete_misses 0
delete命令未命中次数STAT delete_hits 0
delete命令命中次数STAT incr_misses 0
incr命令未命中次数STAT incr_hits 0
incr命令命中次数STAT decr_misses 0
decr命令未命中次数STAT decr_hits 0
decr命令命中次数STAT cas_misses 0
cas命令未命中次数STAT cas_hits 0
cas命令命中次数STAT cas_badval 0
STAT touch_hits 0
touch命令命中次数STAT touch_misses 0
touch命令未命中次数STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 7
总读取字节数(请求字节数)STAT bytes_written 0
总发送字节数(结果字节数)STAT limit_maxbytes 67108864
分配给memcache的内存大小(字节)STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
当前线程数STAT conn_yields 0
STAT hash_power_level 16
hash等级STAT hash_bytes 524288
hash字节数STAT hash_is_expanding 0
STAT malloc_fails 0
分配失败次数STAT bytes 0
当前服务器存储items占用的字节数STAT curr_items 0
服务器当前存储的items数量STAT total_items 0
从服务器启动以后存储的items总数量STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
为获取空闲内存而删除的items数(分配给memcache的空间用满后需STAT reclaimed 0
STAT crawler_reclaimed 0
STAT crawler_items_checked 0
STAT lrutail_reflocked 0
我们也可以使用java获取这些信息
1 | MemcachedClient client = new MemcachedClient(new InetSocketAddress("10.234.10.12", 10021)); |
stats reset
重新统计数据
stats slabs
显示slabs信息,可以详细看到数据的分段存储情况
STAT active_slabs 0
STAT total_malloced 0
stats items
显示slab中的item数目
stats cachedump 1 0
列出slabs第一段里存的KEY值
STAT evictions 0
表示要腾出新空间给新的item而移动的合法item数目