游戏卡顿白皮书 › TCP 重传的根本原因
防火墙/连接跟踪丢包 Stateful firewall / conntrack drops
原因 ID rt-stateful-fw · 主责 运维团队·网络运维 · 配合 运维团队·系统运维, 研发团队·服务器开发, 研发团队·客户端开发
在含图示和实验的完整版中打开此卡片 →
防火墙或 Linux 连接跟踪(conntrack,把经过的连接记录到表里的功能)在表满了,或判断连接状态不对时,会丢弃数据包。
起因 连接跟踪表已满(table full),或去程和回程路径不同,只有一个方向经过防火墙(非对称路径) → 结果 防火墙把数据包当成“未知连接”或“序列号超出窗口范围”的包丢弃 → 画面表现 表满时新连接进不来;路径不对称时,只有走这条路径的人在反复重传后掉线
- 症状
- 卡住, 掉线, 连不上/无限加载
- 因素
- 丢包
- 谁会遇到
- 全服, 特定地区/运营商
- 何时出现
- 人多的时候, 刚登录/维护结束后, 偶尔随机
- 负责方
- 主责 运维团队·网络运维 · 配合 运维团队·系统运维, 研发团队·服务器开发, 研发团队·客户端开发
- 研发团队要做的事
- 服务器:为应对表被占满的情况,用登录排队系统调控集中涌入的连接;复用连接,避免反复建立短连接(包括服务器间调用);心跳中断的连接主动清理。客户端:连接失败或断开后,逐步拉长重试间隔并随机打散(避免表满时大家又同时涌回来)。
- 运维团队要做的事
- 网络:调大防火墙的连接跟踪表;把游戏端口排除在连接跟踪之外;调整路由,让去程和回程经过同一台防火墙;检查防火墙的 TCP 窗口检查设置。服务器/OS:调大 Linux 的表(nf_conntrack_max);把游戏端口排除在连接跟踪之外(NOTRACK);检查 TCP 窗口检查设置(nf_conntrack_tcp_be_liberal);AWS 上还要看 conntrack_allowance_exceeded。
- 数值参考
- Linux conntrack 的默认上限(nf_conntrack_max)随内存不同,在几万到几十万条之间。当前条目数(nf_conntrack_count)达到上限时,日志里会出现“nf_conntrack: table full, dropping packet”。
- 监控图上
- 触顶后走平 · conntrack 条目数(nf_conntrack_count),新连接失败数
- 查看位置
- Linux 服务器看 nf_conntrack_count 和 nf_conntrack_max、dmesg 中的“nf_conntrack: table full, dropping packet”、/proc/net/stat/nf_conntrack 的 drop 和 invalid(每个核心一行,十六进制)。防火墙看会话表使用量和丢弃日志,AWS 看 ethtool -S 的 conntrack_allowance_exceeded
- 确认依据
- 条目数顶到上限后走平,同一时刻 table full 日志和 drop 增加,或 conntrack_allowance_exceeded 增加。非对称路径时,上限还有余量,但特定路径上的连接 invalid 和防火墙丢弃日志增加
- 排除依据
- 条目数离上限很远,invalid 和丢弃日志也不变,则是其他原因。表有余量,防火墙的 CPU 或每秒包数却已打满,看“中间设备超出处理上限”
- 确认手段
- 运维工具即可确认(无需游戏代码)
出处
- Netfilter Conntrack Sysfs variables Linux kernel
nf_conntrack_max 默认等于哈希桶数(内存÷16384,1,024~262,144),当前条目数为 nf_conntrack_count;nf_conntrack_tcp_be_liberal 打开时只把窗口外的 RST 标记为 INVALID - net/netfilter/nf_conntrack_core.c Linux kernel
表满时记录“nf_conntrack: table full, dropping packet”日志并丢弃(drop 统计增加);与连接状态不符的数据包使 invalid 统计增加 - iptables-extensions(8) — Linux manual page netfilter
用 raw 表的 CT --notrack 排除在连接跟踪之外 - Amazon EC2 security group connection tracking AWS
超过每个实例的跟踪连接数上限时会丢包,可用 conntrack_allowance_exceeded 查看;建议避免非对称路径 - net/netfilter/nf_conntrack_standalone.c Linux kernel
/proc/net/stat/nf_conntrack 每个核心一行,十六进制,有 entries、invalid、insert_failed、drop、early_drop 等列
相关原因
同一层:TCP 重传的根本原因
其他层中同样导致“卡住”的原因
查看含图示和实验的原卡片