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

游戏卡顿白皮书 › L7 服务器操作系统(内核)

服务器 conntrack 表耗尽 conntrack table full

原因 ID so-conntrack · 主责 运维团队·系统运维 · 配合 研发团队·服务器开发, 研发团队·客户端开发

在含图示和实验的完整版中打开此卡片 →

Linux 防火墙会把所有连接记在连接跟踪(conntrack)表里,这张表达到上限后,新的数据包会被丢弃。

起因 连接激增、反复建立短连接,使连接记录增多 → 结果 表满后丢弃新连接和部分数据包 → 画面表现 连不上,莫名丢包导致瞬移

症状
连不上/无限加载, 瞬移
因素
丢包
谁会遇到
全服
何时出现
刚登录/维护结束后, 人多的时候
负责方
主责 运维团队·系统运维 · 配合 研发团队·服务器开发, 研发团队·客户端开发
研发团队要做的事
服务器:减少短连接(服务器间调用复用连接)。客户端:连接失败或断开后,逐步拉长重试间隔并随机打散。
运维团队要做的事
调大表的大小(nf_conntrack_max);游戏端口不做跟踪(raw 表的 NOTRACK);设置用量告警。
数值参考
默认上限视服务器内存而定,约为 6 万~26 万条。溢出时内核日志会打出“nf_conntrack: table full, dropping packet”。
监控图上
触顶后走平 · conntrack 条目数(nf_conntrack_count)
查看位置
把 sysctl 的 net.netfilter.nf_conntrack_count(当前条目数)和 nf_conntrack_max 画在同一张图上,在 dmesg 中找“nf_conntrack: table full, dropping packet”
确认依据
nf_conntrack_count 在 max 处走平,从那一刻起内核日志出现 table full
排除依据
条目数离 max 还很远则不是这个原因。AWS 实例本身的连接跟踪上限,看“超出云 PPS 上限”中的 conntrack_allowance_exceeded
确认手段
运维工具即可确认(无需游戏代码)

出处

  1. Netfilter Conntrack Sysfs variables Linux kernel
    nf_conntrack_max 默认值等于哈希桶数(nf_conntrack_buckets),桶数由内存大小决定
  2. net/netfilter/nf_conntrack_core.c (Linux v6.12) Linux kernel
    默认大小:内存超过 1 GB 为 65,536,超过 4 GB(64 位)为 262,144;表满时记录“nf_conntrack: table full, dropping packet”并丢弃
  3. iptables-extensions(8) — Linux manual page netfilter
    用 raw 表的 CT --notrack 排除连接跟踪

相关原因

同一层:L7 服务器操作系统(内核)

其他层中同样导致“连不上/无限加载”的原因

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