monoの開発ブログ

CPUの省電力機能に注意

最近のCPUでは、負荷に応じてクロック周波数を変動させることが当たり前になっています。手元のCore i7 4770だと、最大クロック周波数は3.4GHzですが、アイドル時にはなんと800MHzまで降下してくれます。

普通に使う上では非常にありがたい機能なのですが、とあるシステムのベンチマークを取っている時に困ったことがありました。いろいろと設定を弄って試す中で、あり得ないレベルで性能が下がることがあったのです。原因は今回のお題である省電力機能によってクロック周波数が下がっていたことだったわけですが、クロック周波数を最大に固定するかどうかだけで性能が4倍近く違ってくるというのは完全に予想外でした。

CPUを回すだけでなくI/Oやロックが絡んでくるような場合だと、CPUにうまく負荷を掛けきれず、クロック周波数がきちんと上がってくれないこともあるようです。省電力機能に阻まれてうまく動かないことまで含めたベンチマークであればそれでも問題ありませんが、とにかく全力で回した時の性能を測りたいのであれば、クロック周波数を固定しておくことをオススメします。

クロック周波数を固定するためには、CPUのスケーリングgovernorというパラメータを変更します。これをperformanceに設定すると、常に最大周波数で動作するようになります。設定には、cpupowerというコマンドを使うのが便利です。Arch LinuxとCentOSにはそのまんまな名前のパッケージがあるので、それをインストールした上で以下のコマンドを実行すれば、スケーリングgovernorを変更できます。

sudo cpupower frequency-set -g performance

設定の確認は以下のように行います。

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

ちなみに、スケーリングgovernorの値は初期状態だとSandy Bridge以降のIntel CPUではpowersave、それ以外の環境ではondemandになっているようです。ondemandは負荷が高くなった場合にクロック周波数を上げ、アイドル状態になったら下げるという一般的な挙動です。powersaveはドキュメントには常に最小周波数になると書かれているのですが、手元ではondemandと同じような挙動をしており、よくわかりませんでした。