「LinkStation」カテゴリーアーカイブ

CPU使用率について

MRTGでCPU使用率というと殆どのページでLoadAverageの設定が書かれています。
LoadAverageの表示には%で書かれている事が多いと思います。
そもそもLoadAverageとはなんなのか?
UNIX処方箋:「load average」によるCPU負荷の確認 – ITmedia エンタープライズ

つまりCPUの負荷を表すものであるがWindowsのプロセスマネージャーやtopコマンドで表示される
おなじみのCPU使用率とは意味合いが少し違うということになりますね。(ほぼ比例しますが)
また本来は%ではなく1.00表記の方が感覚的に正しいのかもしれません。
(1.00=100%なので意味は同じなのですが100%を超える場合もあるということです)

LoadAverageは1を超える可能性があるのでMRTGの設定でUnscaled[xxxx]: dwmyを指定している方は外した方がいいでしょう。
MaxBytes[xxx]:の項目も100以上の値を指定しないとLoadAverageが1を超えた場合にグラフの値がrrdファイルに書き込まれません。
重たい処理を行う時は1を超えることがしばしばありますので大き目の500などを指定しておけば問題ないと思います。
CPUがマルチなシステムの場合は普通に1を超えるようです。

ではお馴染みのtopコマンドと同じCPU使用率はsnmpで取得出来ないのでしょうか?
答えは「取得可能です」

Target[xxxx]: .1.3.6.1.4.1.2021.11.50.0&.1.3.6.1.4.1.2021.11.52.0:public@localhost

ユーザー使用の使用率:.1.3.6.1.4.1.2021.11.50.0
システム使用の使用率:.1.3.6.1.4.1.2021.11.52.0
※最後の0は何番目のCPUかを表します。マルチCPUであれば1を指定で2番目のCPUの値が取れます。
  他にもidle時間なんかも取れます。

但し取得してくる値はLoadAverageとは違うのでOptions[xxxx]:の部分に gauge, absoluteは指定しないで下さい。
参考サイト:MRTG: Net-SNMPでLinuxのCPU使用率をプロットするには
※既にリンク先のサイトはなくなっているようです

ということで私の場合はLoadAverageとCPU使用率の両方をRRDTOOL経由で記録して表示することにしました。
※5分の平均なのでCPU使用率がしばしば100%になっててもMAX値は記録されません。
  あくまでも平均としての目安で参考程度にした方が良いでしょう。

以下rrdcgiのサンプルです。
※cpu2.rrdがCPU使用率でcpu.rrdがLoadAverageになります。
  グラフの便宜上LoadAverageも百分率で表示しています。

------------------
#!/usr/bin/rrdcgi

CPU Use & Load Average for LS-GLDEB

System: localhost

Maintainer: Root

Ip: 192.168.x.x

The statistics were last updated .

------------------

RRDTOOLのGPRINTを利用可能にする!

ARM系のLinuxでGPRINTを利用するとRRDTOOLが落ちるのはチラホラ報告されているようです。
cactiを利用してもGPRINTで落ちるようです。

最初はCDEFでunkwn値を0に書き換えることでGPRINTを利用出来たのですが
グラフの作成速度が非常に遅くて使い物になりませんでした。
もちろんCPU使用率もそのあいだは100%になってしまいます。
ちゃんとした方法でRRDTOOLのGPRINTを利用可能にする事を目標に一週間ほど格闘の旅に出ました(笑)

結論から先に書きますとカーネルがEABIでコンパイルされていることが問題でした。
EABIカーネルはiptablesの時もそうですが何かと問題を引き起こしてくれます。
※apt-getではOABI環境で構築されたものが配布されています。
ARM系のCPUは浮動小数点演算ユニットを持たないので
少しでも早くなるようにEABIで構築すべきでOABIなカーネルの構築をするのは得策とは言えません。

ということで自分でEABIなコンパイルで回避することに決定!

コンパイル方法はDLした圧縮ファイルの中にあるrrdbuild.htmlに詳しく書かれています。
ライブラリのバージョンが合わない場合はライブラリからコンパイル&インストールする必要があります。

まずRRDTOOLのソースをDLしてきて早速コンパイル!
configureが通りません(笑)

IEEE MATHがどうのとエラーが出ます。

これを回避するにはコンパイル前に以下を実行します。

export rd_cv_ieee_works=yes

またconfigure時の引数にはEABIコンパイル用のCFLAGSを書きます。
CFLAGS=”-Wall -g3 -ggdb3″

これでコンパイルしていけば無事にインストールが出来るはずです。
※dh_make -r
  vi debian/roulesでCFLAGS編集
  dpkg-buildpackageでパッケージを作成しようとしましたが
  パッケージの作成まではうまく出来てもパッケージのインストールで失敗したので
  普通にmake installでインストールしました。

無事インストールが完了したらGPRINTを試してみてください。
ちゃんと数値がグラフ画像内に書き込まれるはずです。
グラフ画像内ではなくグラフ画像外に数値を出したい場合はGPRINTででは無くPRINTを使います。
PRINTした後でグラフタグ外の書きたい部分にRRD::PRINTタグを利用すればテキスト出力されます。

numberの部分はPRINT記述の何個目かを指定できます。(スタートは0です)

殆どrrdbuild.htmlのままですがインストールまでを書いておきます。
※rrdtool-1.2.15を例にしていますがライブラリも含め
  バージョンの部分が変わるくらいで手順は殆ど同じになります。

BUILD_DIR=/mnt/disk1/build/rrdbuild
INSTALL_DIR=/usr

mkdir -p $BUILD_DIR
cd $BUILD_DIR

export rd_cv_ieee_works=yes

※ライブラリのVersionが一致していない人はライブラリからインストールします。
  他のアプリケーションで利用されている場合はPCが不安定になる場合があります。
  特にバージョンダウンは止めたほうが良いでしょう。
  もっとバージョンの新しいRRDTOOLソースをダウンロードしてインストールしましょう。

cd $BUILD_DIR
wget http://oss.oetiker.ch/rrdtool/pub/libs/zlib-1.2.3.tar.gz
tar zxf zlib-1.2.3.tar.gz
cd zlib-1.2.3
env CFLAGS=”-Wall -g3 -ggdb3″ ./configure –prefix=$BUILD_DIR/lb
make
make install

cd $BUILD_DIR
wget http://oss.oetiker.ch/rrdtool/pub/libs/libpng-1.2.10.tar.gz
tar zxvf libpng-1.2.10.tar.gz
cd libpng-1.2.10
env CPPFLAGS=”-I$BUILD_DIR/lb/include” LDFLAGS=”-L$BUILD_DIR/lb/lib” CFLAGS=”-Wall -g3 -ggdb3″
./configure –disable-shared –prefix=$BUILD_DIR/lb
make
make install

cd $BUILD_DIR
wget http://oss.oetiker.ch/rrdtool/pub/libs/freetype-2.1.10.tar.bz2
tar jxvf freetype-2.1.10.tar.bz2
cd freetype-2.1.10
env CPPFLAGS=”-I$BUILD_DIR/lb/include” LDFLAGS=”-L$BUILD_DIR/lb/lib” CFLAGS=”-Wall -g3 -ggdb3″
./configure –disable-shared –prefix=$BUILD_DIR/lb
make
make install

cd $BUILD_DIR
wget http://oss.oetiker.ch/rrdtool/pub/libs/libart_lgpl-2.3.17.tar.gz
tar zxvf libart_lgpl-2.3.17.tar.gz
cd libart_lgpl-2.3.17
env CFLAGS=”-Wall -g3 -ggdb3″ ./configure –disable-shared –prefix=$BUILD_DIR/lb
make
make install

※ライブラリが一致している人はここからでも構いませんがCPPFLAGS、LDFLAGSの書き換えは必要です。

IR=-I$BUILD_DIR/lb/include
CPPFLAGS=”$IR $IR/libart-2.0 $IR/freetype2 $IR/libpng”
LDFLAGS=”-L$BUILD_DIR/lb/lib”
CFLAGS=”-Wall -g3 -ggdb3″
export CPPFLAGS LDFLAGS CFLAGS

wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.2.15.tar.gz
tar zxf rrdtool-1.2.15.tar.gz
cd $BUILD_DIR/rrdtool-1.2.15
./configure –prefix=$INSTALL_DIR –disable-python –disable-tcl
make clean
make
make install

以上

MRTGからRRDTOLへ移行

MRTGからRRDTOLへ
誰もが通る道でしょうか(笑)

まずRRDTOOLをインストールします。

apt-get install rrdtool librrds-perl

次にmrtg.cfgをRRDTOOLを利用するように追記します。
以下の一文を最初の方に追記してください。

LogFormat: rrdtool

これだけで次回起動時からRRDTOOLを利用してログを書き込むようになります。
※ログファイルはxxxx.rrdという感じで拡張子がrrdで作成されます。

MRTGからRRDTOOLに移行するとグラフは自動で作成されなくなります。
そこで一般的に使われているフロントエンド 14ALL や mrtg-rrd を使用してみました。
はっきり言って玄箱ProやLS-GLなどのARM系では使えませんでした。
そこで直接RRDTOOLを利用してグラフを書いてみることにしました。

今回はPCの負荷を減らす為にオンデマンドでグラフを作成します。
グラフの作成方法などは沢山検索で出てくると思いますのでここでは省略します。
※rrdcgiを利用してみましたがRRDsでも同様のことが実現できます。

グラフは慣れれば比較的簡単に作成することが可能になりました。
CPU、メモリが非力なNASベースのサーバーでDBインストール必須なcactiは使う気になれません。
グラフを自分で作成できればcactiなんて要りませんしね。

さてここで一つ問題が発生しました・・・
PRINTやGPRINTを使用するとRRDTOOLが落ちてしまいます(^^;
数値を入れなければ問題ないんですがやっぱり数字は入れたいですよね。

HDDの温度監視

LinkstationでもHDDの温度を監視出来ることを知りました!

参考ページ
PC破壊日記的ブログ

なんとapt-getを使って簡単にインストール出来ます。

apt-get install smartmontools

早速MRTGに登録してみましたが何故か値が取得できませんでした。
コマンドで試すとちゃんと温度だけが表示されるんですが。
MRTGをroot権限で動かしているのに何故反映されないかのか結局分からず・・・

そこで方法を変えて以下のスクリプトを作成しSNMPに外部スクリプトで登録しました。

--------------------
#!/usr/bin/perl —

$hddtemp = readpipe(‘smartctl -d marvell -a /dev/sda -s on | grep -i temp | awk ‘{print $10}”);

print $hddtemp;

exit $hddtemp;

--------------------
※今回のスクリプトはINTEGERで値が取得出来るようにexitで値を返しています。

するとちゃんと値が取得出来るようになりました。

snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.8.1.100.2

ファイルサーバーにも同じように設定しネットワーク越しでもHDDの温度の監視が出来るようになりました。

※気が付くとMRTGのインデックスページの項目が沢山増えてしまいました(笑)
 Linkstationにもそこそこ負荷が掛かってるでしょうね。

他サーバーの温度、FANを監視する

他サーバーのCPU使用率やディスク使用率は他サーバーにインストールしたsnmp経由で取得可能です。
しかし温度やFAN回転数などはsnmpでは標準ではサポートされていません。
出来れば温度監視、FAN監視も一緒にやっておきたいところです。
(ここではdebian化したLinkstationの温度、FAN監視を扱っていますので
 お使いの機器によって温度取得、FAN回転数などの取得スクリプトは異なります)

snmpには外部スクリプトの結果を返してくれるようにする設定が可能なのでそれを利用します。
snmpd.confのサンプルを見ると Executables/scripts という項目があるのが分かると思います。

#####################################
# Executables/scripts
#
#
# You can also have programs run by the agent that return a single
# line of output and an exit code. Here are two examples.
#
# exec NAME PROGRAM [ARGS …]
#
# NAME: A generic name.
# PROGRAM: The program to run. Include the path!
# ARGS: optional arguments to be passed to the program

この後ろに実行スクリプトを登録します。
ちなみに今回は本体で使用しているスクリプトをそのまま他サーバーにコピーし流用します。
以前紹介しているスクリプトを他サーバーにコピーしてください。

/usr/local/mrtg/bin/mon_fan.pl
/usr/local/mrtg/bin/mon_temp.pl

スクリプトをコピーしたらsnmpd.confに実行の記述を書き足します。

exec mon_fan /usr/bin/perl /usr/local/mrtg/bin/mon_fan.pl
exec mon_fan /usr/bin/perl /usr/local/mrtg/bin/mon_temp.pl

この二行を書き足すことでスクリプトの実行結果がsnmp経由で取得可能になります。
Executables/scriptsのコメント部分に取得の値もちゃんと書いてありますね。
1.3.6.1.4.1.2021.8.1.101.1 ←1つ目の実行結果をそのまま文字列で返すようです。
1.3.6.1.4.1.2021.8.1.101.2 ←2つ目の実行結果をそのまま文字列で返すようです。

しかしこの結果をそのまま取得すると「UCD-SNMP-MIB::extOutput.1 = STRING:」のような余計な文字まで取得します。
本来はスクリプトを数字で返すように書き換えてINTEGERの値を取得すべきですが楽に使い回すために
MRTGの取得側で細工を行い正常にMRTGが認識出来るようにします。

※温度、FAN回転数のMRTG側設定は以前紹介したものを一部書き換えて使用します。
 基本的には同じように書くことで設定温度、設定回転数を超えた場合にメールの送信まで行ってくれます。

tagert項目を以下のように書き換えてください。

Target[fan_nashiro]: `snmpwalk -v 1 -c public 192.168.x.x .1.3.6.1.4.1.2021.8.1.101.1 | awk ‘{print $4} {print “2640”} {print “hostname”}’`

※public 192.168.x.x の部分はsnmpで設定した名称、サーバーIPに書き換えてください。
 2640の部分は好きな数字に書き換えて構いません。
 もちろん0でもOKです。
 hostnameの部分は他サーバーのホスト名に書き換えます。
 また、.1.3.6.1.4.1.2021.8.1.101.1 の部分を .1.3.6.1.4.1.2021.8.1.101.2 に書き換えれば温度の取得が出来ます。

snmpでスクリプトからの取得設定を行えばスクリプトで取得できる値は
snmp標準の値でなくても取得可能になるのでスクリプトで取得できる殆どの値はsnmp経由で送信可能ということになります。

以前紹介したメール対応の設定サンプルを改造したものを載せておきます。

### fan rpm info NAS-HIRO ####

Options[fan_nashiro]: gauge,growright,nopercent,unknaszero
MaxBytes[fan_nashiro]: 3700
ThreshMaxI[fan_nashiro]: 3000
SetEnv[fan_nashiro]: EMAIL=”yourmail@yourdomain.com”
URL=”http://your url/temp_nashiro.html”
YLegend[fan_nashiro]: Fan RPM
ShortLegend[fan_nashiro]: rpm
LegendI[fan_nashiro]:RPM
LegendO[fan_nashiro]:fastline
Unscaled[fan_nashiro]: ymwd

Target[fan_nashiro]: `snmpwalk -v 1 -c public 192.168.x.x .1.3.6.1.4.1.2021.8.1.101.1 | awk ‘{print $4} {print “2640”} {print “NAS-HIRO”}’`
Title[fan_nashiro]: Fan RPM Information
PageTop[fan_nashiro]:

Fan RPM Information on NAS-HIRO

System:NAS-HIRO
Maintainer:Root
Ip:192.168.x.x

### temp info NAS-HIRO ####

Options[temp_nashiro]: gauge,growright,nopercent,unknaszero
MaxBytes[temp_nashiro]: 75
ThreshMaxI[temp_nashiro]: 50
SetEnv[temp_nashiro]: EMAIL=”yourmail@yourdomain.com”
URL=”http://your url/temp_nashiro.html”
YLegend[temp_nashiro]: Temperature
ShortLegend[temp_nashiro]: C-deg
LegendI[temp_nashiro]:TEMP
LegendO[temp_nashiro]:borderline
Unscaled[temp_nashiro]: ymwd

Target[temp_nashiro]: `snmpwalk -v 1 -c public 192.168.x.x .1.3.6.1.4.1.2021.8.1.101.2 | awk ‘{print $4} {print “55”} {print “NAS-HIRO”}’`
Title[temp_nashiro]: Temperature Information
PageTop[temp_nashiro]:

Temperature Information on NAS-HIRO

System:NAS-HIRO
Maintainer:Root
Ip:192.168.x.x

ネットワーク機器の監視

ファイルサーバーの監視もSNMP経由でMRTGで纏めてやってみようと思い
ファイルサーバー側のSNMPの設定を行ってみました。
繋がりません・・・
色々なサイトを見て設定は間違っていないと思うのですが。

試しにsnmpwalk で値が取得できるか試してみました。

snmpwalk -v 1 localhost -c pubilic

ちゃんと取得できます。

snmpwalk -v 1 192.168.X.X -c pubilic

IPだと取得できません・・・

hostsからIPが漏れていたので追加するとIPでも動きました。
しかしhostsにWebサーバーのIPを追加してもTimeout: No Response from 192.168.X.X
と表示されるだけで値は返って来ません。
ちゃんとネット経由用の設定も追加したのに何故だろうか?

※追記
snmpのバージョンアップで基本的に127.0.0.1からしか繋がらないようになったようです。
恐らく殆どのサイトがバージョンアップ前の古い記事でこの設定が書かれていないようです。
この設定を解除するには以下のファイルに手を加えます。

/etc/default/snmpd

#SNMPDOPTS=’-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 127.0.0.1′
SNMPDOPTS=’-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid’

単純にSNMPDOPTSの127.0.0.1を外すだけで良いようです。
この後snmpdを再起動してあげれば無事ネット経由での取得が可能になりました。

ちなみに-u snmp オプションを消すと自前で登録したスクリプトなどをroot権限で動かすことが可能になります。
逆に言えばroot権限で実行させたい場合は外す必要があります。