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

遊戲 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、驅動程式、韌體更新後的效能變化」區分。

出處

  1. RFC 8085: UDP Usage Guidelines IETF
    UDP 應用程式不應(SHOULD NOT)送出超過路徑 MTU 的 datagram;遺失一個分段就會失去整個分段的封包,部分 NAT 與防火牆會丟棄所有分段
  2. RFC 8899: Packetization Layer Path MTU Discovery for Datagram Transports IETF
    UDP 等 datagram 傳輸的預設安全大小(BASE_PLPMTU)建議為 1,200 位元組
  3. Maximum transmission unit and maximum segment size Cloudflare
    網際網路路徑 MTU 1,500,經過 GRE 通道時為 1,476
  4. Monitor network performance for ENA settings on your EC2 instance AWS
    pps_allowance_exceeded、bw_out_allowance_exceeded:超過執行個體的 PPS 或傳送頻寬上限,因而排入佇列或被丟棄的封包數
  5. 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)
  6. CloudWatch metrics that are available for your instances AWS
    NetworkPacketsOut(執行個體經由所有網路介面送出的封包數)、NetworkOut(送出的位元組數)
  7. 8.7. Packet Lengths Wireshark
    把擷取的封包依長度區間分組,顯示各區間的數量、平均值、最小值、最大值

相關原因

同一層:L9 伺服器遊戲程式

同一症狀(瞬移)在其他層的原因

查看含圖解與實驗的完整版卡片