lm_sensors + RRDTool + HotSaNIC によるシステム監視

マシンを24時間稼動させているとその状態が気になり始めます.特に,システムの温度などは直接故障につながるため大変気になります.そこで,Lm_sensors で温度の測定環境を,RRD TOOL でシステムの状態をグラフにします.HotSaNIC は RRD TOOL のフロントエンドとなります.インストールと設定に当たって Asus Terminator 活用メモを参考にしました.

Lm_sensors のインストール

Lm_sensors を動作させるためには,I2C モジュールも必要です.I2C モジュールは Lm_sensors と同じチームによって開発されています.2004/01/10 現在 2.8.2 が最新版です.注意すべきは 2.8.0 よりモジュールの大きな変更があってようで bttv ドライバとの共存が難しいようです.

 
Lm_sensors は I2C のライブラリを使うため先に I2C をインストールしなければならない
# wget http://secure.netroedge.com/~lm78/archive/i2c-2.8.2.tar.gz
# tar xvzf i2c-2.8.2.tar.gz
# cd i2c-2.8.2
# make
# make install
 
# wget http://secure.netroedge.com/~lm78/archive/lm_sensors-2.8.2.tar.gz
# tar lm_sensors-2.8.2.tar.gz
# cd lm_sensors-2.8.2
# make
# make install
ld.so.conf に /usr/local/lib がなければ追加しておく

Lm_sensors のコンフィグ

sensors-detect コマンドでセンサの検出を行います.検出の結果は,/etc/sysconfig/lm_sensors に出力されます.

 
# /usr/local/sbin/sensors-detect

This program will help you determine which I2C/SMBus modules you need to
load to use lm_sensors most effectively. You need to have i2c and
lm_sensors installed before running this program.
Also, you need to be `root', or at least have access to the /dev/i2c*
files, for most things.
If you have patched your kernel and have some drivers built in, you can
safely answer NO if asked to load some modules. In this case, things may
seem a bit confusing, but they will still work.

 We can start with probing for (PCI) I2C or SMBus adapters.
 You do not need any special privileges for this.
 Do you want to probe now? (YES/no):
(snip)

sensors-detect コマンドでは以下のように検出されると思います.

/etc/sysconfig/lm_sensors
(snip)
MODULE_0=i2c-sis630
MODULE_1=i2c-isa
MODULE_2=eeprom
MODULE_3=sis5595
MODULE_4=it87

これは誤った検出で,sis5595 モジュールは不要です.そこで以下のように修正します.

/etc/sysconfig/lm_sensors
(snip)
MODULE_0=i2c-sis630
MODULE_1=i2c-isa
MODULE_2=eeprom
MODULE_3=it87

Terminator TU は IT8705F で温度を検出します.Lm_sensors の it87 モジュールに関するドキュメント(doc/chips/it87)を読むと,各々のセンサがサーミスタであるかダイオードであるかをモジュールオプションで指定しなければなりません.

doc/chips/it87 より抜粋
        sensor1         sensor2         sensor3         value
        -------         -------         -------         -----
        diode           diode           diode           0x07
        diode           diode           thermistor      0x23
        diode           thermistor      diode           0x15
        diode           thermistor      thermistor      0x31
        thermistor      diode           diode           0x0e
        thermistor      diode           thermistor      0x2a   ** default
        thermistor      thermistor      diode           0x1c
        thermistor      thermistor      thermistor      0x38

2004/03/24 Asus Terminator 活用メモの Webmaster の T.Adachi さんからメールが来ました.やはり,1つ目のセンサが CPU,2つ目のセンサが電源温度で正しいようです.
Asus Terminator 活用メモ によりますと,/etc/sensors.conf に以下のような記述があるので 0x31 が正しいようですが,

/etc/sensors.conf
# The following is for the Inside Technologies 786LCD which uses either a
# IT8705F or a SIS950 for monitoring with the SIS630.
# You will need to load the it87 module as follows to select the correct
# temperature sensor type.
# modprobe it87 temp_type=0x31
# The sensors-detect program reports lm78 and a sis5595 and lists the it87 as
# a misdetect.  Don't do the modprobe for the lm78 or sis5595 as suggested.
#
# delete or comment out above it87 section and uncomment the following.

これを簡単に訳すと,「以下は,モニタリングするために SIS630 と共に IT8705 もしくは SIS950 を使う Inside Technologies 786LCD のものである.あなたは 以下の正しい温度センサータイプを選ぶことにより it87 モジュールを読み込む必要がある.modprobe it87 temp_type=0x31」となっています.つまり,この記述は 786LCD のものであって Termantor TU とは関係ないということです.

では,一体どうすればいいでしょうか.ここからはかなりあやふやな私なりの実証ですので間違っている可能性が大いにあります.まず,温度を測定する IT8705 ですが,データシートによると3つまでの温度が検出できます.また,CPUの内部温度を測定しようというサイトによりますと,90番ビンが基準電圧,89番ピンがセンサ0,88番ビンがセンサ1,87番ピンがセンサ2となっています.Terminator TU がどうなっているかというと,素人自分の私が見る限りでは,88番と87番が未結線で89番ピンが CPU へ結線されているようでした.では,MB の温度は何が測っているのでしょうか.Terminaor TU の説明書を読むと,P37あたりに温度,電圧,ファンの監視に Asus Mozart1 を使用しているとの記述があります.恐らく,MB はこれを使って測定しているのではないかと考えられます.現状では,Morzart1 のデータシートは公開されていないためまったく情報がありません.これらをまとめると,現在の Lm_sensors + I2C では,CPU の温度しか測定できないということです.また,CPU の温度は CPU 内部のサーマルダイオードを使っているので,モジュールオプションは0x07,0x23,0x15,0x31のどれでもいいことになります.おそらく,Asus Terminator 活用メモのまま設定をすると,BIOS と一致しないように思われます.

これを見ると,単に CPU と MB(電源)温度が逆なだけなのかもしれません.すなわち,88番ピンもどこかで結線されているのかもしれません.よって,ここでは,it87 のオプションを,temp_type=0x31,センサ0を CPU,センサ1を MB(電源)として扱います.

it87 モジュールにオプション temp_type=0x31 を加えるには,/etc/modules.conf に options it87 temp_type=0x31 を記述します.

/etc/modules.conf
options it87 temp_type=0x31

センサの割り当て設定は,/etc/sensors.conf にあります.IT8705 の温度とファンに関する設定は1400行目辺りにあります.

/etc/sensors.conf
# Temperature
#
# Important - if your temperature readings are completely whacky
# you probably need to change the sensor type. This must be done
# with 'modprobe it87 temp_type=0xXX', you can't fix it in this file.
# See ../doc/chips/it87 for details and valid 'XX' values!!!
#
# temp1 を CPU temp2 を MB(電源)として割り当てます.
# temp3 は使用されていないので ignore にします
# temp*_over と tmep*_hyst は温度の上限値と下限値を設定しますが,
# ここではあまり関係ないのでコメントアウトします
#    label temp1       "M/B Temp"
#    set   temp1_over  40
#    set   temp1_hyst  20
    label temp1       "CPU Temp"
#    label temp2       "CPU Temp"
#    set   temp2_over  45
#    set   temp2_hyst  25
    label temp2       "M/B Temp"
    ignore temp3
#    label temp3       "Temp3"
#    set   temp3_over  45
#    set   temp3_hyst  25

# 以下の記述は関係ありません
# The A7V8X-X has temperatures inverted, and needs a conversion for
# CPU temp. Thanks to Preben Randhol for the formula.
#   label temp1       "CPU Temp"
#   label temp2       "M/B Temp"
#   compute temp1     (-15.096+1.4893*@), (@+15.096)/1.4893

# ファンはほぼ正しい値が得られないのですべて ignore にします
# Fans
#    set fan1_min 0
#    set fan2_min 3000
   ignore fan1
   ignore fan2
   ignore fan3
#    set fan3_min 3000

つぎに,モジュール群を読み込むテストをします.Lm_sensors には init スクリプトが用意されているのでそれを利用します.

 
# ./prog/init/lm_sensors.init start
Starting up sensors: starting module __i2c-sis630__
starting module __i2c-isa__
starting module __eeprom__
starting module __it87__
                                                           [  OK  ]

もしエラーが出るのなら,/etc/ld.so.conf に /usr/local/lib を追加して ldconfig を実行したり,depmod -av を実行してみてください.問題なければ,init スクリプトを /etc/init.d/ に放り込んで次回起動時に自動実行できるようにしましょう.

 
# cp prog/init/lm_sensors.init /etc/init.d/lm_sensors
# chkconfig --add lm_sensors
# chkconfig --level 2345 lm_sensors on

RRD TOOL のインストール

Lm_sensor の話で長くなりましたが,次は RRD TOOL です.当サーバでは環境変数を en_US にしていますので,別段日本語版を使用しなくてもいいのですが,とりあえず日本化されたものを使用します.RRD TOOL のサイトは, http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/ で,アーカイブの日本ミラーは ftp://ftp.ayamura.org/pub/rrdtool/ です,日本語化されたものは http://www.bigfield.com/~hiroshi/rrdtoolja.html にあります.

 
# wget http://www.bigfield.com/~hiroshi/software/SRPMS/rrdtool-1.0.40-1.7.3j.src.rpm
# rpm --rebuild rrdtool-1.0.40-1.7.3j.src.rpm
# cp /usr/src/redhat/RPMS/i386/rrdtool* .
# 余談ですが,なぜか 1.7.1 が生成されます
# rpm -ivh rrdtool-1.0.40-1.7.1j.i368.rpm rrdtool-devel-1.0.40-1.7.1j.i386.rpm

RRD TOOL の設定はそのフロントエンドである HotSaNIC に任せるので何もしなくても OK です.

HotSaNIC のインストールと設定

次に HotSaNIC をインストールします.HotSaNIC は perl スクリプトなので展開して適当なディレクトリに放り込むだけで OK です.また,画像の変換などに ImageMagick が必要です.2004/01/10 現在 0.4 が安定版です.HotSaNIC のサイトは, http://hotsanic.sourceforge.net/ です.

 
HotSaNIC のダウンロードは sourcdforge なので好きなところから落とす
# wget http://keihanna.dl.sourceforge.net/sourceforge/hotsanic/HotSaNIC-0.4.0.tgz
# tar xvzf HotSaNIC-0.4.0.tgz
# cp -r HotSaNIC /usr/local

HotSaNIC の設定

全体の設定はスクリプトで対話的に可能です.HotSaNIC は,diskio(ディスクの読み書き),dnet( http://www.distributed.net/ の RC5 や OGR の結果),networks(iptables), part(ディスク使用容量) ,ping(ping への応答), sensors(各種センサ), system(プロセス,CPU 使用率,ロード,メモリ使用量,スワップ使用量,ユーザログイン状況),traffic(eth0 とか ppp0 のトラフィック),worms(Apache のログに記録された,ワームのアタック数)を監視できます.問うサーバでは diskio networks part sensors system traffic を監視しようと思いましたが,networks を使うと,微妙にネットワークのレスポンスが悪くなったため,後でやめました.ほぼ Yes/No の質問なので簡単に完了するでしょう.しかしまだこのままではうまく監視できません.そのままでは未設定のところがあるためです.

/usr/local/HotSaNIC/settings
# RRD TOOL のバイナリのありかを指定
BINPATH="/usr/bin"
# 出力先を指定
WEBDIR="/home/httpd/html/rrdtool"
# 画像フォーマットを指定(GIF は嫌です)
IMAGEFORMAT="png"
# 画像を拡大縮小する conbert コマンドのありか
CONVERTPATH="/usr/X11R6/bin/convert"

sensors と diskio の項はそのままでは何も設定されないので設定が必要です.どう設定すべきかは,各々の setting ファイルに詳しく記述されています.

HotSaNIC/data-diskio/settings
DEV=3_0,hda
HotSaNIC/data-sensors/
# temp1 の後の項は間にスペースがあるとエラーが出るようです
SENSOR=/proc/sys/dev/sensors/it87-isa-0290/temp1,cpu_temp,CPU temp,3,1,0,C
SENSOR=/proc/sys/dev/sensors/it87-isa-0290/temp2,power_supply_temp,JTPWR temp,3,1,0,C

次に,HotSaNIC のインデックスページを作り,手動で RRDtool を実行し,一度データを取得します.

 
/usr/local/HotSaNIC/makeindes.pl
/usr/local/HotSaNIC/rrdtimer -i

実行後,HotSaNIC で指定したページを見ると,ページはあるもののグラフの画像がない状態だと思われます.そこでデーモンモードで起動してグラフを自動更新します.

 
/usr/local/HotSaNIC/rrdgraph start

もう一度ページを見ると恐らく,各々のグラフは出来ているもののインデックスページのグラフが出来ていません.とりあえず確認ということで強制的に作成します.

 
# /usr/local/HotSaNIC/diagrams
# /usr/local/HotSaNIC/convert.pl

ここでエラーがなければ設定完了です.

HotSaNIC(RRD TOOL)の自動起動

手製スクリプト(わざわざ作らなくても rrdgraph は実は init スクリプトだったりする).ポイントは lm_sensors よりも後に起動して先に終了するようにしておくことでしょうか.
RRD_TOOL-init

 
# cp RRD_TOOL-init /etc/init.d/RRD_TOOL
# chkdonfig --add RRD_TOOL
# chkconfig --level 2345 RRD_TOOL on