CPUのクロック数調整による省電力1

Linuxカーネルのcpufreqの機能を用いてCPUのクロック数を調整することで省電力化を目指す.
OSはUbuntu11.10でCPUはCorei7-2600Kを搭載した計算機で実践してみた.

まずはcpufreqまわりの設定から.
以下のコマンドで必要なパッケージをインストール.

$sudo apt-get install cpufrequtils cpufreqd
まずは基本的な情報を見てみる.
$cpufreq-info
によって各CPUの情報が確認できる.
出力例は以下.
(CPU 0の情報)
1:analyzing CPU 0:
2: driver: acpi-cpufreq
3: CPUs which run at the same hardware frequency: 0 1 2 3 4 5 6 7
4: CPUs which need to have their frequency coordinated by software: 0
5: maximum transition latency: 10.0 us.
6: hardware limits: 1.60 GHz - 3.40 GHz
7: available frequency steps: 3.40 GHz, 3.40 GHz, 3.20 GHz, 3.00 GHz, 2.80 GHz, 2.60 GHz, 2.40 GHz, 2.20 GHz, 2.00 GHz, 1.80 GHz, 1.60 GHz
8: available cpufreq governors: conservative, ondemand, userspace, powersave, performance
9: current policy: frequency should be within 3.40 GHz and 3.40 GHz.
10: The governor "ondemand" may decide which speed to use
11: within this range.
12: current CPU frequency is 3.40 GHz.
13: cpufreq stats: 3.40 GHz:100.00%, 3.40 GHz:0.00%, 3.20 GHz:0.00%, 3.00 GHz:0.00%, 2.80 GHz:0.00%, 2.60 GHz:0.00%, 2.40 GHz:0.00%, 2.20 GHz:0.00%, 2.00 GHz:0.00%, 1.80 GHz:0.00%, 1.60 GHz:0.00% (5)

ここではまず出力例の8行目注目.
governors?...これはCPUの動作モードと捕らえる.
つまり8行目には設定が可能なCPUの動作モードが記述されている.
ここではconservative, ondemand, userspace, powersave, performanceと5つの動作モードがあることが分かる.
ちなみに現在の動作モードは10行目に書かれていてondemandであることも確認できる.

この動作モードによりクロック数の制御方法が変わってくるので重要.
各モードについてはこんな感じ.

  • performance

常にCPUの変動範囲の最大値のクロック数で動作

  • powersave

常にCPUの変動範囲の最小値のクロック数で動作

  • ondemand

負荷(使用率)によりCPUのクロック数を変化させながら動作

  • conservative

負荷(使用率)によりCPUのクロック数を変化させながら動作(ondemandよりもクロックの変化がゆるやか)

  • userspace

手動でクロック数を変化させると移行するモード

動作モードを理解したところで,動作モードの変更を行ってみる.
変更は以下のコマンド(ここではperformanceに変更).

$sudo cpufreq-set -c 0 -g performance
cpufreq-setによりgオプションによって動作モードを指定する.
なおcオプションは変更を施すCPUの番号を指定する.

次に注目するのは出力例の7行目.
ここでは設定可能なCPUのクロック数が羅列されている.
ここでは3.40GHz, 3.20GHz, 3.00GHz, 2.80GHz, 2.60GHz, 2.40Hz, 2.20GHz, 2.00GHz, 1.80GHz, 1.60GHzとかなり多いステップで変更が可能となっている.
ちなみに現在のクロック数は出力例の12行目の3.40GHz.
つまり,負荷が少ないときにクロック数を減らすことが出来れば1/2以下にもクロック数を抑えることが出来き,それだけ電力消費も抑えられる.

しかし,9行目をみると
"frequency should be within 3.40 GHz and 3.40 GHz."...
周波数は3.40GHzから3.40GHzの間じゃないといけない!って全然ダメじゃん!

この範囲を変更しないと動作モードを変更しても結局3.40GHzから変わらない.
ということで周波数の範囲を有意義に使えるように設定.

$sudo cpufreq-set -c 0 --min 1.60GHz --max 3.40GHz
これによって先ほどの値が1.60GHzから3.40GHz変更されていればOK.
同時にCPUの動作モードに対して現在のクロック数も変化しているはず.

またユーザが自ら周波数を設定してあげることも可能(もちろん設定できる範囲内の設定可能な周波数に設定).
以下のコマンドではCPU0の周波数を2.80GHzに設定する.

$sudo cpufreq-set -c 0 -f 2.80GHz
周波数をユーザが設定したことにより,この設定の後にCPUの動作モードがuserspaceになっている.
解除するには新たに動作モードを設定すれば良い.


とりあえず今回はここまで.
続きはCPUのクロック数調整による省電力2 - 日進月歩