百万在线:大型游戏服务端开发
上QQ阅读APP看书,第一时间看更新

2.7 监控服务状态

Skynet自带了一个调试控制台服务debug_console,启动它之后,可以查看节点的内部状态。

2.7.1 启用调试控制台

下面以代码2-11所示的ping程序为例加以说明。

代码2-11 examples/Pmain.lua


local skynet = require "skynet"

skynet.start(function()
    skynet.newservice("debug_console",8000)
        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