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

遊戲 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 預算」)
確認方式
用基礎設施工具確認(不需要遊戲程式碼)

出處

  1. epoll(7) — Linux manual page Linux man-pages
    可擴展到同時監看大量 fd 的 I/O 事件通知
  2. I/O Completion Ports Microsoft
    以預先建立的執行緒池處理大量非同步 I/O 的 Windows 做法
  3. pidstat(1) — Linux manual page sysstat
    -w 的 cswch/s:為等待資源而主動讓出的自願 context switch;加 -t 可看各執行緒

相關原因

同一層:L8 Socket 與協定

同一症狀(慢動作)在其他層的原因

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