SEEDS Creator's Blog

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