【governor】Linuxの電力制御について調べた

本題と関係ないですが, telnet で StarWars が見れます。感動した。

$ telnet towel.blinkenlights.nl

cli_starwars

Linuxの電力制御 (PowerManagement, PM)について書いてみた。

電力制御とは

基本的な考えとしてコンピュータの消費電力は, 電力 = 電圧 x 電流 であるので, 消費電流を抑えたい。
CPUを例に挙げると, 電流はCPUクロックに比例するので,CPUに不要な動作をさせない,又はCPUクロックを下げることが必要になります。

クロックゲーティング : CPUクロックをON/OFFする仕組み。
パワーゲーティング : CPUクロックに依存しないリーク電流を発生させない, 待機時電流を抑える工夫。

Linuxの電力制御

狭い意味ではLinuxの電力制御はサスペンドとレジュームの動作を指します。

  • サスペンド : アイドルよりも深いシステム休止中の動作
  • レジューム : サスペンドからのシステム復帰への動作

しかし、近年のスマートフォン等の普及による動作中の省電力化のニーズの高まりから, アクティブ中の動作まで含める場合が多くなり, より細かい制御がされるようになりました。

以前はBIOSだけで電源管理をしていたが1998年頃から, ACPI (Advanced Configuration and Power Interface)が登場。
これはOSとBIOSが協調して電源管理を行うための仕組みです。
ACPIはkernel 2.4以降で使用可能ですが,従来のAPMは使用できなくなります。

ACPI / C-State

ACPIの中で消費電力状態を表現するものにC-Stateという仕組みがあります。
C-Stateは電力制御の状態管理を行います。

C0 : アクティブ状態
C1 : アイドル状態
C2 : アイドル状態 (C1より深い)
C3 : サスペンド状態
C4 : ハイバーネーション状態

ポイントとしては,

  • ユーザランドのプログラムで例えばポーリングを行うためループ処理を実装すると, C0から中々C1に遷移しなくなる。そのためカーネルからの割り込み処理で書いた方が良い。
  • C2はC1より省電力だが復帰時間が掛かる。トレードオフの関係。
  • ticklessモードで、周期的ではなく割り込みによってトリガをセットすることで無駄なC0ステートを省くことができる。

governor

Linuxではgovernorと呼ばれるプログラムが、CPUロードアベレージを監視して, CPUクロックに調整します。

  • CPUfreq : 動作周波数の管理
  • CPUidle : C3/C4への状態遷移管理
  • CPUhotplug : CPUコアの管理

Runtime_PM

Runtime_PMは kernel 3.0以上でサポートされている複数の機能ブロックが電源を共有する場合に電源管理を行う機能です

cpufrequtils

cpufrequtilsはcpufreqに関する情報取得と変更を行うtool群です。

# debian
$ sudo apt-get -f  install cpufrequtils
# centos
$ yum install cpufrequtils
$ cpufreq-info