カテゴリー: munin

muninプラグインを作成

muninは数値化できるもの規定の形式で標準出力するだけでなんでもグラフ化できます。

ユーザー数を取得してグラフするプラグインを作成する

サーバー側の情報はほとんどデフォルトのプラグインでカバーされているので今まで不便はなかったのですが勉強の為に運営しているサイトのユーザー数などを取得し、グラフ化してくれるようなプラグインを作成してみました。

ユーザー数を取得するスクリプトを作成

ここは各WEBアプリ部分になるのですがシェル上でたとえば以下のように実行すればDB等を参照してユーザー数が標準出力で返ってくるようなプログラムを作成しておきます。

/home/app/usercount.php (例)
[code]
<?php

$conn = pg_connect(“dbname=hoge“);
$sql = “SELECT id FROM user”;
$result = pg_query($conn, $sql );
echo pg_num_rows($result);
pg_close($conn);
[/code]

シェル上で実行してみます。210人のユーザーがいるみたいですね。

[code]
$ /usr/local/bin/php /home/app/usercount.php
210
[/code]

muninのプラグインを作成

muninのプラグインは与えられた引数ごとにmuninの望む出力をしてあげればOKなので言語は問いませんが、シェルスクリプトでの生成が多いみたいなので今回もシェルスクリプトで作成しました。

とりあえず作成したプラグインの全文を載せます。
作成したプラグインは /usr/share/munin/plugins へ実行権限をつけて保存し、/etc/munin/plugins/ 以下でシンボリックリンクを作成してmunin nodeを再起動します。

vi /usr/share/munin/plugins/usercount
[code]
!/bin/sh

%# family=auto
%# capabilities=autoconf

GETNUM=/usr/local/bin/php /home/app/usercount.php

if [ "$1" = "autoconf" ]; then
if [ -n ${GETNUM} ] ; then
echo yes
exit 0
else
echo no
exit 0
fi
fi

if [ "$1" = "config" ]; then
echo 'graph_title user count'
echo 'graph_args -r –lower-limit 0'
echo 'graph_vlabel users'
echo 'graph_category Apps'
echo 'total.label Total users'
echo 'total.min 0'
echo 'total.draw AREA'
echo 'total.type GAUGE'
exit 0
fi

echo "total.value $GETNUM";
[/code]

実行権限をつける
[code]
chmod 755 /usr/share/munin/plugins/usercount
[/code]

保存が完了したら /etc/munin/plugins/ 以下にシンボリックリンクを作成する
[code]
cd /etc/munin/plugins/
ln -s /usr/share/munin/plugins/usercount usercount
[/code]

最後に再起動
[code]
/etc/init.d/munin-node restert
[/code]

各項目の意味

プラグイン内の各項目の意味です。

munin-node-configureの環境変数設定項目

[code]
%# family=auto
%# capabilities=autoconf
[/code]

Munin付属のプラグイン追加・削除ツールであるmunin-node-configureに通知を行う項目です。
autoconfに対応しているプラグインはmunin-node-configureにより、自動で利用可能か確認し追加することができます。
いろいろな項目が指定できるようですが配布もしないし自分しか使わないようなプラグインであれば何も考えずコピペでOKだと思います。

こちらの項目については以下の公式ドキュメント(英語)が詳しいです。

Magic markers – http://munin-monitoring.org/wiki/ConcisePlugins#Magicmarkers

データ取得

[code]
GETNUM=/usr/local/bin/php /home/app/usercount.php
[/code]

先ほど作成したユーザーカウントを取得するプログラムを実行しています。
$GETNUMにはユーザー数が入ってるはずです。

引数autoconfを与えられた時の実行

[code]
if [ "$1" = "autoconf" ]; then
if [ -n ${GETNUM} ] ; then
echo yes
exit 0
else
echo no
exit 0
fi
fi
[/code]

autoconfに対応したプラグインの場合、こちらでプラグインとして読み込むか否かを設定できます。
今回の場合 変数GETNUMの値が空だった場合は正常にユーザー数を取得できていないのでnoを返す(読み込まれない)よう設定します。
逆に取得ができてるのであればyesを返します。

引数configを与えられた時の実行

[code]
if [ "$1" = "config" ]; then
echo 'graph_title user count'
echo 'graph_args –rigid –lower-limit 0'
echo 'graph_scale no'
echo 'graph_vlabel users'
echo 'graph_category Apps'
echo 'total.label Total users'
echo 'total.min 0'
echo 'total.draw LINE2'
echo 'total.type GAUGE'
exit 0
fi
[/code]

大きくわけてグラフ全体の設定項目と、描写する内容(データソース)の設定にわかれます。
詳しくは以下のリファレンスマニュアルで。(英語)
config reference – http://munin-monitoring.org/wiki/protocol-config

graph_title user count
グラフのタイトルです。グラフの上部に出力されます。

graph_args –rigid –lower-limit 0
グラフパラメータの設定です。
–lower-limit 0 y軸のスタート地点を設定します。
–upper-limit 100 y軸の上限を設定します。
–rigid y軸の上下値のリミットを強制します。
–base 1024 この数字を超える場合に1kと表示される

graph_scale no
上記のbaseを超えた値の1kなどの表示をやめる

graph_vlabel users
y軸の名前。グラフの左に表示されます

graph_category Apps
グラフのカテゴリー

{fieldname}.label Total users
データソースの名前。カウントされた値の項目名としてグラフの下に出力されます。

{fieldname}.max 1000
この値より高い数字を取得した場合に無視します。

{fieldname}.min 0
この値より低い数字を取得した場合に無視します。

{fieldname}.draw LINE2
グラフ描写のタイプを指定
LINE1 1ピクセルのライン
LINE2 2ピクセルのライン (デフォルト)
LINE3 3プクセルのライン
AREA 塗りつぶします
STACK 積み重ねます

{fieldname}.type GAUGE
グラフ描写のタイプ指定
GAUGE 計測をそのまま表示 (デフォルト)
COUNTER 前回記録時との差分を記録し、毎秒あたりの値に変換。
     オーバーフローに対応するが前回の値より下回る事は考慮しない?
DERIVE 前回記録時との差分を記録しつつ毎秒あたりの値に変換。
     オーバーフローには対応していないが前回の値より下回る事を考慮?
ABSOLUTE 基本的にはCOUNTERと同じだけど、増加分の値を表示する? この値はよく意味がわかりませんでした。

引数なしの時の実行

[code]
echo "total.value $GETNUM";
[/code]

最後に値を出力。
これは引数をつけづに実行した際の出力になります。
totalというフィールドセットへの値なので
total.value * みたいな出力となるよう調整します。

確認

[code]

./usercount autoconf

yes

./usercount config

graph_title user count
graph_args –rigid –lower-limit 0
graph_scale no
graph_vlabel users
graph_category Apps
total.label Total users
total.min 0
total.type GAUGE
total.draw LINE2

./usercount

total.value 538
[/code]

完成

現在のユーザー数がグラフ化できました。


(※)途中、COUNTとかを使用するとavgなどが変な値になってしまった・・・

数値化できるものであればなんでもグラフ化できるので便利ですね。

muninグラフの読み方と意味

サーバー監視ツール「munin」の各グラフの意味と読み方。

muninをインストールすると標準でたくさんのグラフが出力されます。中には聞いた事もない単語のグラフもあり、
「いったいこれは何なのか」と疑問に思っていたので調べてみました。

グラフはすべてplugin (/etc/munin/plugins) の内容から出力されていて、さらにそのほとんどが単なるperlスクリプトシェルスクリプトでした。このpluginが実際はどのようなコマンドを使った結果なのかを確認しながら調べました。プログラムにはあまり明るくない&英語が苦手、なので意味違いしている可能性がありますのでお気づきの点がありましたらコメントを頂けると嬉しいです。
使用したmuninバージョンは1.4.5です。

ほとんどの値は /proc/以下から参照されているようで以下のページがとても役に立ちました。
Man page of PROC – http://linuxjm.sourceforge.jp/html/LDP_man-pages/man5/proc.5.html

disk

Disk IOs per device



プラグイン diskstats
IO使用率(Disk utilization per deviceで得た値)を単位時間内で行ったI/O数で分割し
1秒間で行ったI/O数の平均値を出力します。
グラフを見てると入出力したkbyte数も出力してくれるようです。

実体は /proc/diskstats の出力内容から。
ファイルには各ディスクデバイスのディスク I/O 統計情報が書かれていて、
詳細は以下のカーネルドキュメント。
http://www.kernel.org/doc/Documentation/iostats.txt

各項目の意味はこちらが詳しいです。
http://hagio.org/wiki/index.php/Linux/%E9%9B%91%E8%A8%98#.2Fproc.2Fdiskstats_.E3.81.AE.E5.90.84.E9.A0.85.E7.9B.AE.E3.81.AE.E6.84.8F.E5.91.B3

Disk latency per device



プラグイン diskstats
こちらのグラフもTOPページで全ディスクの読み書きにかかる時間を表示、
クリックで、各ディスクごとの読み書きにかかる時間を表示します。

この時間はsyscallがアプリケーションとデバイスを行き来する平均時間から算出されている?みたいです。
単位はミリセカンド(1000分の1秒)。

実体は /proc/diskstats の出力内容から。

Disk throughput per device



プラグイン diskstats
1秒間に読み書きしたバイト数を表示します。

Disk usage in percent



プラグイン df
ファイルシステムごとのディスク使用率を%で表示。
元コマンドはdfコマンドです。

Disk utilization per device


プラグイン diskstats
こちらのグラフはTOPページで全ディスクのIO使用率を表示、
クリックで、各ディスクごとのIO使用率を表示します。
LinuxではI/Oリクエストの発生中は1ミリセカンドごとにインクリメントするカウンターを使っています。
もしこのカウンターが1秒の間に1000msecぶんインクリメントされるとI/Oリクエストの発生が100%とほぼ近い値になります。
このプラグインは上記の考えからディスクへのIO使用率を%にて提供してくれます。
ただ5分ごとの計測なので当然、瞬間的な表示の取得はできません。

実体は /proc/diskstats の出力内容から。

Inode usage in percent



プラグイン df_inode

ファイルシステムごとのinode使用率を%で表示。
元コマンドはdfコマンドです。

IO Service time



プラグイン iostat_ios
バイスごとの書き込み/読み込みの遅れをグラフ化してくれます。
書き込み/読み込みにかかった時間を成功回数で割った時間です。
左メニューの le-05 などは10の-5乗という意味。
つまりこのグラフが大きければ大きいほどIOがヤバイという事になります。

実体は上記と同じく /proc/diskstats の出力内容から。
・読み込みが成功した回数
・読み込みにかかった時間 (ミリ秒)
・書き込みが成功した回数
・書き込みにかかった時間 (ミリ秒)
の値を取得し前回取得した数の差分を求めて計算する事でグラフ化されています。

IOstat



プラグイン iostat
バイスごとの書き込み能力をグラフ化してくれます。
こちらは表示の仕方が特殊で1秒間に読み書きに成功したセクタ数が出力されています。
グラフの+項目が書き込み、-項目が読み込みの値となっています。

実体は /proc/diskstats の出力内容から。

munin

Munin processing time



プラグイン munin_stats
muninがデータを取得し、グラフ、html出力など、4つの作業ごとにかかった時間を出力します。

network

Connections through firewall



プラグイン fw_conntrack
iptables を使うとき, ip_conntrack というテーブルで tcp のセッションを管理しています。
iptablesを通ったパケットは現在の接続状態などを上記のテーブルへ記録します。
このプラグインではそのテーブルを参照し、現在の状態別の接続数を表示してくれます。

ESTABLISHED
TCPコネクションが確立して通信している状態

FIN_WAIT
終了を宣言した状態

TIME_WAIT
コネクションの終了待ち状態

SYN_SENT
SYNを送信した状態。

UDP_Connections
UDPコネクション数

Assured
ASSUREDフラグの数。
このフラグは

NATed
NATの数?詳細はちょっとわからなかったです。

実態は以下のコマンドで出力される内容です。
cat /proc/net/ip_conntrack

参考
conntrackエントリ – http://www.asahi-net.or.jp/~aa4t-nngk/ipttut/output/theconntrackentries.html

eth0 errors



プラグイン if_err_*
パケットのエラー数を計測します。
基本的にインターフェイスにてエラーパケットが1でも存在すれば設定や接続先のハブに問題がなければ
個人的には信頼できないNICとして交換を視野に入れます。

実態は以下のコマンドで出力される内容です。
cat /proc/net/dev

eth0 traffic



プラグイン if_*
パケットの転送料を計測します。
ethtoolにてNICの接続状態やリンクモード(100Mbpsとか1000Mbpsとか)を取得し、
/proc/net/devの値を取得しています。

inがマイナス、outがプラスとしてグラフ出力されます。

Firewall Throughput


プラグイン fw_packets
1秒間に転送したパケット数を表示します。
/proc/net/snmp のIP:行の値を取得してこちらの値を元に計算されています。

HTTP loadtime of a page



プラグイン http_loadtime
http://localhost/wgetにて取得、その時間をtimeコマンドで取得し表示します。
任意のURLへ変えたい場合は、プラグインの以下の部分
[code]
target – URL to fetch (default: “http://localhost/“)
[/code]
を変更すれば可能だと思います。

ipconntrack



プラグイン fw_forwarded_local
iptables を使うとき, ip_conntrack というテーブルで tcp のセッションを管理しています。
接続数が増えると、それだけip_conntrackテーブルを使用するのですが、
これがいっぱいになると以下のようなログが出て通信がまったく出来なくなる状態となります。
[code]
ip_conntrack: table full, dropping packet
[/code]

このグラフでは現在のip_conntrackの上限値と使用数を表示してくれます。
実態は /proc/sys/net/ipv4/netfilter/ip_conntrack_max に記述されている値(上限値)と
/proc/net/ip_conntrack の値(現在の使用値)です。

中規模〜大規模なサイトだとこの値は意外と問題となってきますので、使用率があがってきたら
メモリと相談しながら上限をあげたり対策を行いましょう。

参考

iptables の ip_conntrack の最大値を変更する方法 – http://www.sssg.org/blogs/naoya/archives/1454

process

Fork rate



プラグイン forks
1秒間にfork(プロセスのコピーを生成する事)された数を表示します。
/proc/stat の値の processes 行(プロセスやスレッドが作成された数)の値を取得しています。

Number of threads



プラグイン threads
スレッドとは一つのプロセスの中で平行に処理を行いたい場合などに使用されます。
このグラフではスレッドがシステム全体でいくつ作られたスレッド数を表示します。

/proc以下にあるプロセスIDのディレクトリからThreadsの値を取得した合計値です。
実際には以下のようなコマンドで表示されていました。
grep -s ‘^Threads’ /proc/[0-9]*/status

Processes



プラグイン processes
プロセスの総数をそれぞれの状態別に表示してくれます。
実態はPSコマンドです

ps –no-header -eo s

Processes priority



プラグイン proc_pri
プロセスの優先度ごとの数を表示します。
元コマンドはpsでstat項目の内容で判断しています。
< 優先度高 (high-priority)
N 優先度低 (low-priority)
L メモリーロックプロセス (locked)
として集計されています。

VMstat



プラグイン vmstat
実行中であるプロセス数、スリープ状態にあるプロセス数をグラフ表示します。
vmstatコマンドのproc行にあるrとbの値をそれぞれ取得しています。

r:実行待ち状態にあるプロセス数
b:割り込み不可能なスリープ状態にあるプロセス数

rは実行可能でCPUの割当をまっている状態のプロセス数なのでグラフではrunningと表示されていますが、実際には実行中ではないような気がします。
この値はロードアベレージとほぼ同じ値を示します。
bはスリープ状態にあるプロセス、、ですがほとんどの原因はI/O待ちで、I/O待ちプロセス数と言い換える事ができます。

System

Available entropy



プラグイン entropy
エントロピー(entropy)は乱雑さを意味します。
主に鍵ファイルの生成などランダムな文字列を作成する時に使用されます。
通常はマウス操作などで自動的に乱数が作成されますが、サーバーの場合は付けっぱなしのまま置く事も多いので
このエントロピーが徐々に枯渇していき、乱数発生の際などに極端に動作が遅くなる事があります。

通常は3000とかくらいまであればいいんですが、仮想サーバーだと思うように溜まらないようです。
今の所問題になるほどの遅延は発生していませんがVMWareやさくらのVPSとかで150程度。
物理サーバーだと3000くらいはすぐに溜まります。

使用可能なエントロピーの値は以下のコマンドで取得でき、グラフ生成も以下のコマンドで行われています。
cat /proc/sys/kernel/random/entropy_avail

CPU usage



プラグイン cpu
CPUの使用率を表示します。
コア数ぶん表示するので、例えばコア2、ハイパースレッディング対応の場合はMAXが400%となります。

system
システムモード

user
ユーザモード

nice
低い優先度のユーザモード

idle
未使用の状態

iowait
I/O の完了を待っていた時間

irq
割り込み処理を行った時間

softirq
ソフト割り込みの処理を行った時間

steal
仮想化環境での動作時に他のオペレーティングシステムにより消費された時間

guest
Linux カーネルの制御下のゲストオペレーティングシステムの仮想 CPU の 実行に消費された時間

基本的には system user iowaitの値を確認します。
システムモードはOSコードやデバイス・ドライバなどで使用された基本的にはOSで使用されるCPU使用
ユーザーモードPHPとかApacheなどのユーザーアプリでのCPU使用
iowatiはHDDへの書き込み/読み込み待ち状態のCPU使用
です。

このプラグインが使用している値は /proc/stat のCPU項目です。

File table usage



プラグイン openfile
オープンされているファイル数とシステム中のオープンファイル管理データの最大数をグラフ化します。

上限値は /etc/security/limits.conf で変更可能
fs.file-max = 90000 など

取得もとは以下の値です。
/proc/sys/fs/file-nr

Individual interrupts



プラグイン irqstats
様々な種類の割り込みの数をグラフ化してくれます。
割り込みの種類はマウスとキーボード(i8042)、イーサネット(eth0)などのハードウェアから生じる割り込みや
カーネルからくる割り込みなど様々な種類があるみたいです。

取得元は /proc/interrupts です

Inode table usage



プラグイン irqstats
システム中のメモリiノードの数および使用中のメモリiノードの数をグラフします。

取得元は /proc/sys/fs/inode-nr の値です。

Interrupts and context switches



プラグイン irqstats
処理された割り込みの回数とコンテクスト・スイッチ(CPUの状態を保存したり復元したりした回数)を表示する。

取得元は /proc/stat の intr および ctxt の値。

Load average



プラグイン load
ロードアベレージの値をグラフしてくれます。

取得元は /proc/loadavg で
cut -f2 -d’ ‘ < /proc/loadavg
として取得されているので5分平均の値です。

Logged in users



プラグイン users
ログインしているユーザー数を表示します。
取得元はwhoコマンド

Memory usage



プラグイン memory
モリーの使用状況をグラフに表示してくれます。

apps
ユーザアプリ使用メモリサイズ
MemTotal – MemFree – Buffers – Cached – Slab – PageTables – SwapCached

page_tables
ページテーブルエントリという「ページ」の管理構造体として利用されているメモリ

swap_cache
物理メモリ上にキャッシュされたスワップページの総容量

vmalloc_used
vmalloc()で確保された物理メモリ領域とMMCONFIGで確保しているメモリ領域の総容量

slab_cache
スラブアロケータで使用されている物理メモリの総容量

cache
ファイルデータのキャッシュなどに使用している物理メモリの総容量。共有メモリは Cached に加算される。SwapCachedは含まない
cache-(SwapCache+buffers)

buffers
ファイルなどのメタデータとして使用している物理メモリの総容量

unused
未使用のメモリ。

swap
スワップとして使用されている量
SwapTotal – SwapFree

committed
全プロセスによって確保された仮想メモリの総容量。

mapped
ページテーブルに登録されている物理メモリの総容量

active
最近アクセスした物理メモリの容量

inactive
最近アクセスしていない解放してよい物理メモリの容量

取得元は /proc/slabinfo と /proc/meminfo

Swap in/out



プラグイン swap
1秒間にswap in/outされたブロック数を表示、

取得元は /proc/vmstat の pswpin / pswpoutの値です

Uptime



プラグイン uptime
パソコンが起動してから現在までの時間。

取得元は /proc/uptime

© SEEDS Co.,Ltd.