このページの目次
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 情報
# C-state 使用統計
# 消費電力統計 (Intel RAPL)
# turbostat: リアルタイムの周波数と C-state
参考
- ソースコード:
drivers/cpufreq/,drivers/cpuidle/,kernel/sched/cpufreq_schedutil.c - カーネルドキュメント:
Documentation/admin-guide/pm/
キーワード: cpufreq, schedutil, intel_pstate, C-state, cpuidle, EAS, turbostat, P-state