常见的监控工具
-
Prometheus
-
Grafana:一个可视化工具,接入时监控以下5个维度
-
节点级:总服务数、总 mqlen 加和、jemalloc resident 内存、worker 线程数
-
服务级:单服务 mqlen 曲线、cpu 耗时热力图、message 吞吐(QPS 感)、task 挂起协程数
-
Agent 级(游戏特有):单 agent 内存分布、agent 在线数、agent 消息延迟 p99
-
连接级:Gate 的 netstat 读写字节、accept 速率、ESTAB 数
-
业务自定义:登录 QPS、匹配成功率、战斗帧同步延迟------这些是你自己在业务服务里 skynet.fork推给 monitor 的
-
skynet的监控方案
skynet只提供原生的monitor服务采集接口,所以需要自己实现数据采集的逻辑。
监控指标
-
mqlen:服务消息队列积压。你 dispatch 里写个死循环,mqlen 就会一直涨,Skynet 自己也会打 May overload, message queue length=xxx的日志。
-
time:当前这条消息已经处理了多久。正常是 0,如果看到某个服务 time 几千上万 ms,就是某条消息卡住了。
-
endless:监控线程发现服务 >5s 没处理消息就置 1,可能是死循环也可能是你某段计算真的超 5s。
-
task:Lua 层挂起的协程数。如果 A 疯狂 skynet.callB 而 B 处理慢,A 的 task 会暴涨------这是协程泄露的信号。
方案:Monitor Agent 定时捞 debug_console
-
通过 skynet.send("debug_console地址", ...)或起个内部 socket 连 127.0.0.1:debug_port,发 stat\n、mem\n、jmem\n收回来解析
-
解析成 Prometheus 格式(skynet_mq_length{service=":00000007"} 0),开个 HTTP /metrics端点
-
Prometheus 15s 一刮,Grafana 画图,AlertManager 告警
Skynet 节点
├─ .agent_1 (:01000001)
├─ .agent_2 (:01000002)
├─ .debug_console (127.0.0.1:8000, telnet 口)
└─ .monitor_exporter (开 :9091/metrics) ← Prometheus 来刮
↑ 定时 telnet 自己 debug_console 抓 stat/mem/jmem
告警规则
Prometheus 的 alert.rules 里,Skynet 特有的几条硬指标
yaml
groups:
- name: skynet-alerts
rules:
# 1. 消息积压 ------ 接你上一轮的 dispatch 阻塞场景
- alert: MQOverload
expr: skynet_mq_length > 1000
for: 5m
annotations:
summary: "服务 {{$labels.service}} mqlen={{$value}},疑似阻塞"
# 2. 死循环 / 长消息
- alert: ServiceEndless
expr: skynet_stat_endless == 1
for: 10s
annotations:
summary: "服务 {{$labels.service}} endless=1,可能死循环"
# 3. 单消息耗时异常(time 字段)
- alert: SlowMessage
expr: skynet_stat_time_ms > 5000
for: 30s
# 4. 协程泄露:task 持续增长不回落
- alert: CoroutineLeak
expr: increase(skynet_task{service=~"agent.*"}[10m]) > 0
and skynet_task{service=~"agent.*"} > 500
# 5. Agent 内存斜率(防泄漏)
- alert: AgentMemSpike
expr: delta(skynet_mem_bytes{service=~"agent.*"}[30m]) > 50e6
annotations:
summary: "Agent {{$labels.service}} 30min 涨 50MB"