2014年6月27日金曜日

CPU周波数制御(powerd)

 いつのころからか、「CPU 周波数の計測モニタ」を動かすと、「CPU周波数の計測がサポートされていません」とメッセージがでるようになった。おかしいなぁ。FreeBSD 8.3のころはちゃんと「sysctl -a dev.cpu.0.freq」でCPU周波数が取得できていた記憶があるのだが。
 なぜだろう?
 わけもわからず、現状、問題はなかったので放っておいた。

 ところがこのところ「ちょまど問題」でCPU100%状態で動かしまくっていたせいで、三回も熱暴走してしまった——SSDのRead Errorが起きている。熱でSSDがおかしくなっているのだろう。こんなことをくりかえしていたらSSDがいずれ壊れてしまう。
 去年の夏も筐体が熱くなって往生したのだが、そのときの対応方法——卓上扇風機で風を当てるという手もだめ。
 どんどん熱くなる筐体に茫然としていたのだが、ふと「CPU 周波数の計測モニタ」を立ち上げて周波数を1GHzに抑えたら発熱が抑えられた。
 ——この手か!
 次の瞬間、気づいた。あれ、CPU周波数が認識されている?
 たしかに「sysctl -a dev.cpu.0.freq」で現在のCPU周波数が取得できるようになっている。
 でもいつの間に取得できるようになったんだろう?

 取得できるようになったわけではなかった。
 その証拠にrebootすると、CPU周波数は取得できなくなり、当然、1GHzに抑えるなんてこともできなくなっていた。
 なぜ?

dmesg | grep -E "^(est|powernow)"
est0: <Enhanced SpeedStep Frequency Control> on cpu0
est: CPU supports Enhanced Speedstep, but is not recognized.
est: cpu_vendor GenuineIntel, msr 6130a2c06000613

 必要だと思われるカーネルモジュールをロードしたりしたのだが、結果は同じ。だいたいいつの間にかに取得できるようになっているということは必要なモジュールはすでにロードされているということだ。了解していたけれど、試さずにはいられなかった。
 急にCPU周波数が取得されるようになったきっかけを探る。
 バッテリー起動のときか? それとも電源のときか? 経過時間か?
 タイミングとは思えないほど、確実に「CPU周波数の計測がサポートされていません」のメッセージはでた——ふと、気づいた。
 ——もしかしたらサスペンド?
 ビンゴだった。
 サスペンドから復帰すると、周波数が取得できるようになっている(「CPU 周波数の計測モニタ」は再起動する必要があるが)。

 事、そこまで至り、ようやくBIOSが原因だ、と気づいた。BIOSの設定——以前、動いていたのですっかり失念していた。
 案の定、POWERマネージメントがらみの設定がひとつ、オフになっていた。そこで思い出した。
 そうだ。バッテリー駆動でもフルに動くように、とこの値、オフにしたんだった……orz。

 FreeBSDには「powerd」というsystem power control utilityがある。
 CPUが使われてないとき、周波数を自動的に低くしてくれるのだが、CPU周波数を取得できるようになったということは、これが使える。昔、使ってみたときはバッテリー使用時、粘るように重くなったのでオフにしていたのだが、今回、試してみると、そんなことはなかった。
 これは「powerd_enable="YES"」にすべきだな。
 バッテリー駆動時、電池が保つようになるのではないだろうか。
 ただ、CPU100%の作業の時の発熱を抑えるようなことには不向きみたいだ。フルのCPU周波数で動作してしまうから——そんな時はpowerdをオフにして(/etc/rc.d/powerd stop)、「CPU 周波数の計測モニタ」で周波数を低い値に設定するしかないんだろうなぁ。