遊戲 Lag 白皮書 › L8 Socket 與協定
阻塞式 I/O 架構 Blocking I/O model
原因 ID sk-blocking-io · 主要負責 遊戲開發團隊(伺服器開發)
在含圖解與實驗的完整版中開啟卡片 →
執行緒在等待某個 socket 時無法做其他事的架構,玩家越多整體就越慢。
為什麼 每條連線各自等待讀寫的方式 → 於是 一條連線的延遲擴散到同一執行緒的其他連線 → 畫面上 同時上線人數越多,所有人都出現慢動作、輸入延遲
- 症狀
- 慢動作, 輸入延遲
- 因素
- 停滯
- 誰會遇到
- 整個伺服器
- 何時
- 人潮湧入時, 晚間尖峰時段
- 負責單位
- 主要負責 遊戲開發團隊(伺服器開發)
- 遊戲開發團隊要做的事
- 改用以 epoll、IOCP、io_uring 為基礎的非同步 I/O。
- 圖表上
- 隨人數/負載上升 · 回應時間、執行緒數
- 查看位置
- 用 pidstat -w -t 看遊戲伺服器的執行緒數與各執行緒的自願 context switch(cswch/s,為等待資源而停下的次數),並與隨同時上線人數變化的回應時間比較
- 符合的跡象
- 同時上線人數越多,回應時間上升得越陡;隨連線數增加的執行緒大多只有自願切換很多,幾乎不使用 CPU(在等 socket)
- 不符合的跡象
- 執行緒沒有等待、持續使用 CPU 時,是運算過載(「超出 tick 預算」)
- 確認方式
- 用基礎設施工具確認(不需要遊戲程式碼)
出處
- epoll(7) — Linux manual page Linux man-pages
可擴展到同時監看大量 fd 的 I/O 事件通知 - I/O Completion Ports Microsoft
以預先建立的執行緒池處理大量非同步 I/O 的 Windows 做法 - pidstat(1) — Linux manual page sysstat
-w 的 cswch/s:為等待資源而主動讓出的自願 context switch;加 -t 可看各執行緒
相關原因
同一層:L8 Socket 與協定
同一症狀(慢動作)在其他層的原因
查看含圖解與實驗的完整版卡片