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

遊戲 Lag 白皮書 › L9 伺服器遊戲程式

遊戲執行緒上的同步呼叫 Synchronous DB / file I/O on the game loop

原因 ID sp-sync-call · 主要負責 遊戲開發團隊(伺服器開發)

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

在 tick 進行中等待 DB 回應或檔案寫入時,伺服器上整個遊戲進行就會停住同樣長的時間。

為什麼 在 tick 內等待 DB 查詢與儲存、log 寫入、外部 API 呼叫 → 於是 DB 花 100ms,tick 也停住 100ms → 畫面上 每當 DB 或磁碟變慢,整個野外就頓一下

症狀
定格, 卡頓
因素
停滯
誰會遇到
特定地點/頻道, 整個伺服器
何時
做特定動作時, 偶爾隨機發生
負責單位
主要負責 遊戲開發團隊(伺服器開發)
遊戲開發團隊要做的事
把慢的工作(DB 查詢與儲存、log 寫入、外部 API 呼叫)全部改成非同步,結果在下一個 tick 反映(只設逾時的話,等待期間仍會停住)。
數值參考
即使同一資料中心內的 DB 往返只要 0.5ms,一個 tick 呼叫 100 次就是 50ms,單靠這一項就用光 20 tick 的預算。
圖表上
偶爾隨機飆高 · 伺服器 tick 時間、DB 查詢延遲
查看位置
把 tick 時間圖表與 DB 查詢延遲(slow query log 等)、磁碟延遲放在同一條時間軸上看。沒有 tick 指標時,用 bcc offcputime -p 看遊戲執行緒在哪裡等待
符合的跡象
tick 飆高的時間點與 DB、檔案延遲飆高的時間點重疊,遊戲執行緒的等待時間集中在接收 DB 回應、寫入檔案的呼叫堆疊
不符合的跡象
DB 與磁碟延遲平穩、tick 卻飆高時,是 GC 暫停或鎖競爭
確認方式
需要遊戲伺服器/用戶端的 log 與指標

出處

  1. Designs, Lessons and Advice from Building Large Distributed Systems Google
    LADIS 2009 主題演講(Jeff Dean)。同一資料中心內的往返約 0.5ms(500,000ns)
  2. ASP.NET Core Best Practices Microsoft
    資料存取、I/O 與耗時的工作應以非同步呼叫;同步阻塞呼叫會導致執行緒池耗盡與回應延遲
  3. Demonstrations of offcputime, the Linux eBPF/bcc version IO Visor
    把執行緒停住、離開 CPU 的時間(off-CPU)依呼叫堆疊加總,-p 指定處理程序

相關原因

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

同一症狀(定格)在其他層的原因

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