読者です 読者をやめる 読者になる 読者になる

生物物理計算化学者の雛

主に科学に関する諸々を書き留めています。

CPU周波数上限の制御による消費電力低減

LinuxマシンではCPUの動作上限周波数を変更することが可能です。
(ここでの操作は Fedora, CentOS の両者で動作することを確認しました)
この機能によって周波数上限を下げることで、マシンの消費電力を下げることができます。
なお、周波数上限を下げれば当然のことながら処理速度は遅くなりますので注意してください。

以下のCPU周波数制御を行うためには root 権限が必要です。

CPU制御パッケージのインストール

まずCPU制御に必要なパッケージのインストールを行います(最初からインストールされている場合が多いですが)

yum install cpufrequtils

CPUに指定可能な周波数のリストを得る

指定可能な周波数リストはファイル /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies に記録されています。
Xeon E5-2630 マシンでは

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
2301000 2300000 2200000 2100000 2000000 1900000 1800000 1700000 1600000 1500000 1400000 1300000 1200000

が得られ、2.3GHz から 1.2GHz まで指定可能であることがわかります。
なお 2301000 と 2300000 の違いはターボブーストを許可するかどうかになります。

CPUの上限周波数を指定する

CPU周波数制御はファイル /etc/sysconfig/cpuspeed によって行います。
このファイルの中に

### FREQUENCIES ###
# NOTE: valid max/min frequencies for your cpu(s) can be found in
# /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies
# on systems that support frequency scaling (though only after the
# appropriate drivers have been loaded via the cpuspeed initscript).
# maximum speed to scale up to
# default value: empty (use cpu reported maximum)
MAX_SPEED=
# minimum speed to scale down to
# default value: empty (use cpu reported minimum)
MIN_SPEED=

という部分があり、MAX_SPEED に先ほどの scaling_available_frequencies 内に記載されている周波数のいずれかを指定することで、上限周波数を制限することができます。
何も指定しない場合は最大の上限周波数が自動的に適用されます(この場合 2.3GHz + ターボブースト、ターボブーストの動作確認方法はこのページに記述してあります)。
なお、MIN_SPEED も同様に周波数を指定することで下限周波数を指定できますが、消費電力面を考えるとCPU負荷がないのに周波数をあげることは無駄でしかないので意味がないと思います。(ひょっとするとアイドル→フル稼働までのタイムラグを短縮する効果がある等何か利点があるのかもしれませんが)
例えば上限周波数を 2.3GHz から 1.2GHz に落としたい場合は以下のように記述します。

MAX_SPEED=1200000

CPU周波数上限を適用する

編集した cpuspeed ファイルの内容を反映するためには cpuspeed サービスの再起動が必要です。

/etc/init.d/cpuspeed restart

これでCPU周波数上限が制限され、CPUフル稼働時にも周波数は 1.2GHz までしか上がりません。

消費電力の測定

実際にCPU周波数を制限することでどの程度消費電力が低減されるのかをワットチェッカーで測定しました。
測定したマシンは Core i7 940 (2.93GHz 4core)搭載の Fedora13 デスクトップPCです。
CPU上限を 2.93GHz (+ターボブースト有)から最低の1.6GHz まで変更し、4コア並列の分子動力学シミュレーション(CPU負荷のみで速度が決まる、実行中はCPU負荷は100%に張り付く)を実行し消費電力の最大値を目視で記録し、シミュレーション終了までにかかった時間を記録しました。

結果、2.93GHz (+ターボブースト有)でCPU性能を最大限活用した場合は消費電力が 216 W、実行時間82秒という結果になりました。それに対して指定可能な最低の周波数 1.60GHz を指定した場合、消費電力は 143 W(2.93GHz 時の 0.66倍)、実行時間は146秒(2.93GHz の 1.78倍)となりました。

CPUをフル稼働させるとアイドル時(104 W)の倍以上の消費電力であるのに対し、1.6GHz に抑えた場合はアイドル時の1.37倍で済み、消費電力を2/3まで下げることができました。
さらに 2.93GHz でフル稼働させるとファンが高速回転し騒音がひどかったのですが、上限周波数を落とすことでファン回転数も抑えられ、騒音をかなり減らすことができました。

cron 等を利用して例えば夏場の昼限定で上記の上限周波数を制限を実行すれば、マシンを停止することなくかなりの節電が可能であることがわかります。

※追記 消費電力「量」について少し考察を行いました 
CPU周波数上限の制御による消費電力「量」削減