遊戲 Lag 白皮書 › L7 伺服器 OS(kernel)
OS、kernel、驅動程式、韌體更新後的效能變化 Performance regression after OS / kernel / driver / firmware update
原因 ID so-os-update · 主要負責 基礎設施團隊(伺服器基礎設施)
在含圖解與實驗的完整版中開啟卡片 →
遊戲程式碼沒變,但伺服器 OS、kernel、驅動程式、韌體更新後就變慢。更新有時會改變預設值、排程器、CPU 漏洞緩解措施(mitigations)與驅動程式的行為。
為什麼 定期安全性更新或新的伺服器映像檔讓 kernel、驅動程式、韌體有所改變 → 於是 預設值或排程器改變,或啟用了新的漏洞緩解措施,同樣的工作要花更多 CPU 時間,執行緒分配到 CPU 的順序也跟著改變 → 畫面上 原本正常的伺服器從更新那天起一直都慢一點,出現輸入延遲;人潮湧入時出現卡頓、慢動作
- 症狀
- 輸入延遲, 卡頓, 慢動作
- 因素
- 延遲, 停滯, 抖動
- 誰會遇到
- 整個伺服器
- 何時
- 一直都有, 人潮湧入時
- 負責單位
- 主要負責 基礎設施團隊(伺服器基礎設施)
- 基礎設施團隊要做的事
- 更新先套用在部分伺服器上,將 tick 時間、延遲、CPU 使用率與前一版比較後再擴大範圍;與遊戲更新錯開日期部署;記錄更新前後的 kernel、驅動程式、韌體版本與主要 sysctl 值;出問題時改用前一版 kernel 開機確認;是否關閉緩解措施(mitigations=off)要評估資安風險後再決定。
- 數值參考
- kernel 版本改變,預設行為也會跟著改變。例如 Linux 從 6.6 起開始把排程器從 CFS 換成 EEVDF,連線等待佇列上限(somaxconn)的預設值也從 5.4 起由 128 改為 4,096。CPU 漏洞緩解措施會增加額外工作,例如從 kernel 返回程式時(每次系統呼叫結束時)以及 context switch、虛擬機器切換時清空 CPU 內部緩衝區,所以每個封包都要發出系統呼叫的網路伺服器受到的影響更大。有些漏洞要完全防堵就必須關閉 SMT(讓一個核心當成兩個執行緒使用的功能),而關閉 SMT 後,依工作性質效能可能大幅下降。kernel 參數 mitigations=off 會關閉所有緩解措施、找回效能,但系統會暴露在漏洞之下。
- 圖表上
- 從某個時間點起階梯式上升 · 伺服器 tick 時間、CPU 使用率、相同負載下的延遲
- 查看位置
- 將套件管理工具的更新紀錄與重新開機時間、uname -r 顯示的 kernel 版本、ethtool -i 顯示的 NIC 驅動程式資訊,與延遲上升的時間點對照。在相同負載下用 mpstat、pidstat 比較已更新與未更新的伺服器,也比較 /sys/devices/system/cpu/vulnerabilities/ 的緩解狀態
- 符合的跡象
- 延遲與 CPU 使用率從更新後重新開機的時間點起上升一階並維持不變,在相同負載下只有已更新的伺服器偏高。改用前一版 kernel 或驅動程式開機就恢復
- 不符合的跡象
- 在相同負載下已更新與未更新的伺服器一樣慢就不是這個原因。同一天也部署了遊戲更新,且每位玩家的封包數或大小有變時是「更新改變了流量模式」
- 確認方式
- 用基礎設施工具確認(不需要遊戲程式碼)
- 深入了解
- 緩解狀態可在 /sys/devices/system/cpu/vulnerabilities/ 底下的檔案確認。預設值(mitigations=auto)會在保持 SMT 開啟的情況下進行緩解;設為 auto,nosmt 時,會在有漏洞的 CPU 上關閉 SMT,升級 kernel 後邏輯核心數可能減半。在遊戲更新的同一天更新 OS 會難以分辨原因,所以要分開部署。
出處
- The kernel’s command-line parameters Linux kernel
mitigations=:off 會關閉所有 CPU 漏洞緩解措施以提高效能,但會暴露在漏洞之下;預設的 auto 在 SMT 開啟的狀態下緩解;auto,nosmt 會視需要關閉 SMT - MDS - Microarchitectural Data Sampling Linux kernel
緩解措施會在從 kernel 返回使用者空間時與進入虛擬機器時清空 CPU 緩衝區;以 /sys/devices/system/cpu/vulnerabilities/ 底下的檔案確認漏洞與緩解狀態;許多 CPU 必須關閉 SMT 才能完全防堵,而關閉 SMT 依工作性質可能對效能影響很大 - Spectre Side Channels Linux kernel
為了緩解,會在 context switch 與虛擬機器切換時清空分支預測緩衝區;較強的緩解措施會讓所有程式都多出額外開銷 - EEVDF Scheduler Linux kernel
Linux 從 6.6 起開始由 CFS 改為 EEVDF 排程器 - listen(2) — Linux manual page Linux man-pages
somaxconn 預設值從 Linux 5.4 起由 128 改為 4,096 - ethtool(8) — Linux manual page ethtool
以 ethtool -i 查詢網路裝置的驅動程式資訊
相關原因
同一層:L7 伺服器 OS(kernel)
同一症狀(輸入延遲)在其他層的原因
查看含圖解與實驗的完整版卡片