遊戲 Lag 白皮書 › L5 資料中心網路設備
防火牆 session 表飽和 Firewall session table exhaustion
原因 ID dc-firewall · 主要負責 基礎設施團隊(網路基礎設施) · 協同 遊戲開發團隊(伺服器開發), 遊戲開發團隊(用戶端開發)
在含圖解與實驗的完整版中開啟卡片 →
防火牆會把放行的每條連線記錄在 session 表中追蹤。表一旦滿了,就無法接受新連線。
為什麼 連線暴增或遭受攻擊,使 session 數達到上限 → 於是 沒有空的項目可以記錄新連線,因此拒絕連線 → 畫面上 想新連進來的人連不上/無限讀取,部分既有連線也會斷線
- 症狀
- 連不上/無限讀取, 斷線
- 因素
- 遺失
- 誰會遇到
- 整個伺服器
- 何時
- 剛登入/維護剛結束, 人潮湧入時
- 負責單位
- 主要負責 基礎設施團隊(網路基礎設施) · 協同 遊戲開發團隊(伺服器開發), 遊戲開發團隊(用戶端開發)
- 遊戲開發團隊要做的事
- 伺服器:用登入排隊系統調節一次湧入的連線;重複使用連線,避免反覆建立短連線;心跳封包中斷的連線要主動先清理(避免死掉的連線長時間佔用 session 表)。用戶端:以最短閒置逾時一半以下的間隔送出心跳封包;斷線時自動重新連線,但要逐步拉長重試間隔並隨機分散(避免大家又同時湧入)。
- 基礎設施團隊要做的事
- 加大 session 表;盡快清理很快就結束的連線(縮短已結束 session 的逾時);縮短閒置 session 逾時時,要把數值告知遊戲團隊以配合調整心跳封包間隔;阻擋攻擊;設定 session 使用率警示。
- 圖表上
- 碰到上限後持平 · 防火牆 session 數、新連線失敗數
- 查看位置
- 把防火牆設備的同時 session 數與 session 上限畫在同一張圖上,並在設備 log 中找出無法建立 session 而丟棄的紀錄。若是 Linux 防火牆,比較 nf_conntrack_count 與 nf_conntrack_max,並查看 dmesg 中的「nf_conntrack: table full, dropping packet」;若是 AWS 執行個體,查看 ethtool -S 的 conntrack_allowance_exceeded
- 符合的跡象
- session 數在上限處持平的時間點起,新連線失敗增加,session 建立失敗紀錄或丟棄計數器也一起增加
- 不符合的跡象
- session 數遠低於上限卻連不上時,是「連線等待佇列(backlog)溢位」或登入伺服器端的問題。只有閒置連線被切斷時是「雲端安全群組的連線追蹤過期」
- 確認方式
- 用基礎設施工具確認(不需要遊戲程式碼)
出處
- Netfilter Conntrack Sysfs variables Linux kernel
連線追蹤表的最大項目數(nf_conntrack_max)、結束中連線的保留時間(TIME_WAIT、FIN_WAIT 預設 120 秒)、已建立的 TCP 連線預設 5 天、目前項目數(nf_conntrack_count) - Amazon EC2 security group connection tracking AWS
超過每個執行個體可追蹤的連線數時,新連線的封包會被丟棄,閒置連線可能耗盡追蹤表 - Infrastructure layer attacks AWS
SYN flood 等攻擊會佔住伺服器、防火牆、負載平衡器的資源 - net/netfilter/nf_conntrack_core.c (Linux v6.12) Linux kernel
連線追蹤表滿了時會留下「nf_conntrack: table full, dropping packet」,並丟棄新連線的封包 - Monitor network performance for ENA settings on your EC2 instance AWS
conntrack_allowance_exceeded:超過執行個體連線追蹤上限而被丟棄的封包數,用 ethtool -S 確認
相關原因
同一層:L5 資料中心網路設備
同一症狀(連不上/無限讀取)在其他層的原因
查看含圖解與實驗的完整版卡片