学习MemCache的都知道,已知MemCache的某个节点,直接telnet过去,就可以使用各种命令操作MemCache了,下面学习MemCache的几种命令:
命 令 |
作 用 |
get |
返回Key对应的Value值 |
add |
添加一个Key值,没有则添加成功并提示STORED,有则失败并提示NOT_STORED |
set |
无条件地设置一个Key值,没有就增加,有就覆盖,操作成功提示STORED |
replace |
按照相应的Key值替换数据,如果Key值不存在则会操作失败 |
stats |
返回MemCache通用统计信息(下面有详细解读) |
stats items |
返回各个slab中item的数目和最老的item的年龄(最后一次访问距离现在的秒数) |
stats slabs |
返回MemCache运行期间创建的每个slab的信息(下面有详细解读) |
version |
返回当前MemCache版本号 |
flush_all |
清空所有键值,但不会删除items,所以此时MemCache依旧占用内存 |
quit |
关闭连接 |
stats指令解读
stats是一个比较重要的指令,用于列出当前MemCache服务器的状态,拿一组数据举个例子:
STAT pid 1023STAT uptime 21069937STAT time 1447235954STAT version 1.4.5STAT pointer_size 64STAT rusage_user 1167.020934STAT rusage_system 3346.933170STAT curr_connections 29STAT total_connections 21STAT connection_structures 49STAT cmd_get 49STAT cmd_set 7458STAT cmd_flush 0STAT get_hits 7401STAT get_misses 57..(delete、incr、decr、cas的hits和misses数,cas还多一个badval)
STAT auth_cmds 0STAT auth_errors 0STAT bytes_read 22026555STAT bytes_written 8930466STAT limit_maxbytes 4134304000STAT accepting_conns 1STAT listen_disabled_num 0STAT threads 4STAT bytes 151255336STAT current_items 57146STAT total_items 580656STAT evicitions 0
这些参数反映着MemCache服务器的基本信息,它们的意思是:
参 数 名 |
作 用 |
pid |
MemCache服务器的进程id |
uptime |
服务器已经运行的秒数 |
time |
服务器当前的UNIX时间戳 |
version |
MemCache版本 |
pointer_size |
当前操作系统指针大小,反映了操作系统的位数,64意味着MemCache服务器是64位的 |
rusage_user |
进程的累计用户时间 |
rusage_system |
进程的累计系统时间 |
curr_connections |
当前打开着的连接数 |
total_connections |
当服务器启动以后曾经打开过的连接数 |
connection_structures |
服务器分配的连接构造数 |
cmd_get |
get命令总请求次数 |
cmd_set |
set命令总请求次数 |
cmd_flush |
flush_all命令总请求次数 |
get_hits |
总命中次数,重要,缓存最重要的参数就是缓存命中率,以get_hits / (get_hits + get_misses)表示,比如这个缓存命中率就是99.2% |
get_misses |
总未命中次数 |
auth_cmds |
认证命令的处理次数 |
auth_errors |
认证失败的处理次数 |
bytes_read |
总读取的字节数 |
bytes_written |
总发送的字节数 |
limit_maxbytes |
分配给MemCache的内存大小(单位为字节) |
accepting_conns |
是否已经达到连接的最大值,1表示达到,0表示未达到 |
listen_disabled_num |
统计当前服务器连接数曾经达到最大连接的次数,这个次数应该为0或者接近于0,如果这个数字不断增长, 就要小心我们的服务了 |
threads |
当前MemCache总线程数,由于MemCache的线程是基于事件驱动机制的,因此不会一个线程对应一个用户请求 |
bytes |
当前服务器存储的items总字节数 |
current_items |
当前服务器存储的items总数量 |
total_items |
自服务器启动以后存储的items总数量 |
stats slab指令解读
如果对上面的MemCache存储机制比较理解了,那么我们来看一下各个slab中的信息,还是拿一组数据举个例子:
STAT1:chunk_size 96
...
STAT 2:chunk_size 144
STAT 2:chunks_per_page 7281
STAT 2:total_pages 7
STAT 2:total_chunks 50967
STAT 2:used_chunks 45197
STAT 2:free_chunks 1
STAT 2:free_chunks_end 5769
STAT 2:mem_requested 6084638
STAT 2:get_hits 48084
STAT 2:cmd_set 59588271
STAT 2:delete_hits 0
STAT 2:incr_hits 0
STAT 2:decr_hits 0
STAT 2:cas_hits 0
STAT 2:cas_badval 0
...
STAT 3:chunk_size 216
...
首先看到,第二个slab的chunk_size(144)/第一个slab的chunk_size(96)=1.5,第三个slab的chunk_size(216)/第二个slab的chunk_size(144)=1.5,可以确定这个MemCache的增长因子是1.5,chunk_size以1.5倍增长。然后解释下字段的含义:
参 数 名 |
作 用 |
chunk_size |
当前slab每个chunk的大小,单位为字节 |
chunks_per_page |
每个page可以存放的chunk数目,由于每个page固定为1M即1024*1024字节,所以这个值就是(1024*1024/chunk_size) |
total_pages |
分配给当前slab的page总数 |
total_chunks |
当前slab最多能够存放的chunk数,这个值是total_pages*chunks_per_page |
used_chunks |
已经被分配给存储对象的chunks数目 |
free_chunks |
曾经被使用过但是因为过期而被回收的chunk数 |
free_chunks_end |
新分配但还没有被使用的chunk数,这个值不为0则说明当前slab从来没有出现过容量不够的时候 |
mem_requested |
当前slab中被请求用来存储数据的内存空间字节总数,(total_chunks*chunk_size)-mem_requested表示有多少内存在当前slab中是被闲置的,这包括未用的slab+使用的slab中浪费的内存 |
get_hits |
当前slab中命中的get请求数 |
cmd_set |
当前slab中接收的所有set命令请求数 |
delete_hits |
当前slab中命中的delete请求数 |
incr_hits |
当前slab中命中的incr请求数 |
decr_hits |
当前slab中命中的decr请求数 |
cas_hits |
当前slab中命中的cas请求数 |
cas_badval |
当前slab中命中但是更新失败的cas请求数 |
看到这个命令的输出量很大,所有信息都很有作用。举个例子吧,比如第一个slab中使用的chunks很少,第二个slab中使用的chunks很多,这时就可以考虑适当增大MemCache的增长因子了,让一部分数据落到第一个slab中去,适当平衡两个slab中的内存,避免空间浪费。
文章来自:五月的仓颉