遊戲 Lag 白皮書 › L9 伺服器遊戲程式
更新改變了流量模式 Patch changes traffic pattern
原因 ID sp-patch-traffic · 主要負責 遊戲開發團隊(伺服器開發) · 協同 基礎設施團隊(伺服器基礎設施), 基礎設施團隊(網路基礎設施)
在含圖解與實驗的完整版中開啟卡片 →
新內容、特效、同步項目讓封包變大、變頻繁時,原本運作正常的伺服器在更新後就會碰到 MTU、頻寬、封包數上限。
為什麼 更新增加了新的技能特效、同步項目、道具資訊,封包變大或變頻繁 → 於是 大封包超過 MTU 而被分段,增加的流量碰到頻寬、雲端 PPS 上限與傳送緩衝區的限制 → 畫面上 更新後人多的地方開始出現瞬移、技能被吃、輸入延遲。基礎設施沒有任何變更,封包遺失卻增加
- 症狀
- 瞬移, 吃指令/回檔, 輸入延遲
- 因素
- 遺失, 延遲
- 誰會遇到
- 整個伺服器, 特定地點/頻道, 特定地區/電信業者
- 何時
- 人潮湧入時, 晚間尖峰時段, 一直都有
- 負責單位
- 主要負責 遊戲開發團隊(伺服器開發) · 協同 基礎設施團隊(伺服器基礎設施), 基礎設施團隊(網路基礎設施)
- 遊戲開發團隊要做的事
- 自行把封包切成 1,200 位元組以下;新的同步項目只送變更部分,並依距離與重要程度降低頻率;部署前在測試伺服器上將每位玩家每秒的封包數、位元組數與最大封包大小和前一個 build 比較;在流量指標中記錄 build 版本。
- 基礎設施團隊要做的事
- 伺服器設備/OS:在圖表上標示部署時間,比較部署前後每位玩家每秒的封包數、位元組數與平均封包大小;為執行個體的超過上限計數器設警示;必要時改用更大的執行個體。網路:檢查防火牆、負載平衡器、DDoS 防護設備的處理上限,以及是否會阻擋分段。
- 數值參考
- UDP 封包在 1,200 位元組以下比較安全;網際網路的路徑 MTU 通常是 1,500 位元組,經過通道時更小(GRE 通道為 1,476 位元組)。超過路徑 MTU 的封包會被分段或丟棄,而分段的封包只要遺失一個分段就整個遺失。每位玩家每秒的封包數增加 20%,整台伺服器也會增加 20%,原本就接近上限的執行個體會立刻超出。
- 圖表上
- 從某個時間點起階梯式上升 · 每位玩家每秒的封包數與位元組數、平均封包大小
- 查看位置
- 把部署前後伺服器 NIC 每秒的封包數與位元組數(sar -n DEV 的 rxpck/s、txpck/s、rxkB/s、txkB/s,EC2 為 NetworkPacketsOut、NetworkOut)除以同時上線人數後比較。平均封包大小為位元組數 ÷ 封包數,大小分布則用 Wireshark 的 Packet Lengths 統計分析封包擷取
- 符合的跡象
- 部署後每位玩家的封包數、位元組數或平均封包大小階梯式上升並維持在高檔,同一時間起伺服器產生的分段數(sar -n IP 的 fragcrt/s)或執行個體超過上限計數器(AWS ENA 的 pps_allowance_exceeded、bw_out_allowance_exceeded)增加
- 不符合的跡象
- 部署前後流量模式相同,只有延遲與封包遺失增加時,要查同一時間的基礎設施變更(設定、路由、設備、OS/kernel 更新)
- 確認方式
- 用基礎設施工具確認(不需要遊戲程式碼)
- 深入了解
- 收到「更新前都很正常」的回報時,這是要和基礎設施變更一起優先確認的遊戲端原因。即使更新說明裡沒有網路方面的變更,一個新特效或同步項目在人多的地方也會被乘上數百人份。增加的流量實際卡在哪裡,在「UDP 封包的 IP 分段」、「超過雲端 PPS 上限」、「NIC 頻寬飽和」、「Kernel socket 緩衝區不足」、「中間設備超過處理上限(防火牆、IPS、DDoS 防護)」等項目中說明。本項目處理的是讓流量碰到這些上限的起點為遊戲更新的情況,所以在提高上限之前,要先減少更新所增加的流量。如果同一時間也更新了 OS 或 kernel,就以每位玩家的流量是否改變,來和「OS、kernel、驅動程式、韌體更新後的效能變化」區分。
出處
- RFC 8085: UDP Usage Guidelines IETF
UDP 應用程式不應(SHOULD NOT)送出超過路徑 MTU 的 datagram;遺失一個分段就會失去整個分段的封包,部分 NAT 與防火牆會丟棄所有分段 - RFC 8899: Packetization Layer Path MTU Discovery for Datagram Transports IETF
UDP 等 datagram 傳輸的預設安全大小(BASE_PLPMTU)建議為 1,200 位元組 - Maximum transmission unit and maximum segment size Cloudflare
網際網路路徑 MTU 1,500,經過 GRE 通道時為 1,476 - Monitor network performance for ENA settings on your EC2 instance AWS
pps_allowance_exceeded、bw_out_allowance_exceeded:超過執行個體的 PPS 或傳送頻寬上限,因而排入佇列或被丟棄的封包數 - sar(1) — Linux manual page sysstat
sar -n DEV 的 rxpck/s、txpck/s(每秒封包數)與 rxkB/s、txkB/s(每秒 KB),sar -n IP 的 fragcrt/s(每秒產生的 IP 分段數,ipFragCreates) - CloudWatch metrics that are available for your instances AWS
NetworkPacketsOut(執行個體經由所有網路介面送出的封包數)、NetworkOut(送出的位元組數) - 8.7. Packet Lengths Wireshark
把擷取的封包依長度區間分組,顯示各區間的數量、平均值、最小值、最大值
相關原因
同一層:L9 伺服器遊戲程式
同一症狀(瞬移)在其他層的原因
查看含圖解與實驗的完整版卡片