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

ゲームラグ白書 › L7 サーバーOS(カーネル)

サーバーの電源管理(C-state・周波数制御)による遅延スパイク CPU power management latency (C-states, frequency scaling)

原因ID so-cstate · 主担当 インフラチーム・サーバーインフラ

図と実験のあるメインページでこのカードを開く →

使われていないCPUコアは、電力を節約するために深い省電力状態(C-state)に入り、周波数も下げます。パケットやタイマーが来ると、復帰して周波数を上げるまでに時間がかかるため、小さなパケットの処理に遅延が加わります。

なぜ OSの周波数制御ポリシー(governor)やBIOSの電源設定が、深いC-stateと低い周波数を許可している → すると 休んでいたコアが深い省電力状態から復帰するたびに最大数百µs遅れ、周波数が低く固定されているとティックの計算自体が遅くなる → 画面では 普段は体感しにくいが、サーバー間の呼び出しが多いと積み重なり、空いているときにかえって応答が遅くなる入力遅延。周波数が低く固定されていると、人が集中したときにティックが遅れてスローモーション

症状
入力遅延, スローモーション
要因
遅延, ジッター, ストール
誰に起きるか
サーバー全体
いつ
常に, ときどきランダムに
担当
主担当 インフラチーム・サーバーインフラ
インフラチームの対応
BIOSの電源設定を性能重視に、OSのgovernorをperformanceに(cpufreqのscaling_governor)、遅延に敏感なサーバーでは深いC-stateを制限(tunedのlatency-performanceプロファイル、PM QoSの/dev/cpu_dma_latency、カーネルパラメータintel_idle.max_cstate)、変更後は同じデータセンター内の往復時間・ティック時間のジッターと消費電力を合わせて比較。
数値の目安
Linux 6.12のintel_idleドライバーにある表によると、IntelのサーバーCPUの浅いC1は復帰に1〜2µs、深いC6は133µs(Skylake-SP)〜290µs(Sapphire Rapids)かかります。1回あたりはわずかですが、1つのリクエストが複数のサーバーを経由すると、その分だけ積み重なります。カーネルは予想されるアイドル時間が長いほど深い状態を選ぶため、パケットがまばらにしか来ない空いたサーバーほど頻繁に起きます。汎用cpufreqのpowersave governorは、許可された範囲で最も低い周波数に固定します(intel_pstateにある同じ名前のアルゴリズムは、負荷に応じて調整します)。
グラフでは
最初から常に高い · 同じデータセンター内の往復時間、コアの周波数
確認箇所
cpupower monitorでコアごとのC-state滞在率と実際の周波数を確認し、/sys/devices/system/cpu/cpu0/cpuidle/以下の各stateのname・latency(復帰にかかるµs)・usage、cpufreqのscaling_governor、tuned-adm activeで現在のプロファイルを確認
該当する場合
空いているときにコアが最も深いC-stateに長くとどまるか、周波数が最低付近に固定されており、performance governor・浅いC-stateに変えると小さなリクエストの往復時間とジッターが減る
該当しない場合
変えても差が数十µs以内なら、この原因は無視してよい。ms単位で跳ねるなら「CPUスチール(仮想マシン)」かほかの層
確認手段
インフラのツールで確認(ゲームコード不要)
もっと詳しく
オンプレミスのベアメタルサーバーでは、BIOS(ファームウェア)の電源設定とOSの設定を両方確認します。クラウドでは一部のインスタンスタイプだけがOSからC-state・周波数を変更でき、AWSはデフォルト設定が最大性能寄りなので、ほとんどの場合はそのままで構いません。Red Hat系のtunedにあるlatency-performanceプロファイルは、governorをperformanceにし、PM QoSで浅いC-stateだけを使うようにします。省電力を無効にすると消費電力が増えるため、遅延に敏感なサーバーだけに適用します。

出典

  1. CPU Idle Time Management Linux kernel
    省電力状態ごとに復帰時間(exit latency)と最小滞在時間(target residency)があり、予想アイドル時間に合わせて深い状態を選ぶ、sysfsのstateごとのlatency・usage・time、PM QoS(/dev/cpu_dma_latency)とintel_idle.max_cstateで深い状態を制限
  2. drivers/idle/intel_idle.c (Linux v6.12) Linux kernel
    IntelのサーバーCPUのC-stateごとの復帰時間:Skylake-SP C1 2µs・C1E 10µs・C6 133µs、Ice Lake C6 170µs、Sapphire Rapids C1 1µs・C6 290µs
  3. CPU Performance Scaling Linux kernel
    scaling_governorでgovernorを確認・変更、performanceは許可範囲で最も高い周波数、powersaveは最も低い周波数を要求
  4. intel_pstate CPU Performance Scaling Driver Linux kernel
    intel_pstateのpowersaveアルゴリズムは、汎用のpowersave governorと違って負荷に応じて調整(schedutil・ondemandに近い)
  5. Chapter 2. Getting started with TuneD Red Hat
    latency-performanceプロファイルは省電力機能を無効にしてgovernorをperformanceにし、PM QoSで浅いC-stateだけを使わせる、tuned-adm activeで現在のプロファイルを確認
  6. tools/power/cpupower/man/cpupower-monitor.1 (Linux v6.12) Linux kernel
    cpupower monitor:コアごとの周波数と省電力状態の統計
  7. Processor state control for Amazon EC2 Linux instances AWS
    一部のインスタンスタイプだけがOSからC-state・P-stateを制御でき、遅延を減らすために変更できる、デフォルト設定は最大性能でほとんどのワークロードに適している、Gravitonは固定周波数のためOSからは制御しない

あわせて読みたい原因

同じ層:L7 サーバーOS(カーネル)

同じ症状(入力遅延)を起こすほかの層の原因

図と実験のあるメインページでこのカードを見る