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

遊戲 Lag 白皮書 › L7 伺服器 OS(kernel)

容器 CPU 節流(CFS 配額) Container CPU throttling (CFS quota)

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

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

容器設了 CPU 上限時,只要在固定週期(通常是 100ms)內用完配額,剩下的時間就會被強制暫停(節流)。

為什麼 在 Kubernetes 等平台上為遊戲伺服器容器設定 CPU 上限(limit) → 於是 tick 計算集中的瞬間用完配額,暫停數十 ms 直到下一個週期 → 畫面上 平均 CPU 很低,tick 卻週期性飆高,出現卡頓、慢動作

症狀
卡頓, 慢動作
因素
停滯, 抖動
誰會遇到
整個伺服器
何時
人潮湧入時, 偶爾隨機發生
負責單位
主要負責 基礎設施團隊(伺服器基礎設施) · 協同 遊戲開發團隊(伺服器開發)
遊戲開發團隊要做的事
讓工作執行緒數符合 CPU 上限(避免 runtime 依主機的全部核心數建立執行緒)。
基礎設施團隊要做的事
把 CPU 上限設得寬鬆一些,或拿掉上限改配置專用核心;監控被節流的次數(nr_throttled)。
數值參考
上限 2 核心的伺服器若有 8 個執行緒同時工作,會在 25ms 內用完 100ms 週期的配額,然後暫停 75ms。
圖表上
隨人數/負載上升 · 節流次數(nr_throttled)、伺服器 tick 時間
查看位置
將容器 cgroup 的 cpu.stat 中 nr_throttled、throttled_usec(cgroup v1 為 nr_throttled、throttled_time)的增加量與伺服器 tick 時間一起看
符合的跡象
平均 CPU 使用率低於上限,nr_throttled、throttled_usec 卻持續增加,且與 tick 飆高的時間點重疊
不符合的跡象
nr_throttled 沒有增加就不是這個原因。虛擬機器本身分不到 CPU 時是「CPU steal(虛擬機器)」
確認方式
用基礎設施工具確認(不需要遊戲程式碼)

出處

  1. CFS Bandwidth Control Linux kernel
    用完每個週期分到的配額後,執行緒會暫停到下一個週期(節流);預設週期 100ms;nr_throttled 統計
  2. Control Group v2 Linux kernel
    cpu.max 的格式為「$MAX $PERIOD」(配額、週期),預設值為「max 100000」(100ms 週期)
  3. Resource Management for Pods and Containers Kubernetes
    容器的 CPU limit 是 kernel 以 CPU 節流強制執行的硬性上限

相關原因

同一層:L7 伺服器 OS(kernel)

同一症狀(卡頓)在其他層的原因

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