游戏卡顿白皮书 › L9 服务器游戏进程
版本更新导致流量特征变化 Patch changes traffic pattern
原因 ID sp-patch-traffic · 主责 研发团队·服务器开发 · 配合 运维团队·系统运维, 运维团队·网络运维
在含图示和实验的完整版中打开此卡片 →
新内容、特效、同步项增加了数据包的大小和频率,原本正常的服务器在版本更新后开始碰到 MTU、带宽、包数的上限。
起因 版本更新增加了新技能特效、同步项、物品信息,数据包变大或变频繁 → 结果 大包超过 MTU 被分片,增加的流量碰到带宽、云 PPS 上限、发送缓冲区的限制 → 画面表现 版本更新后,人多的地方开始出现瞬移、吞技能、操作延迟。基础设施什么都没改,丢包却增加了
- 症状
- 瞬移, 吞操作/回档, 操作延迟
- 因素
- 丢包, 延迟
- 谁会遇到
- 全服, 特定地点/分线, 特定地区/运营商
- 何时出现
- 人多的时候, 晚高峰, 一直
- 负责方
- 主责 研发团队·服务器开发 · 配合 运维团队·系统运维, 运维团队·网络运维
- 研发团队要做的事
- 自己把包拆到 1,200 字节以下;新同步项只发变化部分,并按距离、重要程度降低频率;发布前在测试服上把每个玩家每秒的包数、字节数和最大包大小与上一个版本对比;在流量指标中记录构建版本号。
- 运维团队要做的事
- 服务器/OS:在监控图上标出发布时间,对比发布前后每个玩家每秒的包数、字节数和平均包大小;为实例超限计数器设告警;必要时换更大的实例。网络:检查防火墙、负载均衡器、DDoS 防护设备的处理上限以及是否拦截分片。
- 数值参考
- UDP 包在 1,200 字节以下比较安全;互联网路径 MTU 通常为 1,500 字节,经过隧道会更小(GRE 隧道为 1,476 字节)。超过路径 MTU 的包会被分片或丢弃,分片包只要丢一个分片就整个丢失。每个玩家每秒的包数增加 20%,全服也会增加 20%,原本就接近上限的实例会马上超限。
- 监控图上
- 某一时刻起台阶式上升 · 每个玩家每秒的包数/字节数、平均包大小
- 查看位置
- 对比发布前后服务器网卡每秒的包数、字节数(sar -n DEV 的 rxpck/s、txpck/s、rxkB/s、txkB/s,EC2 为 NetworkPacketsOut、NetworkOut)除以同时在线人数后的值。平均包大小 = 字节数 ÷ 包数,大小分布用 Wireshark 的 Packet Lengths 统计分析抓包
- 确认依据
- 发布后每个玩家的包数、字节数或平均包大小台阶式上升并保持,同一时刻起服务器生成的分片数(sar -n IP 的 fragcrt/s)或实例超限计数器(AWS ENA 的 pps_allowance_exceeded、bw_out_allowance_exceeded)增加
- 排除依据
- 发布前后流量特征相同,只有延迟和丢包增加,看同一时刻的基础设施变更(配置、路由、设备、OS/内核更新)
- 确认手段
- 运维工具即可确认(无需游戏代码)
- 深入了解
- 收到“更新前好好的”这类反馈时,除了基础设施变更,首先要确认的游戏侧原因就是这一条。即使更新公告里没有网络相关改动,一个新特效或同步项在人多的地方也会按几百人成倍放大。增加的流量实际会碰到哪些上限,请看“UDP 数据包的 IP 分片”“超出云 PPS 上限”“网卡带宽饱和”“内核 socket 缓冲区不足”“中间设备超出处理上限(防火墙/IPS/DDoS 防护)”等条目。本条针对的是把流量推到这些上限的起点在于游戏版本更新的情况,所以在提高上限之前,先削减版本更新带来的流量。如果同一时间还更新了 OS 和内核,就看每个玩家的流量有没有变化,以此与“OS/内核/驱动/固件更新后的性能变化”区分。
出处
- RFC 8085: UDP Usage Guidelines IETF
UDP 应用不应发送超过路径 MTU 的数据报(SHOULD NOT);丢一个分片就会丢失整个分片包;部分 NAT、防火墙会丢弃所有分片 - RFC 8899: Packetization Layer Path MTU Discovery for Datagram Transports IETF
建议以 1,200 字节作为 UDP 等数据报传输的基础安全大小(BASE_PLPMTU) - Maximum transmission unit and maximum segment size Cloudflare
互联网路径 MTU 1,500,经过 GRE 隧道为 1,476 - Monitor network performance for ENA settings on your EC2 instance AWS
pps_allowance_exceeded、bw_out_allowance_exceeded:因超出实例的 PPS、发送带宽上限而排队或被丢弃的包数 - sar(1) — Linux manual page sysstat
sar -n DEV 的 rxpck/s、txpck/s(每秒包数)、rxkB/s、txkB/s(每秒 KB),sar -n IP 的 fragcrt/s(每秒生成的 IP 分片数,ipFragCreates) - CloudWatch metrics that are available for your instances AWS
NetworkPacketsOut(实例通过所有网络接口发送的包数)、NetworkOut(发送的字节数) - 8.7. Packet Lengths Wireshark
把抓到的包按长度区间分组,显示数量、平均值、最小值、最大值
相关原因
同一层:L9 服务器游戏进程
其他层中同样导致“瞬移”的原因
查看含图示和实验的原卡片