2015年11月23日月曜日

cpufreqにおけるondemand時での最大動作速度を指定する

恥の記録です。

前置きです。
CentOS5でHandBrakeで過去にmencoderでエンコードしたファイルをh265形式に一括変換するバッチを流して1日放置。

平均処理速度が1~2fpsしか出ていない。
・・・何かがおかしい。

こうして、自分の愚かさにまたもや向き合うこととなりました。

原因はcpufreqがondemandになっていて、ondemand時のcpu速度の上限が1.2GHzになっていたからです。

なぜ愚かかというと、以前仮想マシンの関係でクロックがコロコロ変わるとゲストOSの時計がひどく狂う問題があって、cpuspeedは停止設定にしていたのに、元に戻ってしまっている点と、HotSaNICの記録から、元に戻ったのは1年以上も前だったことが分かったことです。

仮想マシン上で動かしていたゲストOSはあるシステムの検証用に必要だっただけで、検証が済んだ後は起動していませんでしたから時計が狂うという点からは気づきませんでした。

重い日例、週末、月末バッチは、終了後に結果をメールで確認しますが、受信時刻を特に気にしたこともなく、ここからも気づけませんでした。

日常使う上でも、特に重い処理なんてでかいパッケージのmake作業くらいですし、時間がかかることは元からわかっていますから、まさかcpuの動作周波数が抑えられているとは考えつきませんでした。

以前のエンコードが遲くて気づかなかったのは、ぶっ壊れたサーバのCPUの上限周波数が1.6GHzだったので、1.2GHzとそう大して変わりがないので、これもやはり気づきませんでした。

今回の変換処理では変換記録をログに残すようにバッチを書いておいたので、処理時間を見てみると、最大8時間もかかっているのがあってびっくりしましたが、時刻を見ると日例と週末バッチが重なる時間帯だったのでこれは除外して、他を調べると、特に負荷がかかるはずがない時間帯の処理でも5時間半かかっています。

しかし、今回導入したTX1310 M1は2.7GHzのcpuを乗せています。
いくらなんでもオカシイだろう、とようやく気付いたのでした。

本当に自分は頭が悪いんだと思います。

で、/proc/cpuinfoを見てみると、cpu MHz : 1200.000 となっているじゃあありませんか。
こりゃあcpufreqだな、と、やっと見当がついたので
/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
を見てみると、しっかり1200000と表示されました。

そこで、/etc/sysconfig/cpuspeedを開いてみるとMAX_SPEEDに1200000が指定されていました。。。

ファイルの日付を見ると、最終更新日時が2008/03/20 14:09:24でした。
うーん、2008年・・・前代のExpress5800が2007年だったからCPU速度は1.6GHzなのになぜ1.2GHzを指定してあるのか、さっぱりわかりません。
それ以前も、壊れたサーバからHDDを乗せ換えてそのまま利用していますが、そもそも1.2GHzのCPUなんて使ったことないんですよねぇ。

どのタイミングでondemandになったかもわからないし、そもそもcpuspeedは起動しない設定にしてあったはずだし、謎の周波数が指定されているしでわけがわからないのですが、どれもこれも確かに自分でやった所業のはずなのにすっかり忘れている挙句に、cpuが遲いから調べることとなるという愚かさは我ながら救いようがありません。

さて、ほとんど前置きで書いてしまいましたが、本題です。

私の場合は愚かさによるものでしたが、CPUの性能にかかわらずにCPUの周波数を変更したい場合はあると思います。
  • 長時間CPU資源を占有するプロセスを起動する必要があるが、速度は求めていない場合
  • 温度が上がりすぎるのを抑えたい
  • 電気代の節約
  • 重いプロセスが走るはずがない時間帯に突発的にクロックが上がることを抑止したい
などなど、いろいろ考えられると思います。
そんな場合はcpufreqのondemandガバナで対応できます。
/sbin/lsmod して cpufreq_ondemand  が読み込まれていればondemandが有効になっています。
なっていない場合は/etc/sysconfig/cpuspeedで
GOVERNOR=
の行の右辺に別のガバナが指定してあると思いますので、デフォルト値がondemandなのでカラにしておくか、明示的にondemandと記述し、cpuspeedを再起動します。

上限周波数は直接/sys/devices/system/cpu/cpu*/cpufreq配下のファイルを書き換えてもいいです。
時間帯ごとにcronでスクリプトから直接制御するなどの用途ならこちらのほうが簡単かもしれません。
scaling_max_freqを書き換えるだけです。

手動の場合はコア数が増えると面倒ですからcpufreq-utilsパッケージを導入したほうがいいでしょう。cpufreq-set というコマンドがありますので、それを使用すれば簡単です。

デフォルト値として上限を設定しておきたい場合は/etc/sysconfig/cpuspeedファイルにMAX_SPEEDという左辺値がありますので、右辺にクロック数を指定します。
指定可能なクロック数のリストは
/sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies 
に記述されていますので、その中から選択します。
scaling_max_freqを直接書き換える場合も同様です。

ただ、ondemandは最低と最大の2値しかとらず、瞬間湯沸かし器のようなヤツですので、本来であればconservativeをガバナに指定したいところですが、CentOS5は対応前のカーネルなので使えません。

普段は上限にソコソコの値を指定しておき、本当にcpuパワーがほしい時だけ手動でガバナをperformanceに切り替えたほうが筋としてはいいのかもしれません。

・・・万が一、これと同様の考えで2008年にcpuspeedの設定を自分で書き換えたとしたら、それをずっと忘れているんだからやっぱり愚かとしか言えません。

以上、恥の記録とおまけでした。

0 件のコメント:

コメントを投稿