查看、分析memcached使用状态

  • Post author:
  • Post category:其他



访问量上升,数据库压力大,怎么办?好办法是在中间挡一层缓存!这个缓存要求高效,不能比数据库慢,否则服务质量受影响;如果能把数据用hash打散存储到硬盘,也是可以的,不过在内存越来越便宜的今天,还是使用内存吧!

mysql也有自己的缓存,也是存储在内存的,但是有一个说法是:



以下是引用片段:

只能有一个实例

意味着你能存储内容的上限就是你服务器的可用内存,一台服务器能有多少内存?你又能存多少呢?

只要有写操作,mysql的query cache就失效

只要数据库内容稍有改变,那怕改变的是其他行,mysql的query cache也会失效

再说,如果mysql都抗不住了,怎么还能指望它提供的缓存呢?

所以我可以使用memcached了!他的好处和如何用可以参考:



以下是引用片段:


1:《

Memcache和mysql交互流程操作原理

2:《

让memcached和mysql更好的工作

开发时面对需求是个麻烦事,更漫长而闹心的是维护,所以我更关心的是memcached运行中的情况。还好的是,memcached的作者给我们提供查看运行情况的命令。主要是“stats”,使用方法为 “telnet ip 端口号”,登录后使用“stats”命令。

然后你可以看见很多内容,具体可以参考:《

memcacche stats



以下是引用片段:

pid = process id

uptime = number of seconds since the process was started

time = current time

version = memcached version

rusage_user = seconds the cpu has devoted to the process as the user

rusage_system = seconds the cpu has devoted to the process as the system

curr_items = total number of items currently in memcache

total_items = total number of items that have passed through the cache

bytes = total number of bytes currently in use by curr_items

curr_connections = total number of open connections to memcached

connection_structures = ???

cmd_get = total GET commands issued to the server

cmd_set = total SET commands issued to the server

get_hits = total number of times a GET command was able to retrieve and

return data

get_misses = total number of times a GET command was unable to retrieve and

return data

bytes_read = total number of bytes input into the server

bytes_written = total number of bytes written by the server

limit_maxbytes = total storage bytes available to the server.

着重说一下几个对观测很有用的项。


limit_maxbytes、bytes

memcached在存储的时候是可以设置失效时间的,但如果存储已经满了,那旧数据即使没有到过期时间,也会被移除。所以需要观察memcached存储是否已经满了,同时这对扩容也是有意义的参考。limit_maxbytes即总的存储大小,而bytes就是已经使用的大小,从这两个数据就可以看出在memcached启动时,我们为它分配的内存是否足够使用。


cmd_get、cmd_set

memcached启动后,我们对它一共做了多少次读取操作呢?从这两个参数可以观察出来。


get_hits、get_misses

使用memcached后,我们需要评估我们使用的策略是否合理。不能够使用中间缓存后,后端的数据库还是有较大的访问量,这样的话中间缓存就变得没有意义了。get_hits表示命中了多少次读取,即来memcached取到了多少有效数据;get_misses表示没有命中的次数,即此次来取数据的时候,memcached并没有你所查询的数据。如果没有清零统计数据的话,cmd_get = get_hits + get_misses。

memcached 的状态查询还有其它的命令,可以参考:《

Memcached的stats命令

如下:

stats reset

清空统计数据

stats malloc

显示内存分配数据

stats maps

这个不太确定,看源代码是把/proc/self/maps的数据显示出来。

stats cachedump slab_id limit_num

显示某个slab中的前limit_num个key列表,显示格式如下

ITEM key_name [ value_length b; expire_time|access_time s]

其中,memcached 1.2.2及以前版本显示的是  访问时间(timestamp)

1.2.4以上版本,包括1.2.4显示 过期时间(timestamp)

如果是永不过期的key,expire_time会显示为服务器启动的时间

stats cachedump 7 2

ITEM copy_test1 [250 b; 1207795754 s]

ITEM copy_test [248 b; 1207793649 s]

stats slabs

显示各个slab的信息,包括chunk的大小、数目、使用情况等

stats items

显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)

stats detail [on|off|dump]

设置或者显示详细操作记录

参数为on,打开详细操作记录

参数为off,关闭详细操作记录

参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数)

stats detail dump

PREFIX copy_test2 get 1 hit 1 set 0 del 0

PREFIX copy_test1 get 1 hit 1 set 0 del 0

PREFIX cpy get 1 hit 0 set 0 del 0

memcached数据存储和取回相关的基本命令只有4条。

下面将采用telnet与memcached进行交互,并介绍这4条基本命令。

假设memcached服务器在本机上,并监听在默认端口11211上。

telnet连接到memcached:

telnet 127.0.0.1 11211


SET:添加一个新的条目到memcached,或是用新的数据替换掉已存在的条目

set test1 0 0 10

testing001

STORED


ADD:仅当key不存在的情况下存储数据。如果一个key已经存在,将得到NOT_STORED的响应

add test1 0 0 10

testing002

NOT_STORED

add test2 0 0 10

testing002

STORED


REPLACE:仅当key已经存在的情况下存储数据。如果一个key不存在,将得到NOT_STORED的响应

replace test1 0 0 10

testing003

STORED

replace test3 0 0 10

testing003

NOT_STORED


GET:从memcached中返回数据。从缓存中返回数据时,将在第一行得到key的名字,flag的值和返回的value的长度。真正的数据在第二行,最后返回END。如果key并不存在,那么在第一行就直接返回END。

get test1

VALUE test1 0 10

testing003

END

get test4

END

get test1 test2

VALUE test1 0 10

testing003

END

注:像上面那样你可以在一个请求中包含多个由空格分开的key。当请求多个key时,将只会得到那些有存储数据的key的响应。memcached将不会响应没有存储Data的key。

###################################################################

1、启动Memcache 常用参数

memcached 1.4.3

-p <num>      设置端口号(默认不设置为: 11211)

-U <num>      UDP监听端口 (默认: 11211, 0 时关闭)



-l <ip_addr>  绑定地址 (默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)

-d            独立进程运行

-u <username> 绑定使用指定用于运行进程 <username>

-m <num>      允许最大内存用量,单位M (默认: 64 MB)

-P <file>     将PID写入文件<file>,这样可以使得后边进行快速进程终止, 需要与 -d 一起使用

如:

在linux下:./usr/local/bin/memcached -d -u jb-mc -l 192.168.1.197 -m 2048 -p 12121

在window下:d:\App_Serv\memcached\memcached.exe -d RunService -l 127.0.0.1 -p 11211 -m 500

在windows下注册为服务后运行:

sc.exe create jb-Memcached binpath= “d:\App_Serv\memcached\memcached.exe -d RunService -p 11211 -m 500″ start= auto

net start jb-Memcached

2、连接:telnet 127.0.0.1 11211

不要说不会用这个?

3、写入memcache

<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n

a) <command name> 可以是”set”, “add”, “replace”。

“set”表示按照相应的<key>存储该数据,没有的时候增加,有的覆盖。

“add”表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败。

“replace”表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败

b) <key> 客户端需要保存数据的key。

c) <flags> 是一个16位的无符号的整数(以十进制的方式表示)。

该标志将和需要存储的数据一起存储,并在客户端get数据时返回。

客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的。

d) <exptime> 过期的时间。

若为0表示存储的数据永远不过时(但可被服务器算法:LRU 等替换)。

如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。

e) <bytes> 需要存储的字节数(不包含最后的”\r\n”),当用户希望存储空数据时,<bytes>可以为0

f) 最后客户端需要加上”\r\n”作为”命令头”的结束标志。

<data block>\r\n

紧接着”命令头”结束之后就要发送数据块(即希望存储的数据内容),最后加上”\r\n”作为此次通讯的结束。

结果响应:reply

当以上数据发送结束之后,服务器将返回一个应答。可能有如下的情况:

a) “STORED\r\n”:表示存储成功

b) “NOT_STORED\r\n” : 表示存储失败,但是该失败不是由于错误。

通常这是由于”add”或者”replace”命令本身的要求所引起的,或者该项在删除队列之中。

如: set key 33 0 4\r\n

ffff\r\n

4、获取/检查KeyValue

get <key>*\r\n

a) <key>* 表示一个或者多个key(以空格分开)

b) “\r\n” 命令头的结束

结果响应:reply

服务器端将返回0个或者多个的数据项。每个数据项都是由一个文本行和一个数据块组成。当所有的数据项都接收完毕将收到”END\r\n”

每一项的数据结构:

VALUE <key> <flags> <bytes>\r\n

<data block>\r\n

a) <key> 希望得到存储数据的key

b) <falg> 发送set命令时设置的标志项

c) <bytes> 发送数据块的长度(不包含”\r\n”)

d) “\r\n” 文本行的结束标志

e) <data block> 希望接收的数据项。

f) “\r\n” 接收一个数据项的结束标志。

如果有些key出现在get命令行中但是没有返回相应的数据,这意味着服务器中不存在这些项,这些项过时了,或者被删除了

如:get aa

VALUE aa 33 4

ffff

END

5、删除KeyValue:

delete <key> <time>\r\n

a) <key> 需要被删除数据的key

b) <time> 客户端希望服务器将该数据删除的时间(unix时间或者从现在开始的秒数)

c) “\r\n” 命令头的结束

6、检查Memcache服务器状态:

stats\r\n

在这里可以看到memcache的获取次数,当前连接数,写入次数,已经命中率等;

pid : 进程id

uptime :总的运行时间,秒数

time : 当前时间

version : 版本号

……

curr_items : 当前缓存中的KeyValue数量

total_items : 曾经总共经过缓存的KeyValue数量

bytes : 所有的缓存使用的内存量

curr_connections 当前连接数

….

cmd_get : 总获取次数

cmd_set : 总的写入次数

get_hits : 总的命中次数

miss_hits :  获取失败次数

…..

bytes_read : 总共读取的流量字节数

bytes_written : 总的写入流量字节

limit_maxbytes : 最大允许使用的内存量,字节

7、高级缓存细节查看方法:

stats reset

清空统计数据

stats malloc

显示内存分配数据

stats cachedump slab_id limit_num

显示某个slab中的前limit_num个key列表,显示格式如下

ITEM key_name [ value_length b; expire_time|access_time s]

其中,memcached 1.2.2及以前版本显示的是  访问时间(timestamp)

1.2.4以上版本,包括1.2.4显示 过期时间(timestamp)

如果是永不过期的key,expire_time会显示为服务器启动的时间

stats cachedump 7 2

ITEM copy_test1 [250 b; 1207795754 s]

ITEM copy_test [248 b; 1207793649 s]

stats slabs

显示各个slab的信息,包括chunk的大小、数目、使用情况等

stats items

显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)

stats detail [on|off|dump]

设置或者显示详细操作记录

参数为on,打开详细操作记录

参数为off,关闭详细操作记录

参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数)

8、清空所有键值

flush_all

注:flush并不会将items删除,只是将所有的items标记为expired,因此这时memcache依旧占用所有内存。

8、退出

quit\r\n