遊戲 Lag 白皮書 › 依症狀查找
吃指令/回檔:36 個原因與負責團隊
其他說法:技能被吃、道具被收回、交易失敗
在含圖解的完整版症狀辭典中開啟 →
明明做了的動作變成沒發生過,或是結果過了好一陣子才被推翻。
按了技能卻沒發動。買到的道具不見,或重新登入後回到幾分鐘前的狀態。
可能是請求遺失(封包遺失、佇列滿溢)、伺服器的判定和自己的畫面不同(判定時間點不同、先行演出後被拒絕),或是存檔途中失敗(DB 鎖定或故障、伺服器當機)。
造成這個症狀的原因
L1 用戶端遊戲程式
- 時鐘同步誤差: 用戶端推估的伺服器時間不準時,內插時間點與冷卻判定就會出現偏差。 (遊戲開發團隊(用戶端開發))
L5 資料中心網路設備
- 雲端 NAT 閘道的連線與 port 上限: 私有子網路中的伺服器對外(平台驗證、付款、外部 API)的連線,由 NAT 閘道轉換位址與 port 後送出。送往同一目的地的同時連線超過閘道的 port 上限時,新連線就會失敗。 (基礎設施團隊(網路基礎設施))
- 交換器 microburst: 多台伺服器在同一瞬間同時對數千人送出封包時,這些流量匯集的交換器 port 上的小緩衝區,不到 1ms 就會滿溢。 (遊戲開發團隊(伺服器開發))
L6 伺服器網路卡
- Ring buffer 不足: NIC 暫存封包的 ring buffer 太小時,封包瞬間湧入就會讓緩衝區滿溢而被丟棄。 (基礎設施團隊(伺服器基礎設施))
- 超過雲端 PPS 上限: 雲端伺服器依類型各有每秒封包數與頻寬的上限,超過時會默默丟棄。 (基礎設施團隊(伺服器基礎設施))
L7 伺服器 OS(kernel)
- OOM killer: Linux 在記憶體耗盡時,會挑出使用最多記憶體的處理程序強制終止,通常就是遊戲伺服器。 (遊戲開發團隊(伺服器開發))
- 系統時鐘跳動(NTP step): 伺服器時鐘一次被往前或往後調整幾秒時,依賴系統時鐘的計時器會同時觸發或停住。 (遊戲開發團隊(伺服器開發))
- 伺服器間連線的臨時 port 耗盡: 遊戲伺服器頻繁地對 DB 或其他伺服器建立又關閉短連線時,已關閉的連線會占用 port 一段時間,導致無法開啟新連線。 (遊戲開發團隊(伺服器開發))
L8 Socket 與協定
- 可靠 UDP 的重傳設定: 在 UDP 上自行實作的重傳規則太保守時復原會變慢,太積極時反而讓線路更壅塞。 (遊戲開發團隊(伺服器開發))
L9 伺服器遊戲程式
- 訊息佇列積壓: 請求進來的速度比處理速度快而在佇列中累積時,排在後面的請求要幾秒後才會處理,或被丟棄。 (遊戲開發團隊(伺服器開發))
- 伺服器當機: 伺服器處理程序因未處理的錯誤而終止時,該伺服器上所有人會同時斷線。 (遊戲開發團隊(伺服器開發))
- 更新改變了流量模式: 新內容、特效、同步項目讓封包變大、變頻繁時,原本運作正常的伺服器在更新後就會碰到 MTU、頻寬、封包數上限。 (遊戲開發團隊(伺服器開發))
L11 磁碟
- 磁碟已滿: log 與 dump 越積越多、把磁碟塞滿時,寫入會失敗;沒有防範措施的話,伺服器會當機。 (基礎設施團隊(伺服器基礎設施))
L12 資料庫
- 熱點資料列鎖定競爭: 所有人都要修改同一筆資料列(公會倉庫、拍賣場熱門道具、全伺服器共用的計數器)時,一次只有一個請求能取得鎖定。 (遊戲開發團隊(伺服器開發))
- DB 死結: 兩個 transaction(當成一個整體處理的一組 DB 操作)互相等待對方鎖住的資料列時,DB 會強制取消其中一方。 (遊戲開發團隊(伺服器開發))
- 複寫延遲: 寫入走主 DB、讀取走複本的架構下,複本跟得慢時,剛寫入的內容就會看不到。 (基礎設施團隊(DB 基礎設施))
- 大量批次作業: 在營運時段執行排行榜彙總、信件批次發送、舊資料清理時,會占用鎖定與磁碟。 (遊戲開發團隊(伺服器開發))
- DB 容錯移轉: 主 DB 故障、切換到備援 DB 的期間無法寫入,最後一批還沒複寫過去的資料可能會遺失。 (基礎設施團隊(DB 基礎設施))
- 存檔週期過長造成的進度遺失: 為了減輕負載而每隔幾分鐘才存檔一次的話,伺服器在兩次存檔之間當機時,進度就會消失。 (遊戲開發團隊(伺服器開發))
- 長時間未結束的 transaction: 一個 transaction 長時間不結束時,會一直持有鎖定,DB 也無法清理(purge)舊版本的資料,整體會越來越慢。 (遊戲開發團隊(伺服器開發))
- 營運中 schema 變更(DDL)的鎖定: 在服務中替資料表新增欄位或索引時,可能因為一個只需要短暫持有的鎖定,讓所有使用該資料表的請求都在等待。 (基礎設施團隊(DB 基礎設施))
L13 伺服器架構與維運
- 附屬伺服器故障: 聊天、隊伍、拍賣場這類與遊戲伺服器分開運作的伺服器故障時,只有那個功能無法運作。 (遊戲開發團隊(伺服器開發))
- 伺服器之間的時鐘差異: 各伺服器的時鐘各差一點時,冷卻時間、buff、活動開始的判定就會在伺服器之間對不上。 (基礎設施團隊(伺服器基礎設施))
- 依賴外部服務: 平台登入、付款、身分驗證這類外部服務變慢或停擺時,會卡在那個步驟。 (外部(外部))
- 配對與區域分配錯誤: 沒被分到近的區域、卻被分到遠方區域的伺服器時,即使線路正常,也只有那位玩家的 ping 一直偏高。 (遊戲開發團隊(伺服器開發))
- TLS 憑證過期/設定錯誤: 登入、API、更新伺服器的憑證過期或缺少中繼憑證時,從那一刻起新連線的用戶端 TLS 連線都會失敗。 (基礎設施團隊(網路基礎設施))
同步設計
- 沒有技能預輸入: 必須收到伺服器確認前一個技能已結束才能按下一個技能時,每次連段之間都會夾著一段往返時間。 (遊戲開發團隊(用戶端開發))
- 被 ping 吃掉的短判定區間: 閃避、格擋、防禦這類需要反應的時間很短時,ping 會把這段時間吃掉,出現躲不掉的攻擊。 (遊戲開發團隊(伺服器開發))
- 沒有延遲補償的判定: 伺服器只用「伺服器上現在的位置」判定命中時,判定會與自己看到的畫面不一致。 (遊戲開發團隊(伺服器開發))
- 延遲補償過度: 以攻擊者為準回溯得太遠時,被打的一方明明已經躲好了還是會中彈。 (遊戲開發團隊(伺服器開發))
- 用戶端權威: 各自決定自己的結果時,自己的畫面很順暢,但結果會與其他人的畫面不一致,也容易被外掛利用。 (遊戲開發團隊(伺服器開發))
- 過於嚴格的伺服器驗證: 伺服器對移動速度、冷卻時間、射程檢查得太嚴格時,連因抖動而擠在一起抵達的正常輸入也會被拒絕。 (遊戲開發團隊(伺服器開發))
- 先行演出後遭伺服器拒絕: 自己畫面上先呈現的打擊、技能,事後沒有被伺服器認可時,明明看到的結果就變成沒發生過。 (遊戲開發團隊(用戶端開發))
- 快照傳送頻率太低: 伺服器每秒只送幾次位置更新(快照)時,內插緩衝就得相應拉長,看到的其他角色會是更久以前的狀態。 (遊戲開發團隊(伺服器開發))
只有部分人遇到的問題
- 集中在特定電信業者玩家的驗證誤判: 線路抖動大的人,輸入會成批抵達,因此常被伺服器的速度、冷卻檢查攔下。 (遊戲開發團隊(伺服器開發))
- 一個慢的隊友與王的機制: 在所有人必須在指定瞬間一起反應的團隊副本機制中,一個慢的人反應太晚,就會讓整個隊伍失敗。 (遊戲開發團隊(伺服器開發))
查看含圖解的完整版症狀辭典