遊戲 Lag 白皮書 › TCP 重傳的根本原因
防火牆與連線追蹤丟棄封包 Stateful firewall / conntrack drops
原因 ID rt-stateful-fw · 主要負責 基礎設施團隊(網路基礎設施) · 協同 基礎設施團隊(伺服器基礎設施), 遊戲開發團隊(伺服器開發), 遊戲開發團隊(用戶端開發)
在含圖解與實驗的完整版中開啟卡片 →
防火牆或 Linux 連線追蹤(conntrack,把經過的連線記錄在表中的功能),在表已滿或判斷連線狀態不符時,會丟棄封包。
為什麼 連線追蹤表已滿(table full),或去回程路徑不同,只有單一方向經過防火牆(非對稱路由) → 於是 防火牆把封包視為「未知連線」或「序號超出視窗範圍」而丟棄 → 畫面上 表滿了之後新連線會被擋下;路徑不一致時,只有走該路徑的人在反覆重傳後斷線
症狀 定格 , 斷線 , 連不上/無限讀取
因素 遺失
誰會遇到 整個伺服器, 特定地區/電信業者
何時 人潮湧入時, 剛登入/維護剛結束, 偶爾隨機發生
負責單位 主要負責 基礎設施團隊(網路基礎設施) · 協同 基礎設施團隊(伺服器基礎設施), 遊戲開發團隊(伺服器開發), 遊戲開發團隊(用戶端開發)
遊戲開發團隊要做的事 伺服器:為了因應表滿的情況,用登入排隊系統控制湧入的連線、重複使用連線以免反覆建立短連線(包括伺服器之間的呼叫)、心跳封包已中斷的連線要主動先清掉。用戶端:連線失敗或中斷時,逐步拉長重試間隔並隨機分散(避免表滿時所有人又一起湧入)。
基礎設施團隊要做的事 網路:加大防火牆的連線追蹤表、讓遊戲 port 不做連線追蹤、調整路由讓往返路徑經過同一台防火牆、確認防火牆的 TCP 視窗檢查設定。伺服器設備/OS:加大 Linux 的表(nf_conntrack_max)、讓遊戲 port 不做連線追蹤(NOTRACK)、確認 TCP 視窗檢查設定(nf_conntrack_tcp_be_liberal)、AWS 另外確認 conntrack_allowance_exceeded。
數值參考 Linux conntrack 的預設上限(nf_conntrack_max)依記憶體大小為數萬~數十萬筆。目前筆數(nf_conntrack_count)達到上限時,log 會留下「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(每個核心一行,16 進位)。防火牆看 session 表使用量與丟棄 log,AWS 看 ethtool -S 的 conntrack_allowance_exceeded 符合的跡象 項目數在上限值持平,同一時間 table full log 與 drop,或 conntrack_allowance_exceeded 增加。非對稱路由時,上限還有餘裕,但 invalid 與防火牆丟棄 log 在特定路徑的連線上增加 不符合的跡象 項目數離上限很遠,invalid 與丟棄 log 也沒有變化時,是其他原因。表還有餘裕,但防火牆的 CPU 或每秒封包數已滿載時,是「中間設備超過處理上限」 確認方式 用基礎設施工具確認(不需要遊戲程式碼)
出處 Netfilter Conntrack Sysfs variables Linux kernel nf_conntrack_max 的預設值為雜湊桶(hash bucket)數量(記憶體÷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」log 並丟棄(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 每個核心一行,以 16 進位表示,有 entries、invalid、insert_failed、drop、early_drop 等欄位
相關原因
同一層:TCP 重傳的根本原因
同一症狀(定格)在其他層的原因
查看含圖解與實驗的完整版卡片