やろうと思ってたことの大半はできずにいたのでした。折込済みなんですけど悔しいorz
なんかオリンピックの総集編みたいなことやってる...
ACPIとsysfs*1をあわせると出現するのが、cpufreqという機能です。これはディレクトリとしては/sys/device/system/cpu/cpu0/cpufreq(cpu0の部分はSMP構成であれば多分複数出ます)が該当し、この中にはいくつかあります。個人的に解析したものなので不正確だとは思いますが、こんな感じで使えるものがあります(読み書きには一部管理者権限が必要です)。
cpuinfo_cur_freqscaling_driverscaling_available_frequencies実際に設定される周波数一覧。ちなみにこのサーバ(VIA C3(EZLA) 800MHz)では以下のようになってます。
% cat scaling_available_frequencies 399000 532000 465000 598000 731000 798000 665000
scaling_available_governors周波数制御のために用意されているタイプ名(それをgovernorと称してる模様)、カーネルで用意されてるものとして今判明してるのは、
performance"powersave"userspace"があります。
scaling_governor周波数制御のgovernorを設定するための窓口、書き込むことで有効になります。例としては、
yuzu:# echo performance > scaling_governor yuzu:# cat cpuinfo_cur_freq 798000 ← 800MHzなんで一応このあたり yuzu:# echo powersave > scaling_governor yuzu:# cat cpuinfo_cur_freq 399000 ← 下げられるのはここまでみたい
cpuinfo_max_freqおよびcpuinfo_min_freqscaling_available_frequenciesしかないのであまり意味なさげ?
scaling_setspeeduserspace governorに設定した場合に出てくる特殊ファイルで、ここに周波数を書き込むことで現在の周波数を変更できます、ただし近い「使える」値になりますし、上限・下限を越える値は設定できません(上限・下限にあわせられるだけだろうけど、どうなるかわからないのでやらないこと、私も未確認です)。
これらの仕組みを使えば、CPU負荷の低い時は動作周波数を下げて電気消費量を下げることができます。うちのはファンレスなので関係ないのですが、もう少し「わかる人」が調査すればファンコントロールも可能かもしれませんね。
ということでデッチアゲでこんなスクリプトを書いてみました。10秒おきに現在のloadavg*2を確認し、その値に応じて動作クロックを変更させます。
#!/bin/sh
cpufreq="/sys/devices/system/cpu/cpu0/cpufreq"
scale="$cpufreq/scaling_setspeed"
governor="$cpufreq/scaling_governor"
mode="userspace"
wait="10" # update wait
# set speed(cpu freq)
setspeed () {
echo `expr $1 \* 1000` > $scale
}
# check current loadavg and set speed
update () {
AVG=`cat /proc/loadavg | awk '{print $1}'`
if [ `expr $AVG \< 1.25` = 1 ]; then
setspeed 400
elif [ `expr $AVG \< 1.5` = 1 ]; then
setspeed 500
elif [ `expr $AVG \< 2.0` = 1 ]; then
setspeed 600
elif [ `expr $AVG \< 2.5` = 1 ]; then
setspeed 700
else
setspeed 800
fi
}
# -------------------------------
# initialize
if [ ! -f $scale ]; then
echo $mode > $governor
if [ ! -f $scale ]; then
echo your kernel is not configured to use userspace governor. > /dev/stderr
exit 1
fi
fi
while true; do
update
sleep $wait
done
これをdaemontoolsで走らせるようにすればその時の負荷具合に応じた変更が可能です。ちなみに今回の設定は
としてます。閾値の調整は必要な気もするけど、当分はこれでやってみます。
なお、常時RC5-72の解析プログラム(dnetc)が動いているため、1を下まわることはまずありません。
気になるのは、このあたりってACPIのマネージャ(acpid)なんかがやってないのかな?ということ。ま、このあたりは自己満足ということで(ぉぃ)
IRC某所より神が興味深いことを教えてくださいました。
> 10:15 (Hiro_zaur) 何かXの動作が引っ掛かるような感じになりません?>cpufreq > 10:15 (guha) Xは動かしてないのでわかりませんw > 10:15 (guha) 鯖だし > 10:15 (guha) ディスプレイつけてないし > 10:16 (Hiro_zaur) なんか定期的に結構負荷かかってるような > 10:16 (guha) govornerを自作すれば、カーネル内部で動的に変更できるんだろうね > 10:16 (guha) うーん、そこまではわかりませんね > 10:17 (Hiro_zaur) ちなみにPentium-M 1.1Gとかで試用
とのことなので、X使ってる方はより詳細なチェックが必要かもしれません。
実は鷄と豚を逆に買っていました(笑)
それでも作って軽く焼いて冷凍庫へ。私の作る肉団子は通常のよりけっこう大きい*1ので、一回に使うのは3〜5個あればよし。今回は結果的に16個できたので、3〜5回分ということだな。
*1 トースターの大きさ以上に作れないため、くっつかずにおさまる範囲で作ります、すると一個あたりがけっこう大きくなる
そろそろおでかけ準備ですね。シャワー浴びて体をあらっておかないと...
うぉー、安く見えるけど、食材はやっぱりそれなりのものを使ってる。 ワインはなかなか美味しいし、チーズがシンプルながら非常にいい感じ、モッツァレラとトマトの合わせ具合が見事。ローストビーフも美味しかったし...
その場にいた方といろいろ20人ほど(酒のみつつだったので実はあまり覚えてない)と話をしたと思うのですが、シンプルながら美味しいこういう料理は楽しいとのことでしたわ。
たまたまだったのですが、島根の方(仕事の都合でここに来ていたらしい)にもおあいできました。島根といえば玉造温泉。玉造温泉といえばmatzさんですよmatzさん。当人は「島根といってもどことか思いだせずにいる方がなかなかいなくて、うれしい」とのお返事をいただけました(笑)
「まんがライフMOMO」10月号発見できずorz
帰宅して、しばらくのんびりしていましたが、おなかも当然空くわけで。
今日は、帰り道にかってきておいた、牛+松茸丼(レトルト)というものを出してみました。牛丼風の味付けに、ごぼうと松茸が入っているという不思議なもの。
松茸はせいぜい二切れ程度でしたね、味はちょと濃いかな。
ええっと、言っていいですか?こいつバカァ?