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

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

超出 tick 預算 Tick overrun

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

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

一個 tick 內要做的事超出預算時,伺服器的 tick 週期會拉長,整個區域的遊戲進行變慢,或出現卡頓。

為什麼 一個 tick(例如 50ms)要處理的事超出預算 → 於是 每秒應計算 20 次的遊戲狀態只算了 8 次 → 畫面上 整個區域出現慢動作(依伺服器設計也可能是卡頓),技能反應變慢

症狀
慢動作, 輸入延遲, 卡頓
因素
停滯
誰會遇到
特定地點/頻道, 整個伺服器
何時
人潮湧入時, 晚間尖峰時段
負責單位
主要負責 遊戲開發團隊(伺服器開發) · 協同 基礎設施團隊(伺服器基礎設施)
遊戲開發團隊要做的事
減少昂貴的運算、把 tick 拆給多個執行緒處理、分散人數(頻道)、把 tick 處理時間記錄為指標。
基礎設施團隊要做的事
把 tick 時間與各核心的 CPU 使用率加入監控與警示;評估單核心效能(時脈)較高的 CPU 或執行個體。
數值參考
20 tick 伺服器的預算是 50ms,30 tick 是 33ms,60 tick 是 16.7ms。為了因應人潮突然湧入,平時保留餘裕、只用到預算的一半左右比較安全。
圖表上
隨人數/負載上升 · 伺服器 tick 時間、各 zone/頻道的人數、遊戲執行緒 CPU
查看位置
把伺服器記錄的 tick 處理時間(p99)、tick 超出預算的次數與各 zone/頻道的人數放在同一張圖表上看。沒有 tick 指標時,用 pidstat -t 1 看單一遊戲執行緒的 CPU 使用率
符合的跡象
人潮湧入時 tick 時間超出預算(20 tick 時為 50ms),這段期間遊戲執行緒的 CPU 使用率一直貼近 100%
不符合的跡象
tick 超出預算但遊戲執行緒 CPU 偏低時,是等待類的原因(GC 暫停、鎖、同步呼叫)。bcc runqlat 的 run queue 延遲很長時,表示執行緒分配不到 CPU,是 CPU 不足或執行緒過多
確認方式
需要遊戲伺服器/用戶端的 log 與指標
深入了解
伺服器 tick 延遲時呈現的樣子依伺服器設計而不同。每個 tick 讓遊戲狀態前進固定時間(例如 50ms)的伺服器,遊戲時間本身會變慢,形成慢動作。依實際經過的時間一次移動到位的伺服器能維持遊戲進行的速度,但封包變得稀疏、每次移動幅度很大,看起來就是卡頓或瞬移。無論哪一種,輸入反應都會變慢。一個遊戲執行緒負責整台伺服器時,整台伺服器都會變慢;每個區域各有執行緒時,只有那個區域變慢。也有像 EVE Online 這樣的遊戲,在大規模戰鬥中刻意把遊戲時間放慢到最多 10 倍(Time Dilation),讓運算跟得上。
實際案例
CCP Games 2014: EVE Online HED-GP 大規模艦隊戰的伺服器過載

出處

  1. VALORANT's 128-Tick Servers Riot Games
    128 tick 伺服器必須在 7.8125ms 內完成一個畫格;依子系統量測伺服器畫格時間,並分配預算管理
  2. HED-GP Technical Retrospective: What a HED-ache CCP Games
    EVE Online 在過載時以 Time Dilation 放慢遊戲時間,下限為 10%(慢 10 倍);平時節點 CPU 維持在 80% 以下
  3. Handling variation in time Unity
    固定間隔的模擬落後時,會集中執行追趕的步驟,並捨棄超過上限的時間,因此遊戲時間比實際時間流逝得慢
  4. pidstat(1) — Linux manual page sysstat
    加 -t 可一併顯示處理程序所屬各執行緒的統計(CPU 使用率等)
  5. Demonstrations of runqlat, the Linux eBPF/bcc version IO Visor
    以直方圖顯示排程器的 run queue 延遲(工作等待分配到 CPU 的時間)

相關原因

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

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

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