サーバー監視ツール「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
ファイルシステムごとの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を送信した状態。
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