skynet监控实践

常见的监控工具

  • 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

  1. 通过 skynet.send("debug_console地址", ...)或起个内部 socket 连 127.0.0.1:debug_port,发 stat\n、mem\n、jmem\n收回来解析

  2. 解析成 Prometheus 格式(skynet_mq_length{service=":00000007"} 0),开个 HTTP /metrics端点

  3. 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"
相关推荐
SkyWalking中文站1 天前
认识 Horizon UI · 11/17:运行时规则与实时调试
运维·监控·自动化运维
SkyWalking中文站3 天前
认识 Horizon UI · 6/17:Trace 探索器
运维·监控·自动化运维
SkyWalking中文站4 天前
认识 Horizon UI · 5/17:3D 基础设施地图
运维·监控·自动化运维
SkyWalking中文站5 天前
认识 Horizon UI · 1/17:SkyWalking 新一代可观测性控制台
运维·前端·监控
亲亲小宝宝鸭10 天前
前端性能监控:web-vitals
前端·性能优化·监控
kyriewen17 天前
前端错误监控最全指南:捕获 JS 异常、Promise 拒绝、资源加载失败,附上报代码
前端·javascript·监控
杨浦老苏18 天前
轻量级Docker仪表板Servedash
运维·docker·监控·群晖·仪表板
两行法桐20 天前
Docker安装ELK+Kafka
监控