CPU/内存/网络监控
概述
监控是性能与稳定的"眼睛":问题发生时能快速定位,平时能提前预警。游戏服务器监控分三层:在线诊断(Arthas)、深度分析(JFR)、持续监控(Prometheus + Grafana)。本文覆盖这三层,并专门讲 Netty 连接泄漏排查。
一、Arthas 在线诊断
1.1 常用命令
Arthas 核心命令:
dashboard # 实时线程/CPU/内存总览
thread -n 3 # 最忙的 3 个线程(CPU 热点)
trace 方法名 # 方法调用耗时跟踪
watch 类 方法 # 参数/返回值观察
jvm # JVM 信息
heapdump # 堆转储
场景:
CPU 高 → thread 找热点线程 → stack 看堆栈
慢请求 → trace 定位耗时方法
参数异常 → watch 观察输入输出// 定位 CPU 高占用线程
$ thread -n 3
"nioEventLoopGroup-2-1" Id=23 RUNNABLE
at com.game.logic.RoomTick.tick(RoomTick.java:45)
...1.2 在线诊断实践
诊断流程:
1. 现象确认(CPU/延迟/报错)
2. thread 看线程状态(RUNNABLE/BLOCKED/WAITING)
3. trace 关键链路(定位慢方法)
4. 针对性修复(无需重启,改后热更新/发布)
注意:
trace/watch 有性能开销(生产谨慎)
用后关闭(stop 命令)
线上诊断尽量短时间二、JFR/JMC 飞行记录
2.1 JFR 能力
JFR(Java Flight Recorder):
低开销记录(1-2% 性能影响)
采集:CPU/内存分配/GC/锁/IO/方法采样
JMC(Java Mission Control)分析
使用:
持续记录(后台开启,保留最近 N 小时)
问题发生后分析(回放现场)
// 开启 JFR(命令行)
java -XX:StartFlightRecording=filename=rec.jfr,duration=60s2.2 分析重点
JFR 分析方向:
CPU:热点方法(分配/GC/锁)
内存:分配热点、对象泄漏增长
GC:停顿分布、晋升速率
锁:锁竞争/等待(Monitor)
IO:网络/文件阻塞
典型结论:
大量对象分配 → 优化代码(复用/减少)
锁竞争严重 → 分区/无锁(见并发章节)
GC 频繁 → 堆/对象策略(见 JVM 调优)三、Prometheus + Grafana 监控
3.1 指标采集
监控体系:
Prometheus:指标采集 + 存储 + 告警规则
Grafana:可视化面板
导出器:JVM 指标(micrometer/prometheus-client)
核心指标:
业务:QPS、RT(p50/p95/p99)、在线数、房间数
JVM:CPU、堆内存、GC 次数/耗时、线程数
网络:连接数、吞吐、错误率
中间件:Redis/MySQL 连接、延迟、命中率// Spring Boot 暴露指标(Micrometer)
management.metrics.export.prometheus.enabled: true
// 指标端点 /actuator/prometheus3.2 告警规则
告警设计:
阈值告警:CPU > 85%、连接数 > 上限 90%
趋势告警:错误率上升、RT 增长
事件告警:节点下线、积压超限
告警分级:
严重(立即处理):节点宕机、Full GC 频繁
警告(观察):RT 上升、连接数增长
提示(关注):容量接近上限
通道:
钉钉/企微/邮件(见运维章节)
避免告警风暴(聚合/静默)// Prometheus 告警规则示例
groups:
- name: game
rules:
- alert: HighCpu
expr: process_cpu_usage > 0.85
for: 5m
labels: { severity: warning }四、Netty 连接泄漏排查
4.1 泄漏表现
连接泄漏症状:
连接数持续增长(不下降)
内存持续增长(ByteBuf 泄漏)
端口耗尽(连接耗尽)
来源:
客户端断开未清理(关闭通知丢失)
连接创建未计数/未回收
ByteBuf 未 release(内存泄漏)排查手段:
监控连接数曲线(正常波动 vs 持续增长)
Active/Idle 连接统计
关闭事件日志(谁关闭/谁接收)
Netty 泄漏检测(见 Netty 调优章节)4.2 泄漏防护
防护设计:
统一连接生命周期管理(Session,见会话章节)
心跳超时强制关闭(IdleStateHandler)
下线流程完整(清 Session/释放 ByteBuf)
连接数上限(保护性拒绝)
// 连接数保护
if (connCount.incrementAndGet() > MAX_CONN) {
channel.close(); // 拒绝超额连接
}排查流程:
1. 连接数监控(是否持续上升)
2. 心跳/超时是否生效
3. 下线清理逻辑审查
4. ByteBuf 泄漏检测(内存维度)
5. 复现修复五、实现要点
监控清单:
Arthas:在线诊断(CPU/慢方法/参数)
JFR:深度分析(分配/GC/锁)
Prometheus + Grafana:持续监控 + 告警
连接/ByteBuf:泄漏防护 + 排查
指标:业务 + JVM + 网络 + 中间件
监控落地:
统一指标采集(Micrometer)
分级告警(严重/警告/提示)
定期巡检(容量/泄漏/异常)
常见坑:
告警风暴(规则不合理)
指标缺失(问题无法回溯)
泄漏滞后发现(提前预警)
诊断工具生产副作用(谨慎使用)与其他系统衔接:
GC 分析 → JVM 调优章节
连接管理 → 会话管理章节
压测 → 压测章节
日志/链路 → 运维章节