Linux日記: 2005年

サーバのモニタリング (2005.12.17)

サーバは席から離れたところで動き続けるものですから、CPU使用率とか温度、ファンの回転速度とかいろいろ監視したいものです。 Linuxでそういったことをする際には lm_sensors が定番で、この日記でもlm_sensorsでハードウェア・モニタで昔取り上げたことがあります。

今回使っているRHEL 3では lm_sensors は入ってますが、標準ではインストールされない kernel-unsupported パッケージを入れないと使えませんでした。 さて kernel-unsupported をインストールしてから、sensors-detect してみると、あれ? 対応チップが発見されませんでした。 どうやらDellのサーバはlm_sensorsではダメみたいです。 DellのLinuxサイトをみてみると、DellのOpenManage Server Administrator (OMSA)というソフトを使うか、IPMIを使えばモニタリングできるようです。

OpenManage ... は失敗

まずは OpenManage というソフトは初見だったので試してみることにしました。 サーバに付属していた4枚組のCDのうち、Installation and Server ManagementのCDを突っ込み、CDの /srvadmin/linux/supportscripts にある srvadmin-install.sh --express でインストール。 同じフォルダにある srvadmin-services.sh start でサービスが起動されます(もちろんRHELの起動スクリプトに登録されるので、次回ブート時以降は自動で起動されます)。

どうもこのソフトは全てLinuxで完結できるわけではなく、モニタリングソフトは別途Windows PCに入れないといけないらしい。 APCのPowerChuteと同じパターンですな。

というわけで、自分が普段使っているWindowsのクライアントにSystem Management Console CDを突っ込む。 ぐぁMSDEとSNMPが必要だ、とのこと。 さすがにMSDEも同梱されてるけど、なんでたかがハードの監視をするのに別のPCにこんなものまで入れなきゃならんのだ...。 SNMPはコントロールパネルの「Windowsコンポーネントの追加と削除」で、「管理とモニタ ツール」から自分で入れないといけない。 ポート2606,2607も空けないとやばいかな(ポートはインストール時に変更もできるみたいだけど)。 う?でもぜんぜんサーバ側に接続できまへん。 IT Assistantは文字化けまくりのメッセージを出して動かないし、Array ManagerもConnection failしてしまう。

あ〜、もう面倒くさい。 大体ベンダー独自のヤツだとWebで検索してみたりしてもあまり有用な情報がみつからなかったりするんだよね...。 そもそもこれじゃ監視しているクライアントも24時間稼動してないといかんじゃないか。

IPMI

そういうわけで、結局IPMIに方針転換することにしました。 IPMIというのはIntelligent Platform Management Interfaceの略で、IntelやDell、Hewlett-Packard、NECによって策定された、特定のハードウェアシステムやOSに依存することなくサーバハードウェアをモニタ可能にするための標準インターフェイス仕様、ということらしいです。

まずはDellのOpenIPMIドライバを落としてインストールします。 RHEL 3に適合するのは、openipmi-35.11.RHEL3-1dkms.tar.gzあたりが最新のようです。 tar玉の中に dkmsとドライバのrpmパッケージが入ってるのでインストールすると、dkmsがドライバを自動的にビルド&インストールしてくれます。

当たり前ですが、ドライバだけでは何もできませんので、ipmiの値を読み取るツールが必要です。 Dellのサイトからもリンクを張ってあった IPMItoolを落としてインストールします。 ソースのほか、RHEL 3用のバイナリパッケージもあるので楽ですね。

試しに、
modprobe ipmi_si_drv
modprobe ipmi_devintf
してドライバをロードし、
grep ipmi /proc/devices
としてみると、253 ipmidevだそうなので、
mknod --mode=644 ipmi0 c 253 0
でデバイスファイルを作成します。

さて ipmitool sensor とかしてみると...、おぉドバドバ結果が出てきた。 ipmitool sdr とかでみるといい感じ。 とりあえずいけるみたいです。

あ、IPMItoolの中に /usr/share/ipmitool/ipmi.init.redhat なんてあるので、/etc/init.d/ipmi にコピーして、/sbin/chkconfig --add ipmi; /sbin/chkconfig ipmi onしておくと次回ブート時に自動起動してくれます。 というか、このスクリプトは、先ほどしこしこ手でやったデバイスファイルの作成やipmiドライバのロードも自動でやってくれるので便利ですね。 ただし、/etc/sysconfig/ipmi の中で、IPMI="yes" を追加しておかないと有効になりませんのでご注意。

ちなみに、ipmiドライバは最近のカーネル(2.4.21-37.EL)には入っているみたいだけど、ドライバのバージョンは35.4。 Dellから入手するdkms形式のドライバは35.11。 変更点は確認してませんが、少なくともipmitool sdr list fullとかしてみると顕著なんですが、出力が帰ってくるまでの時間がかなり違います。 35.11の方が断然早いので、こちらを使った方が良さそうです。

RRDtool

さて、データは読み取れるようになりましたが、いちいち手でコマンドを打って確認するんでは、遠隔監視になりません。 サーバは24時間365日稼動してるんですから、自動的にデータの履歴をとり、温度が急上昇するとか異常な値が観測されたら警告メールを出すような仕組みを作らないといかんでしょう。

さてこの分野の定番ツールはRRDtoolというもののようです。 同じ作者のMRTGというツールも有名なようですが、グラフ作成の自由度が高いことから、サーバのモニタリングには最近RRDtoolの方が良く使われるもののようです。 ただし、その分RRDtoolは使い方がややこしいみたいですが、先ほどのIPMItoolの中に、create_rrds.sh (ラウンドロビンデータベースの作成)、collect_data.sh (ハードウェア状況データの収集とDBへの書き込み)、create_webpage.sh (ブラウザからハードウェアの状況を見るためのcgiを生成してくれる)等のサンプルスクリプトがありましたので、この辺を参考に作業することにします。

最初にしなければならないのは、ラウンドロビンデータベースの作成です。 ラウンドロビンというのは順繰りに総当り...というか、この場合は先にデータを何回分どのように記録するのかを指定してデータベースを作成し、用意した領域が埋まると古いほうから上書きされていく...といった仕組みのようです。 ログがどんどん大きくなって容量を食ったりしませんし、この方が都合が良いということなんでしょうか。

書式は結構ややこしいんですが create_rrds.sh を使う場合は、ipmi_cmd、rrd_dirを自分の環境にあわせて書き換えて実行するだけ。

サンプルスクリプトの設定を man rrdcreateの説明と照らし合わせて解読すると、

rrdtool create {生成するRRDファイル名} \
	--step 300 DS:var:GAUGE:900:{最小値}:{最大値} \
	RRA:AVERAGE:0.5:1:288 \
	RRA:AVERAGE:0.5:6:336 \
	RRA:AVERAGE:0.5:12:720
  • 300秒間隔でデータを記録、900秒データの記録がなされなかったら欠損値扱いとする
  • 300秒に1回の更新のうち、1回につき1回記録を288回分。つまり、5分×288=1440、24時間分とっておく
  • 300秒に1回の更新のうち、6回につき1回記録を336回分。つまり、30分×336=10080、168時間、7日分とっておく
  • 300秒に1回の更新のうち、12回につき1回記録を720回分。つまり、60分×720=43200、720時間、30日分とっておく

という設定で1つのセンサーにつき1つのRRDファイルを作成するようです(RRDtool自体は1つのRRDファイルに複数の系列を記録することもできますが)。 データベースの定義は最初に作ったら基本的には変えられませんので、どのような使い方をしてどのようなデータを記録するのかを検討しておかないといけないですね。

とりあえず私は、平均値だけでなく最大値、最小値も記録するようにし、長期の傾向を見るために1日1回を1000日分とっておくことにしました。

rrdtool create {生成するRRDファイル名} \
	--step 300 DS:var:GAUGE:900:{最小値}:{最大値} \
	RRA:AVERAGE:0.5:1:288 \
	RRA:AVERAGE:0.5:6:336 \
	RRA:AVERAGE:0.5:12:720 \
	RRA:AVERAGE:0.5:288:1000 \
	RRA:MAX:0.5:6:336 \
	RRA:MAX:0.5:12:720 \
	RRA:MAX:0.5:288:1000 \
	RRA:MIN:0.5:6:336 \
	RRA:MIN:0.5:12:720 \
	RRA:MIN:0.5:288:1000

次は、定期的にセンサーの値を読み取り、RRDファイルに書き込む処理です。 こちらもIPMItoolにあった collect_data.sh をベースにディレクトリ等を書き換えればOKです。 データベース作成時にデータをどのような形で記録するかは決まっていることなので、このスクリプトはIPMItoolを実行して得られた結果を、各センサーごとに rrdupdate {ファイル名} N:{値} として書き込んでいるだけです。 問題なく動いているようなら、cronにセットします。 更新間隔は先ほどの create_rrds.sh の定義とあわせます。 先ほどは300秒 = 5分にしたので、crontab -e で、*/5 * * * * /usr/share/ipmitool/collect_data.sh を登録すればOKです。

RRDtoolはRRDファイルのデータを読み込んでグラフを作成する機能も持っています。 しかもこの機能はcgiで呼び出して、ブラウザで参照されるなど必要になったときにオンデマンドでグラフイメージを作成できるので、監視ツールがCPUリソースを結構消費してしまうような馬鹿げた話にならずに済むというわけです。

で、またまたIPMItoolに収録されていた create_webpage.sh をディレクトリ等を自分の環境に合うように書き換えてから、

create_webpage.sh > /var/www/cgi-bin/ipmi_graphs.cgi
chmod 755 /var/www/cgi-bin/my_ipmi_graphs.cgi
chown -R apache:apache /var/www/html/images/graphs
として、cgiをApacheのCGIディレクトリに作成し、実行可能にしておきます。 あと、グラフが作成されるディレクトリをapacheから書き込めるようにオーナーを変更します。

どういうわけかできあがったcgiのファイル名の一部が化けてた(温度の℃で化けてるみたい)ので手で修正します。 ついでに拡張子を.gifから.pngに変えておくとPNGファイルでイメージを作成してくれます。 RRDtoolもPNGの方をお勧めしてるので、PNGにしておいた方がよいでしょう。

さて、ブラウザから http://サーバ名/cgi-bin/ipmi_graphs.cgi で確認してみます。 お、OKですね。

ついでに、APCのUPSも一緒に監視することにしました。 まぁPowerChuteという監視・管理ソフトはあるんですが、一緒の画面で見られたほうがいいですしね。 というわけで、先ほどの作業を参考に、UPS用のRRDファイルも作成しておいて、5分ごとに PowerChuteのディレクトリ( /opt/APC/PowerChuteBusinessEdition/Agent/ )にあるDatalogからデータを切り取ってRRDファイルに書き込むようなスクリプトを作ってみました。 おし、これも問題ないですね。 ついでにCPU使用率とか、ハードディスクの各パーティションの使用率も記録するようにしました。 CPU使用率ってコマンドラインでお手軽に使用率を取得できるものがあんまりないみたいなので、 /proc/stat から値を切り出してCPU負荷を計算するいい加減なプログラムを作って使ってます。

仕上げに、5分ごとに実行するデータ更新スクリプトを改造して、温度が60℃を超えるとかパーティションの使用率が95%を超えるとかするとメールを飛ばすようにしました。 大体完了ですかね。


あ〜、疲れた。 ちまたでは、RRDtoolは結構面倒くさいので、CACTIとかHotSanicなどのフロントエンドを使うのが流行りなようだけど、実際それほど苦しくはありませんでした。 特にRRDtool自体はグラフ作成は呼び出されたときだけオンデマンドで行うのですが、フロントエンドによっては裏で定期的にガリゴリするので、CPU負荷が結構高いものがあったりするらしい。それじゃ本末転倒だしね。

System / Temperature


System Board / Fan


System / Load


UPS / Line Voltage



Return to Previous page一つ前のページに戻る / Return to topこのページのTOPに戻る