memcached 命令汇总
作者:hooray520
原文地址:http://hooray520.iteye.com/blog/1407301
官方的 protocol.txt 可以在 memcached 原作者的 git 上找到:https://github.com/memcached/memcached/blob/master/doc/protocol.txt
stats 系列命令因为返回的字段、数值比较多,比较复杂,而且都有他们自己的意思,所以特地抽出来。
1. stats
在 stats 命令返回的数据里,“32u”类型表示一个 32 位长的无符号整型,“64u”类型表示一个 64 位长的无符号整型。“32u.32u”类型表示两个由冒号分隔的32位无符号整型(看做是浮点数)。
|-----------------------+---------+-------------------------------------------
| Name | Type | Meaning
|-----------------------+---------+-------------------------------------------
| pid | 32u | memcached 服务器的进程 id 号
| uptime | 32u | memcached 自启动至今的时长(按秒计算)
| time | 32u | 服务器当前的 UNIX 时间戳
| version | string | memcached 的版本号字符串
| pointer_size | 32 | 默认的服务器操作系统指针尺寸(一般为 32 或 64)
| rusage_user | 32u.32u | memcached 进程用户态的累计时长(秒:毫秒)
| rusage_system | 32u.32u | memcached 进程内核态的累计时长(秒:毫秒)
| curr_items | 32u | memcached 当前存储的对象数量
| total_items | 32u | memcached 自启动至今存储过的对象数量
| bytes | 64u | memcached 当前用来存储数据所消耗的内存量(字节)
| curr_connections | 32u | memcached 当前打开的连接
| total_connections | 32u | memcached 自启动至今打开过的连接数
| connection_structures | 32u | memcached 分配的连接结构的数量
| cmd_get | 64u | get 命令的总次数
| cmd_set | 64u | set 命令的总次数
| get_hits | 64u | get 命令命中的总次数
| get_misses | 64u | get 命令未命中的总次数
| delete_misses | 64u | delete 命令未命中的总次数
| delete_hits | 64u | delete 命令命中的总次数
| incr_misses | 64u | incr 命令未命中的总次数
| incr_hits | 64u | incr 命令命中的总次数
decr_misses | 64u | decr 命令未命中的总次数
| decr_hits | 64u | decr 命令命中的总次数
| cas_misses | 64u | cas 命令未命中的总次数
| cas_hits | 64u | cas 命令命中的总次数
| cas_badval | 64u | cas 命令命中却更新失败的总次数
| auth_cmds | 64u | memcached 接受到所有的授权命令,无论成功失败
| auth_errors | 64u | memcached 接受到的所有失败的授权命令
| evictions | 64u | 因 LRU 机制而被主动覆盖(删除)的对象数目
| reclaimed | 64u | memcached 启动至今有多少次在存储数据的时候使用了过期数据的空间
| bytes_read | 64u | memcached 从网络中读取的总数据字节数
| bytes_written | 64u | memcached 向网络中写入的总数据字节数
| limit_maxbytes | 32u | memcached 所有可以用来存储的内存的字节数(启动时候定义好的)
| threads | 32u | worker 线程数量(具体请查看 doc/threads.txt)
| conn_yields | 64u | memcached 启动至今有多少次打开的连接因为内部请求数达到 -R 参数指定的限值,
| | | 一个连接的操作主动放弃让给另一个连接(不是很明白什么意思,具体可以参考 -R 参数的含义)
|-----------------------+---------+-------------------------------------------
2. stats settings
附带上“settings”参数的“stats”命令将会返回运行中的 memcached 的具体的 settings 信息。
注意这里不保证统计项的次序,列表也不一定是详尽的。除此之外,它的返回结果与其它的 stats 命令是一样的。
|-------------------+----------+----------------------------------------------
| Name | Type | Meaning
|-------------------+----------+----------------------------------------------
| maxbytes | size_t | memcached 可分配的最大缓存内存字节数
| maxconns | 32 | memcached 允许的连接数最大数值
| tcpport | 32 | TCP 监听端口
| udpport | 32 | UDP 监听端口
| inter | string | 监听的 host 地址
| verbosity | 32 | memcached 运行信息输出级别:0 = none, 1 = some, 2 = lots
| oldest | 32u | memcached 当前存储的对象中最长的存活时长
| evictions | on/off | 当设成 off 的时候,LRU 机制将不会启用
| domain_socket | string | Unix socket 的文件路径(如果存在的话)
| umask | 32 (oct) | 创建 Unix socket 的 umask
| growth_factor | float | Chunk 尺寸增长因子数值
| chunk_size | 32 | 最小的 chunk 尺寸(key+value+flags)
| num_threads | 32 | 线程数量(包括 dispatch 的)
| stat_key_prefix | char | Stats 命令分隔符
| detail_enabled | bool | 如果 yes 的话,stats 的详细信息将被开启
| reqs_per_event | 32 | 一个事件(event)中允许的最大 IO 操作数
| cas_enabled | bool | 如果 no 的话,CAS 不会被启用
| tcp_backlog | 32 | TCP 监听队列(backlog)等待长度的最大值
| auth_enabled_sasl | yes/no | 是否启用 SASL 授权请求
|-------------------+----------+----------------------------------------------
3. stats items
这个命令返回的数据都是以 slab 为单位显示的:
|------------------------+---------------------------------------
| Name | Meaning
|------------------------+---------------------------------------
| number | 当前 slab 中存储的对象数量,过期的对象不会主动被排除出去
| age | LRU 中存活时间最长的对象的存活时长
| evicted | 根据 LRU 原则不得不在过期之前就被删除的对象的个数
| evicted_nonzero | 根据 LRU 原则不得不在过期之间就被删除,且有被设过过期时间的对象个数
| evicted_time | 在该 slab 中,最近一次对象因为 LRU 机制而被删除的时间点到现在的秒数,
| | 用这个来做 LRU 的频率监控
| outofmemory | 该 slab 无法为新对象分配内存空间的次数,出现这个数值意味着
| | memcached 在运行的时候带上了-M参数或者存在 LRU 删除失败
| tailrepairs | 这个数值表示了我们自己解决的 slab 引用泄露的次数,
| | 如果这个数值增长很多,请联系开发人员
| reclaimed | memcached 使用一个过期数据的空间来存储数据的次数
|------------------------+---------------------------------------
这个命令将只会显示存在数据的 slab 的信息,所以一个空的缓存将会返回空集。
4. stats sizes
这个 stats 命令将会返回存储在缓存内所有对象的尺寸和个数信息。
警告:这个命令将会锁死你的缓存!它会遍历缓存内存储的每个对象,并获取他们的尺寸。虽然这个命令速度很快,但是如果你的缓存里存储了很多对象的话,这个命令还是有可能会使你的缓存在几秒钟内无法进行任何缓存服务。
命令返回的格式为:
STAT <size> <count>\r\n
这个命令会显示出,对于所有存储在你缓存中的对象,是否每 32 个字节就存在一个 slab。你可以通过这个命令来查看,是否调整 slab 增长因子会节约你的内存开销。
举例来说:如果你大部分的存储对象的尺寸是小于 200 字节的话,创建更多小尺寸的 slab 会使得存储对象找到更适合它们尺寸的 slab。
5. stats slabs
|-----------------+----------------------------------------------------------
| Name | Meaning
|-----------------+----------------------------------------------------------
| chunk_size | 每个 chunk 占用的内存空间,一个存储对象将会寻找适合它尺寸的 chunk 来存储
| chunks_per_page | 当前数字说明了每个 page 可以划分成多少个 chunk,一个 page 默认大小小于等于1M,
| | Slabs 申请的内存是按 page 分配的,接着按大小划分为 chunk
| total_pages | 当前 slab 所分配到的 page 总数
| total_chunks | 当前 slab 所分配到的 chunk 总数
| 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 请求数
| used_chunks | 已经被分配给存储对象的 chunk 数
| free_chunks | 还未被分配给存储对象,或通过 delete 操作释放出来的 chunk(注 1)
| free_chunks_end | 最近分配的 Page 尾部空闲 chunk 数
| mem_requested | 当前 slab 中被请求用来存储数据的内存空间字节总数(注 2)
| active_slabs | memcached 分配的 slab 的总数
| total_malloced | memcached 分配给所有 slab 的 pages 的内存总量
|-----------------+----------------------------------------------------------
注 1:个人觉得这里的原文是有问题的。原文是:“Chunks not yet allocated to items, or freed via delete.”,而我在实际使用中的感觉是这个 free_chunks 是指存储对象因为过期或者因为被 delete 掉而导致的 chunk 闲置(可再利用)。简单来说,这个字段的意思就是已经被分配过,但是目前可以再次被利用(过期、删除)的 chunk 的数量有多少。所以数据对象在被存储的时候是优先被分配到 free_chunks 里的,而不是优先分配到 free_chunks_end 里的。
注 2:存储对象是被存储在尺寸等于或者大于对象尺寸的 slab 里的。mem_requested 显示了当前 slab 里所有存储对象总占用的内存空间。
(total_chunks * chunk_size) – mem_requested 的结果显示了有多少内存在这个 slab 里是被闲置的。如果你看到闲置的内存量很大, 考虑使用 slab 增长因子来调节 slab 大小。
原文这里是 total_chunks,个人觉得有点不对,应该是 used_chunks + free_chunks。(used_chunks + free_chunks) * chunk_size 就是用掉的 chunks 被分配到的内存空间,mem_requested 是实际被占用掉的内存空间,两者的差值就是没有用掉的(闲置的)内存