官方的protocol.txt可以在memcached原作者的git上找到:https://github.com/memcached/memcached/blob/master/doc/protocol.txt

这里我不会翻译全文,只拣比较重要的stats系列命令翻译。其他的使用命令在日常里已经用得够多了,而且也不复杂。只有stats系列命令因为返回的字段、数值比较多,比较复杂,而且都有他们自己的意思,所以特地抽出来翻译下。

1. stats

在stats命令返回的数据里,“32u”类型表示一个32位长的无符号整型,“64u”类型表示一个64位长的无符号整型。“32u.32u”类型表示两个由冒号分隔的32位无符号整型(看做是浮点数)。

[codesyntax lang="c"]

|-----------------------+---------+-------------------------------------------
| 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参数的含义)
|-----------------------+---------+-------------------------------------------

[/codesyntax]

2. stats settings

附带上“settings”参数的“stats”命令将会返回运行中的memcached的具体的settings信息。
注意这里不保证统计项的次序,列表也不一定是详尽的。除此之外,它的返回结果与其它的stats命令是一样的。

[codesyntax lang="c"]

|-------------------+----------+----------------------------------------------
| 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授权请求
|-------------------+----------+----------------------------------------------

[/codesyntax]

3. stats items

这个命令返回的数据都是以slab为单位显示的:

[codesyntax lang="c"]

|------------------------+---------------------------------------
| 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使用一个过期数据的空间来存储数据的次数
|------------------------+---------------------------------------

[/codesyntax]

这个命令将只会显示存在数据的slab的信息,所以一个空的缓存将会返回空集。

4. stats sizes

这个stats命令将会返回存储在缓存内所有对象的尺寸和个数信息。
警告:这个命令将会锁死你的缓存!它会遍历缓存内存储的每个对象,并获取他们的尺寸。虽然这个命令速度很快,但是如果你的缓存里存储了很多对象的话,这个命令还是有可能会使你的缓存在几秒钟内无法进行任何缓存服务。

命令返回的格式为:
STAT <size> <count>\r\n

这个命令会显示出,对于所有存储在你缓存中的对象,是否每32个字节就存在一个slab。你可以通过这个命令来查看,是否调整slab增长因子会节约你的内存开销。
举例来说:如果你大部分的存储对象的尺寸是小于200字节的话,创建更多小尺寸的slab会使得存储对象找到更适合它们尺寸的slab。

5. stats slabs

[codesyntax lang="c"]

|-----------------+----------------------------------------------------------
| 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的内存总量
|-----------------+----------------------------------------------------------

[/codesyntax]

注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是实际被占用掉的内存空间,两者的差值就是没有用掉的(闲置的)内存。

OK,整个protocol中最精华的部分都在这里了,have fun。