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

遊戲 Lag 白皮書 › L8 Socket 與協定

壅塞控制造成傳送量驟降 Congestion control backoff

原因 ID sk-congestion · 主要負責 基礎設施團隊(伺服器基礎設施) · 協同 遊戲開發團隊(伺服器開發)

在含圖解與實驗的完整版中開啟卡片 →

TCP 把封包遺失視為壅塞的訊號,會把傳送速率降低 30~50%。對 Wi-Fi 造成的遺失也會做出同樣的反應。

為什麼 要送的資料量大時,Wi-Fi 或線路上發生少量封包遺失 → 於是 TCP 大幅降低傳送速率後慢慢回升(Linux、Windows 預設的 CUBIC 會降低 30%) → 畫面上 人多的地方狀態更新積壓,出現快轉、輸入延遲

症狀
快轉, 輸入延遲
因素
延遲, 停滯
誰會遇到
只有我
何時
人潮湧入時
負責單位
主要負責 基礎設施團隊(伺服器基礎設施) · 協同 遊戲開發團隊(伺服器開發)
遊戲開發團隊要做的事
減少傳送量(只送 AOI 內、只送變更部分),分散傳送,避免一次全部送出。
基礎設施團隊要做的事
改用 BBR 等壅塞控制演算法(tcp_congestion_control)。
圖表上
緩慢爬升後驟降 · 每條連線的壅塞視窗(cwnd)與傳送速率
查看位置
對狀態更新積壓的玩家連線多次執行 ss -ti,看 cwnd、ssthresh 的變化與壅塞控制演算法名稱(cubic、bbr),並一併看 Send-Q 是否累積
符合的跡象
每次遺失後 cwnd 大幅縮小再慢慢回升,反覆發生;縮小期間 Send-Q 累積,與快轉、輸入延遲的回報時間重疊
不符合的跡象
cwnd 很充足仍然積壓時,要查接收端視窗(「Zero window(看起來像重傳的停頓)」)或伺服器傳送端
確認方式
用基礎設施工具確認(不需要遊戲程式碼)

出處

  1. RFC 9438: CUBIC for Fast and Long-Distance Networks IETF
    遺失時 CUBIC 把視窗乘以 0.7(減少 30%),Reno 乘以 0.5;CUBIC 是 Linux、Windows、Apple 的預設
  2. TCP BBR congestion control comes to GCP – your Internet just got faster Google Cloud
    以遺失為依據的壅塞控制,即使遺失與壅塞無關也會大幅降低傳送速率;BBR 依傳遞速率與 RTT 判斷
  3. IP Sysctl Linux kernel
    以 tcp_congestion_control 選擇新連線的壅塞控制演算法
  4. ss(8) — Linux manual page iproute2
    -i 的 cwnd、ssthresh 與壅塞控制演算法名稱
  5. net/ipv4/tcp_diag.c (Linux v6.12) Linux kernel
    ss 的 Recv-Q、Send-Q 值:listen socket 是等待 accept 的連線數與 backlog 上限;已連線的 socket 是應用程式尚未讀取的位元組數與尚未收到 ACK 的已送出位元組數

相關原因

同一層:L8 Socket 與協定

同一症狀(快轉)在其他層的原因

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