2004-08-29 8時間/晴れ

今日はパーティーの日

近くのホテルでランチパーティー。 ちょっと優雅なホテルのご飯を堪能してくるですぅ。

で、朝食は残っていたオニオンスープをあっためてすすっておいてます。

夏休み最終日

やろうと思ってたことの大半はできずにいたのでした。折込済みなんですけど悔しいorz

百合キュアないし

なんかオリンピックの総集編みたいなことやってる...

火気厳禁

ボトルに書いてあるでしょう。

CPUクロックの動的調整

ACPIとsysfs*1をあわせると出現するのが、cpufreqという機能です。これはディレクトリとしては/sys/device/system/cpu/cpu0/cpufreq(cpu0の部分はSMP構成であれば多分複数出ます)が該当し、この中にはいくつかあります。個人的に解析したものなので不正確だとは思いますが、こんな感じで使えるものがあります(読み書きには一部管理者権限が必要です)。

cpuinfo_cur_freq
現在の周波数(Hz)
scaling_driver
CPU周波数コントロールのための仕組み名(SpeedStepやlonghaulなどマザーやCPUに依存)
scaling_available_frequencies

実際に設定される周波数一覧。ちなみにこのサーバ(VIA C3(EZLA) 800MHz)では以下のようになってます。

% cat scaling_available_frequencies
399000 532000 465000 598000 731000 798000 665000
scaling_available_governors

周波数制御のために用意されているタイプ名(それをgovernorと称してる模様)、カーネルで用意されてるものとして今判明してるのは、

  • とにかく最高周波数でgoの"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_freq
CPU周波数の上限・下限。実際に設定できる値はscaling_available_frequenciesしかないのであまり意味なさげ?
scaling_setspeed
userspace 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で走らせるようにすればその時の負荷具合に応じた変更が可能です。ちなみに今回の設定は

  • 1.25以下なら400MHz(最低)
  • 1.5以下なら500MHz
  • 2.0以下なら600MHz
  • 2.5以下なら700MHz
  • それ以上なら800MHz(最高)

としてます。閾値の調整は必要な気もするけど、当分はこれでやってみます。 なお、常時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  Linux 2.6以降に新設された、デバイスを動的に操作するための仕組みを提供する疑似ファイルシステム

*2  負荷のかかり具合を示すバロメータみたいなもの。

肉団子の仕込み

実は鷄と豚を逆に買っていました(笑)

それでも作って軽く焼いて冷凍庫へ。私の作る肉団子は通常のよりけっこう大きい*1ので、一回に使うのは3〜5個あればよし。今回は結果的に16個できたので、3〜5回分ということだな。

*1  トースターの大きさ以上に作れないため、くっつかずにおさまる範囲で作ります、すると一個あたりがけっこう大きくなる

シャワー

そろそろおでかけ準備ですね。シャワー浴びて体をあらっておかないと...

ホテルのランチ

うぉー、安く見えるけど、食材はやっぱりそれなりのものを使ってる。 ワインはなかなか美味しいし、チーズがシンプルながら非常にいい感じ、モッツァレラとトマトの合わせ具合が見事。ローストビーフも美味しかったし...

その場にいた方といろいろ20人ほど(酒のみつつだったので実はあまり覚えてない)と話をしたと思うのですが、シンプルながら美味しいこういう料理は楽しいとのことでしたわ。

たまたまだったのですが、島根の方(仕事の都合でここに来ていたらしい)にもおあいできました。島根といえば玉造温泉。玉造温泉といえばmatzさんですよmatzさん。当人は「島根といってもどことか思いだせずにいる方がなかなかいなくて、うれしい」とのお返事をいただけました(笑)

戻り際に2つの店で確認したけど

「まんがライフMOMO」10月号発見できずorz

晩御飯

帰宅して、しばらくのんびりしていましたが、おなかも当然空くわけで。

今日は、帰り道にかってきておいた、牛+松茸丼(レトルト)というものを出してみました。牛丼風の味付けに、ごぼうと松茸が入っているという不思議なもの。

松茸はせいぜい二切れ程度でしたね、味はちょと濃いかな。

ネットカフェにいきたくて指を切断

ええっと、言っていいですか?こいつバカァ?