このページの目次

cpufreq と cpuidle

カバー範囲: cpufreq governors → CPU idle states (C-states) → cpuidle governor → P-state ドライバ (intel_pstate/amd-pstate) → schedutil → エネルギー効率 カーネルバージョン: 2.6 ~ 6.x

cpufreq: 動的周波数調整

Governors (ゴバナー)

// drivers/cpufreq/
// 各 governor は独立したポリシーモジュールです:

// performance: 常に最高周波数 (P0) → ピークパフォーマンス、ゼロレイテンシ、高消費電力
// powersave:   常に最低周波数 → 極限の省電力、低パフォーマンス
// schedutil:   スケジューラ駆動の周波数選択 → デフォルト (5.x 以降)
// ondemand:    必要に応じて周波数調整 (CPU 利用率サンプリングに基づく) → 旧デフォルト、応答に遅延あり
// conservative: 段階的な周波数上昇/下降 (ondemand に似ているがより滑らか)

schedutil: スケジューラ駆動

// kernel/sched/cpufreq_schedutil.c
// 周波数は CFS の PELT util シグナルによって直接駆動されます:

// 毎回のスケジューラティックで:
//   util = cpu_util_cfs(rq)  // 現在の CPU の CFS 利用率
//   next_freq = 1.25 * util * max_freq / capacity
//   → cpufreq を next_freq に設定

// 利点:
//   - スケジューラが直接 CPU 負荷を知っているため、独立したサンプリングが不要
//   - ondemand よりも応答レイテンシが大幅に低い (スケジューラパス内であり、独立したタイマー内ではない)
//   - EAS (Energy Aware Scheduling) と統合されている

ドライバ: intel_pstate / amd-pstate

// drivers/cpufreq/intel_pstate.c
// intel_pstate: Intel CPU の P-state 管理 (Sandy Bridge 以降)
//   提供: internal governor (powersave / performance)
//   MSR (IA32_PERF_CTL) に直接書き込み → ACPI 不要

// drivers/cpufreq/amd-pstate.c
// amd_pstate: AMD CPU の P-state 管理 (Zen2 以降)
//   3つのモード: active (CPPC), guided, passive

// 現在の状態を確認:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver

cpuidle: CPU アイドル状態管理

C-states

より深いスリープレベルになるほど、消費電力は減少し、ウェイクアップレイテンシは増加します:

C0: アクティブ (実行中)
C1: HLT/MWAIT → 実行停止、約 1μs でウェイクアップ
C1E: 拡張 C1 → 周波数低下 + C1
C2: クロック停止 → 約 3μs
C3: キャッシュフラッシュ → 約 20μs
C6: コア電源オフ → 約 50μs
C7: より大規模な電源オフ (IVB 以降) → 約 100μs

CPU はこれらの状態間で自動的に切り替わります (ハードウェア管理)
カーネルは cpuidle フレームワークを通じて、どの C-state にいつ入るかを決定します

Cpuidle Governor

// drivers/cpuidle/governors/menu.c
// menu governor (デフォルト):
//   過去のアイドル期間に基づいて予測 → C-state を選択
//   予測因子: 直近のアイドル期間、繰り返しパターンの検出、次のタイマーイベント

// drivers/cpuidle/governors/teo.c
// TEO (Timer Events Oriented):
//   更新された governor → 直近のタイマーイベントのインターバルに基づいて選択
//   menu よりも正確 (特にバーストワークロードにおいて)

エネルギー効率スケジューリング (EAS)

EAS (Energy Aware Scheduling、ARM):
  スケジューラは CPU 選択時にエネルギー効率を考慮します:
    → 既にウェイクアップ済みの CPU を優先 (深い C-state からのウェイクアップを回避)
    → 残りのキャパシティが十分な CPU を選択 (周波数上昇を回避)
    → 同一クラスタの CPU を選択 (キャッシュを共有)

  schedutil + cpuidle を統合 → スケジューリング、周波数、C-state の意思決定を一元化

デバッグ

# cpufreq 情報
cpupower frequency-info
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# C-state 使用統計
cpupower idle-info
cat /sys/devices/system/cpu/cpu0/cpuidle/state*/{name,usage,time,above,below}

# 消費電力統計 (Intel RAPL)
cat /sys/class/powercap/intel-rapl/intel-rapl:0/energy_uj

# turbostat: リアルタイムの周波数と C-state
turbostat --quiet --show PkgWatt,CorWatt,CPU%c1,CPU%c6 1

参考

  • ソースコード⁠: drivers/cpufreq/, drivers/cpuidle/, kernel/sched/cpufreq_schedutil.c
  • カーネルドキュメント⁠: Documentation/admin-guide/pm/

キーワード: cpufreq, schedutil, intel_pstate, C-state, cpuidle, EAS, turbostat, P-state