2.7 监控服务状态
Skynet自带了一个调试控制台服务debug_console,启动它之后,可以查看节点的内部状态。
2.7.1 启用调试控制台
下面以代码2-11所示的ping程序为例加以说明。
代码2-11 examples/Pmain.lua
local skynet = require "skynet"
skynet.start(function()
local ping1 = skynet.newservice("ping")
local ping2 = skynet.newservice("ping")
local ping3 = skynet.newservice("ping")
skynet.send(ping1, "lua", "start", ping3)
skynet.send(ping2, "lua", "start", ping3)
skynet.exit()
end)在图2-25所示的节点结构中,代码2-11先开启debug_console服务,让它监听8000端口,然后开启3个ping服务(见2.3节)。主服务会让ping1和ping2向ping3发消息,ping3会给出回应。
图2-25 代码2-11的节点结构图
下面我们会用telnet连接debug_console,再来一探究竟。
2.7.2 监控指令
用本地的telnet连接debug_console服务,可以看到“Welcome to skynet console”的字样,如图2-26所示。
图2-26 用本地的telnet连接debug_console服务
1.list指令
list指令用于列出所有的服务,以及启动服务的参数。在控制台输入“list”后,控制台会显示图2-27所示的信息。可见,除了由主服务开启的“debug_console”和3个“ping”服务以外,skynet还自动开启了cmaster、cslave、datacenterd等服务用于提供引擎功能。在编写程序的过程中,如果怀疑某些服务没成功启动,可用list命令检查。
图2-27 list指令
2.mem指令
mem指令用于显示所有Lua服务占用的内存。执行结果如图2-28所示,3个ping服务大致会占用60Kb的内存。如果某个服务占用的内存很高,可以做针对性优化。
图2-28 mem指令
3.stat指令
stat指令用于列出所有Lua服务的CPU时间、处理的消息总数(message)、消息队列长度(mqlen)、被挂起的请求数量(task)等。如图2-29所示,每个服务都含有消息队列,向服务发消息,就是将消息插入消息队列的过程,如果某个服务处理消息的速度太慢,它的消息队列就会很长。stat指令可以查看各个服务消息队列的长度,得知哪些服务负载高。
图2-29 ping1和ping2向ping3发送消息
图2-30展示了stat指令的执行结果。其中ping3(0100000d)的message(处理的消息总数)是另外两个ping服务(0100000b和0100000c)的两倍,这与ping1和ping2共同针对ping3形成的负载相符。
图2-30 stat指令
4.netstat指令
netstat指令用于列出网络连接的概况。执行结果如图2-31所示,其中0100000a代表debug_console服务(可由list命令得知),它监听8000端口(第3行)。
图2-31 netstat指令
更多控制台功能见https://github.com/cloudwu/skynet/wiki/DebugConsole。