遊戲 Lag 白皮書 › L2 用戶端 OS 與裝置
接收緩衝區溢位 Socket receive buffer overflow
原因 ID co-rcvbuf · 主要負責 遊戲開發團隊(用戶端開發)
在含圖解與實驗的完整版中開啟卡片 →
遊戲太忙,太晚從 socket(OS 提供的網路收送介面)取出封包時,OS 緩衝區就會溢位。
為什麼 畫格延誤,遊戲太晚讀取 socket → 於是 OS 接收緩衝區滿了,UDP 直接丟棄,TCP 則縮小接收視窗讓對方停止傳送 → 畫面上 瞬移(UDP)或快轉(TCP)
- 症狀
- 瞬移, 快轉
- 因素
- 遺失, 停滯
- 誰會遇到
- 只有我
- 何時
- 人潮湧入時
- 負責單位
- 主要負責 遊戲開發團隊(用戶端開發)
- 遊戲開發團隊要做的事
- 專用的接收執行緒、調整緩衝區大小(SO_RCVBUF)。
- 數值參考
- 預設接收緩衝區依 OS 與設定為數十~數百 KB。人多的地方,更新量有時每秒可達數百 KB。
- 圖表上
- 隨人數/負載上升 · UDP 接收緩衝區丟棄數、畫格時間
- 查看位置
- 把 Windows 效能監視器的 Microsoft Winsock BSP\Dropped Datagrams(因 socket 接收緩衝區不足而丟棄的 UDP 數)與 UDPv4\Datagrams Received Errors 跟畫格時間一起記錄,遊戲端則計算收到封包序號中的缺漏
- 符合的跡象
- 人多的地方或長畫格剛結束時 Dropped Datagrams 增加,同一瞬間遊戲序號出現缺漏。同一時間線路端沒有封包遺失
- 不符合的跡象
- Dropped Datagrams 沒變、只有序號缺漏時,是傳輸路徑上的封包遺失
- 確認方式
- 在玩家端環境確認
出處
- socket(7) — Linux manual page Linux man-pages
SO_RCVBUF 是 socket 接收緩衝區的最大大小,預設值由 rmem_default、最大值由 rmem_max 決定(Android 也是 Linux kernel) - SOL_SOCKET Socket Options (Winsock2.h) Microsoft
Windows SO_RCVBUF:每個 socket 保留給接收用的緩衝區空間 - RFC 9293: Transmission Control Protocol (TCP) IETF
TCP 視窗欄位是接收端還能再收的位元組數;為 0 時,傳送端只送 zero window probe 並等待 - Low Latency Workloads Management and Operations Microsoft
Microsoft Winsock BSP 計數器集的 Dropped Datagrams、Dropped Datagrams/sec:UDP 抵達速度快過 App 處理速度,或接收 socket 緩衝區不足而丟棄的數量 - Network-Related Performance Counters Microsoft
UDPv4、UDPv6:Datagrams Received Errors;Microsoft Winsock BSP:Dropped Datagrams 計數器
相關原因
同一層:L2 用戶端 OS 與裝置
同一症狀(瞬移)在其他層的原因
查看含圖解與實驗的完整版卡片