探讨:如何通过stats命令分析Memcached的内部状态

来源:http://www.sh-fengwen.com 作者:鲜果干果 人气:97 发布时间:2019-09-06
摘要:memcached-version-1.4.25 Memcached 有个 stats 命令,通过它可以查看Memcached服务的许多状态信息。 使用方法如下: 先在命令行直接输入telnet主机名端口号,连接到memcached服务器,然后再连接成

图片 1memcached-version-1.4.25

Memcached有个stats命令,通过它可以查看Memcached服务的许多状态信息。使用方法如下: 先在命令行直接输入telnet 主机名端口号,连接到memcached服务器,然后再连接成功后,输入stats 命令,即可显示当前memcached服务的状态信息。
比如在我本机测试如下:
stats
STAT pid 1552
STAT uptime 3792
STAT time 1262517674
STAT version 1.2.6
STAT pointer_size 32
STAT curr_items 1
STAT total_items 2
STAT bytes 593
STAT curr_connections 2
STAT total_connections 28
STAT connection_structures 9
STAT cmd_get 3
STAT cmd_set 2
STAT get_hits 2
STAT get_misses 1
STAT evictions 0
STAT bytes_read 1284
STAT bytes_written 5362
STAT limit_maxbytes 67108864
STAT threads 1
END
这里显示了很多状态信息,下边详细解释每个状态项:
1.  pid: memcached服务进程的进程ID
2.  uptime: memcached服务从启动到当前所经过的时间,单位是秒。
3.  time: memcached服务器所在主机当前系统的时间,单位是秒。
4.  version: memcached组件的版本。这里是我当前使用的1.2.6。
5.  pointer_size:服务器所在主机操作系统的指针大小,一般为32或64.
6.  curr_items:表示当前缓存中存放的所有缓存对象的数量。不包括目前已经从缓存中删除的对象。
7.  total_items:表示从memcached服务启动到当前时间,系统存储过的所有对象的数量,包括目前已经从缓存中删除的对象。
8.  bytes:表示系统存储缓存对象所使用的存储空间,单位为字节。
9.  curr_connections:表示当前系统打开的连接数。
10. total_connections:表示从memcached服务启动到当前时间,系统打开过的连接的总数。
11. connection_structures:表示从memcached服务启动到当前时间,被服务器分配的连接结构的数量,这个解释是协议文档给的,具体什么意思,我目前还没搞明白。
12. cmd_get:累积获取数据的数量,这里是3,因为我测试过3次,第一次因为没有序列化对象,所以获取数据失败,是null,后边有2次是我用不同对象测试了2次。
13. cmd_set:累积保存数据的树立数量,这里是2.虽然我存储了3次,但是第一次因为没有序列化,所以没有保存到缓存,也就没有记录。

介绍

在看一个 Set 命令内部流程时,最好已经对 Memcache 有一定了解,可以简单参考下之前写的那几篇源码解析。

  • Memcache-内存模型-源码分析
  • Memcache-网络线程模型-源码分析
  • Memcache-哈希表-源码分析
  1. get_hits:表示获取数据成功的次数。
  2. get_misses:表示获取数据失败的次数。
    16. evictions:为了给新的数据项目释放空间,从缓存移除的缓存对象的数目。比如超过缓存大小时根据LRU算法移除的对象,以及过期的对象。
  3. bytes_read:memcached服务器从网络读取的总的字节数。
  4. bytes_written:memcached服务器发送到网络的总的字节数。
    19. limit_maxbytes:memcached服务缓存允许使用的最大字节数。这里为67108864字节,也就是是64M.与我们启动memcached服务设置的大小一致。
    20. threads:被请求的工作线程的总数量。这个解释是协议文档给的,具体什么意思,我目前还没搞明白。
    总结:stats命令总体来说很有用,通过这个命令我们很清楚当前memcached服务的各方面的信息。

介绍

由于 Memcache 采用 libevent 事件库来监听网络连接,只要有一个网络连接有动作,都会马上回调 event_handler() 函数,这里我们就从这个 event_handler() 函数开始,追踪一个 Set 命令内部经历了哪些流程。

您可能感兴趣的文章:

  • Memcached常用命令及使用说明
  • Memcached常用命令以及使用说明详解
  • memcached常用命令_动力节点Java学院整理

状态机

所谓状态机就是针对我们每个连接的不同状态做不同的处理,内部为 event_handler() 之后调用 drive_machine 函数处理,因为每一个连接都对应一个 conn* 结构体指针,所以在该结构体内有一个 state 字段来记录当前的连接状态,状态机函数drive_machine 就根据 conn->state 当前的状态来做对应的处理。

连接状态说明

//一组枚举enum conn_states { /** 主线程 libevent 监听事件的回调状态,该连接状态只会赋给主 线程 libevent 监听的文件描述符  也就说 conn->state=conn_listening 始终等于这个状态,由于主线程回调只会触发这一个状态,所以只要触发就代表有新的客户 端来连接, 就需要分发该连接到 work 线程并创建, 因为主线程不负责处理连接 , 只负 责分发连接 , 有点类似于负载均衡 */ conn_listening, /** 连接分发创建状态 */ /** work线程 libevent 监听事件的回调状态 , 下面的这些状态全部都由 work 线程事件回调处理 */ conn_new_cmd, /** 连接开始状态 */ conn_waiting, /** 等待连接有活动 */ conn_read, /** 读取网路缓冲区数据到应用层buf缓冲区 */ conn_parse_cmd, /** 解析命令 */ conn_write, /** 添加一条response message*/ conn_nread, /** 从应用层缓存区读取数据 */ conn_swallow, /** swallowing unnecessary bytes w/o storing */ conn_closing, /** 关闭一个连接 */ conn_mwrite, /** 回写客户端数据 */ conn_closed, /** 异常进程关闭 */ conn_max_state /** Max state value (used for assertion) */};

网络连接-处理数据-状态转换

图片 2Memcache-网络连接-状态转换

源码实现

网络连接事件回调函数,event_handler

void event_handler(const int fd, const short which, void *arg) { conn *c; // 获取当前连接的 conn* c = arg; assert(c != NULL); // 保存一下当前触发 event 事件类型 c->which = which; /* sanity */ if (fd != c->sfd) { if (settings.verbose > 0) fprintf(stderr, "Catastrophic: event fd doesn't match conn fd!n"); conn_close; return; } // 调用状态机函数处理当前连接 drive_machine; /* wait for next event */ return;}

状态机函数,drive_machine

static void drive_machine { bool stop = false; int sfd; socklen_t addrlen; struct sockaddr_storage addr; int nreqs = settings.reqs_per_event; int res; const char *str; assert(c != NULL); while  { switch(c->state) { case 'conn_listening' : //.... stop = true; break; case 'conn_waiting': conn_set_state(c, conn_read); stop = true; break; case 'conn_read': //..... conn_set_state(c, conn_parse_cmd); break; //..... case '.....': //.... } }}

可以看到里面就是一些 switch case 状态判断, 外加一个 while 死循环 , 这个死循环何时结束取决于 stop = true , 因为有些情况一个连接状态处理完并赋值下一次的处理状态后, 就需要马上结束, 等待下次事件回调 , 那么就会 stop = true , 而有些情况一个连接状态处理完成后要求马上赋值新的连接状态并继续处理所以直接 break 。

本文由美高梅游戏平台网站发布于鲜果干果,转载请注明出处:探讨:如何通过stats命令分析Memcached的内部状态

关键词:

上一篇:浏览器访问一个网站所经历的步骤

下一篇:没有了

最火资讯