한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

游戏卡顿白皮书 › 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 或每秒包数却已打满,看“中间设备超出处理上限”
确认手段
运维工具即可确认(无需游戏代码)

出处

  1. Netfilter Conntrack Sysfs variables Linux kernel
    nf_conntrack_max 默认等于哈希桶数(内存÷16384,1,024~262,144),当前条目数为 nf_conntrack_count;nf_conntrack_tcp_be_liberal 打开时只把窗口外的 RST 标记为 INVALID
  2. net/netfilter/nf_conntrack_core.c Linux kernel
    表满时记录“nf_conntrack: table full, dropping packet”日志并丢弃(drop 统计增加);与连接状态不符的数据包使 invalid 统计增加
  3. iptables-extensions(8) — Linux manual page netfilter
    用 raw 表的 CT --notrack 排除在连接跟踪之外
  4. Amazon EC2 security group connection tracking AWS
    超过每个实例的跟踪连接数上限时会丢包,可用 conntrack_allowance_exceeded 查看;建议避免非对称路径
  5. net/netfilter/nf_conntrack_standalone.c Linux kernel
    /proc/net/stat/nf_conntrack 每个核心一行,十六进制,有 entries、invalid、insert_failed、drop、early_drop 等列

相关原因

同一层:TCP 重传的根本原因

其他层中同样导致“卡住”的原因

查看含图示和实验的原卡片