コンピュータ/ソフトウェア関連Tips

MuninでCPU温度とCPU周波数を表示する(FreeBSD版)

作成日: Aug 3, 2014
カテゴリー: FreeBSD タグ: FreeBSD

MuninでCPU温度とCPU周波数を表示するようにしたときのメモです。OSはFreeBSD 10.0 RELEASE。マシンは、(1)HP MicroServer N40L(CPU: AMD Turion II NEO N40Lプロセッサー、クロック周波数: 1.5GHz)と、(2)NEC Express 5800/S70 タイプSD(CPU: Intel Celeron 440、クロック周波数: 2.0GHz)の2種類です。HP MicroServer N40Lについては、FreeBSD 10.2 RELEASEでも、同じ手順でインストールできました。

この記事は、FreeBSDセットアップメモの一部です。

CPU温度を取得できるかの確認

まず、CPU温度を取得できるか確認してみます。

$ sysctl dev.cpu

結果には、

dev.cpu.0.freq: 100

はあるものの、temperatureが含まれていません。

http://d.hatena.ne.jp/sillywalk7/20120503を参考にして、カーネルモジュールを一時的に読み込んで、再チェックしてみます。

amdtemp(AMD CPUの場合)の読み込み

AMD CPUの場合は、amdtempを使用します。

$ sudo kldload amdtemp
$ sysctl dev.cpu|grep temperature
dev.cpu.0.temperature: 46.1C
dev.cpu.1.temperature: 46.1C

温度が表示されるようになりました。

/boot/loader.confに、

amdtemp_load="YES"

を追加して、リブートします。(どのタイミングでリブートするかは適宜)

coretemp(Intel CPUの場合)の読み込み

Intel CPUの場合は、coretempを使用します。

$ sudo kldload coretemp
$ sysctl dev.cpu|grep temperature
dev.cpu.0.temperature: 48.0C

温度が表示されるようになりました。

/boot/loader.confに、

coretemp_load="YES"

を追加して、リブートします。(どのタイミングでリブートするかは適宜)

Muninプラグインの設定

$ munin-node-configure --suggest

を実行してみます。

Plugin                     | Used | Suggestions
------                     | ---- | -----------
dev_cpu_                   | no   | no [function not supported by kernel]

実際は、このあと悪戦苦闘(後述)しているのですが、結果的には、シンボリックリンクを設定しました。

まず、CPU温度取得プラグインのシンボリックリンク設定と、プラグインの実行テスト。

$ sudo ln -s /usr/local/share/munin/plugins/dev_cpu_ /usr/local/etc/munin/plugins/dev_cpu_temperature
$ sudo munin-run dev_cpu_temperature
CPU0.value 46.3
CPU1.value 46.3

上記は、HP MicroServer N40Lの場合。NEC Express 5800/S70 タイプSDの場合は、以下のようになりました。

CPU0.value 49.0

次に、CPU周波数取得プラグインのシンボリックリンク設定と、プラグインの実行テスト。

$ sudo ln -s /usr/local/share/munin/plugins/dev_cpu_ /usr/local/etc/munin/plugins/dev_cpu_freq
$ sudo munin-run dev_cpu_freq
CPU0.value 800

tempratureとfreqは、プラグインのソースを読んで判断したのですが、あとになって、http://d.hatena.ne.jp/over80/20080701/1214926377 を拝見して、プラグインにsuggestオプションをつけて実行すれば分かることを知りました。

$ /usr/local/share/munin/plugins/dev_cpu_ suggest

freq
temperature

プラグインのソースコードの修正

筆者の環境では、CPU温度グラフの縦軸キャプションが文字化けしました。

全然スマートじゃない方法なのですが、コードを修正します。

$ cd /usr/local/share/munin/plugins
$ sudo cp dev_cpu_ dev_cpu_.original
$ sudo vi dev_cpu_
echo "graph_vlabel Core temperature in °C"
↓
echo "graph_vlabel Degrees Celsius"

Munin-nodeの再起動

$ sudo service munin-node restart
Stopping munin_node.
Waiting for PIDS: 818.
Starting munin_node.

5分間待つと「CPU Core Temperature」と「CPU Frequency」というグラフが表示されます。

グラフは表示されるのですが、munin-node-configure –suggestの結果は、

$ munin-node-configure --suggest
Plugin                     | Used | Suggestions
------                     | ---- | -----------
dev_cpu_                   | yes  | no [function not supported by kernel]

悪戦苦闘の記録

http://d.hatena.ne.jp/littlebuddha/20120510/1336631380によれば、 > 古い記述だと「ln」コマンドでひとつひとつのプラグインからシムリンクを張って利用するように書かれているが、今はコマンドで利用できるプラグインの一覧、設定が必要なプラグインなどを表示して、各プラグインの設定をして、稼働させるところまでやれるようになっている。

とのこと。この記事は2012年5月に書かれたものです。自分の設定では、何が間違っているのだろうか…と思い、少し調べてみました。

プラグインの実体は、

/usr/local/share/munin/plugins/dev_cpu_

です。その中身(抜粋)は、

#!/bin/sh

cpus() {
        sysctl -N dev.cpu | awk -F. '$4 == "'"$func"'" { print $3 }'
}

autoconf() {
        if [ -n "$cpus" ] ; then
                echo "yes"
                exit 0
        else
                echo "no (function not supported by kernel)"
                exit 0
        fi
}

self=$(basename $0)
func=${self##*_}

awkなんて、久しく使ってないなぁ~と懐かしみつつ調べたところ、「awk -F.」 は、「.」をフィールドセパレータにする設定。「basename $0」はシェル自身のファイル名。「${self##*_}」は初めて目にしたが、http://www.ne.jp/asahi/hishidama/home/tech/unix/sh.htmlを拝見したところ、

${NAME##接頭辞}
$NAMEから一致する最大部分の接頭辞を削除したものになる

とのことなので、funcの値は空(null)なのではないだろうか…。sysctl -N dev.cpuの実行結果は、以下のようになる。

$ sysctl -N dev.cpu
dev.cpu.%parent
dev.cpu.0.%desc
dev.cpu.0.%driver
dev.cpu.0.%location
dev.cpu.0.%pnpinfo
dev.cpu.0.%parent
dev.cpu.0.temperature
dev.cpu.0.freq
dev.cpu.0.freq_levels
dev.cpu.0.cx_supported
dev.cpu.0.cx_lowest
dev.cpu.0.cx_usage
dev.cpu.1.%desc
dev.cpu.1.%driver
dev.cpu.1.%location
dev.cpu.1.%pnpinfo
dev.cpu.1.%parent
dev.cpu.1.temperature
dev.cpu.1.cx_supported
dev.cpu.1.cx_lowest
dev.cpu.1.cx_usag

プラグインのファイル名が dev_cpu_のままでは、「if [ -n “$cpus” ]」が真になることは無いような気が…。

プラグインの実体の名前を、dev_cpu_ から、dev_cpu_temperature や dev_cpu_freq に変更すれば、munin-node-configure –suggest の結果が

Plugin                     | Used | Suggestions
------                     | ---- | -----------
dev_cpu_freq               | yes  | yes
dev_cpu_temperature        | yes  | yes

になってくれそうな気もするのだが、どうするのが正解なのか良く分からない。