MRTG challenge 20040814

MRTG challenge. Watching routers, server's CPU and server's traffic. Just configurating by SHIBATA Akira
作成 2004/08/14

MRTG (Multi Router Traffic Grapher) とは

MRTG とは二つの系列のデータのデータをグラフにしてブラウザで見られるようにする仕組み。 今回はトラフィックデータと CPU 負荷を snmp で取得し、mrtg で表示させるようにした。

トラフィック量や CPU の負荷をしりたい

会社のネットワーク管理者なんかやっていると、トラフィック量がドレくらいなのか知りたくなる。 なぜって?専用線は一定のトラフィックまでなら費用が固定だから。 利用者に「線が細いんじゃねーの?」とか言われても、「空いているよ」とか「その時間はちょっと混んでますな」とか言えるわけ。 専用線の契約をより太くしたり細くしたりの加減もトラフィック量がわかれば最適化が測れるハズなのだ。 で、このトラフィック量をグラフで可視化してくれるツールが MRTG だ。

あるいは、サーバを運用していると CPU の負荷やサーバのトラフィック量、使用メモリ量などなど見たいこともある。 下のような top コマンドの結果でもいいといえばいいのだが、履歴をとろうとおもったらソレはログとって解析してと面倒なことこの上ない。

 09:22:44 up 94 days, 15:55,  2 users,  load average: 0.07, 0.02, 0.00
41 processes: 40 sleeping, 1 running, 0 zombie, 0 stopped
CPU states:   9.1% user,   9.1% system,   0.0% nice,  81.8% idle
Mem:    513912K total,   494808K used,    19104K free,    28852K buffers
Swap:   498004K total,     2472K used,   495532K free,   327340K cached

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME COMMAND
21419 shibata   18   0   940  940   748 R    18.9  0.1   0:03 top
    1 root       8   0   460  408   388 S     0.0  0.0   0:04 init
    2 root       9   0     0    0     0 SW    0.0  0.0   0:00 keventd
    3 root      19  19     0    0     0 SWN   0.0  0.0   0:00 ksoftirqd_CPU0
    4 root       9   0     0    0     0 SW    0.0  0.0   1:54 kswapd
    5 root       9   0     0    0     0 SW    0.0  0.0   0:00 bdflush
    6 root       9   0     0    0     0 SW    0.0  0.0   0:22 kupdated
    7 root       9   0     0    0     0 SW    0.0  0.0   0:00 scsi_eh_0
  156 root       9   0   756  744   640 S     0.0  0.1   0:37 syslogd
  159 root       9   0  1068  388   388 S     0.0  0.0   0:00 klogd
  174 root       8   0   720  664   640 S     0.0  0.1   0:01 inetd
そこで、 CPU 負荷を、あるいはディスク使用量を情報としてとってグラフにすれば「履歴として一丁あがり!」だし、サーバを増強するかどうかの目安にもなろう。 このCPU 負荷グラフ化ツールに本来ルータのトラフィック計測のツールの MRTG を使うことにした。

で、はじめるにあたって

観測される装置について

  1. snmp を受け付けてくれないといけない
  2. ほとんどのものは Debian GNU/Linux Woody で構築した

観測装置について

  1. ブラウザで見るものだから httpd が動いてないといけない (今回は Apache で構築した)
  2. Debian GNU/Linux Woody で構築した
  3. 実験して確認できるといい

観測される側の装置を設定しよう

Debian GNU/Linux で構築したのでチョー簡単、インストール作業はコマンド一発

$ sudo apt-get install snmpd
ただし設定しないと動き出さないので、下のように /etc/snmp/snmpd.conf を
====================================================== インストール直後の状態
#       sec.name  source          community
com2sec paranoid  default         public
#com2sec readonly  default         public
#com2sec readwrite default         private
======================================================
↓
====================================================== このように変えた
#       sec.name  source          community
#com2sec paranoid  default         public              ←コメントにした
com2sec readonly  172.16.10.13         public          ← 172.16.10.13 からだけアクセス許可した
#com2sec readwrite default         private
======================================================


====================================================== インストール直後の状態
syslocation Unknown (configure /etc/snmp/snmp.local.conf)
syscontact Root  (configure /etc/snmp/snmp.local.conf)
======================================================
↓
====================================================== このように変えた
syslocation Hoge (configure /etc/snmp/snmp.local.conf) ←こんな風に
syscontact hoge                     ←こんな風に
======================================================
のように書き換えて、 snmpd を再起動する
$ sudo /etc/init.d/snmpd restart
これで準備が整ったはず。

今回専用ルータを設定したが CISCO だったので、こんな感じの追加をした。

access-list 1 permit 172.16.10.13  ← 1 の許可グループのなかに  172.16.10.13 を加えた
snmp-server engineID local XXXXXXXXXXXXXXXXXXXXXXXX ← XXXX はマニュアル参照のこと
snmp-server community public RO 1 ← 1 グループに public コミュニティで読み取り専用

観測する側の装置にソフトインストールしよう

Debian GNU/Linux で構築したのでチョー簡単、インストール作業はコマンド一発

$ sudo apt-get install mrtg
うそじゃないよ、これだけで十分だからね。ま、後でツールを入れるけど最低限はこれだけ。

設定しよう

要は snmp を話してくれる装置に「コレコレの情報ちょうだいな」と請求するわけだ。

ツールでちゃんと情報が取れているか確認しよう

Debian GNU/Linux で構築したのでチョー簡単、インストール作業はコマンド一発で終了

$ sudo apt-get install snmp

snmp で情報取得がうまく行くとこんな風になるハズ(要するになんか沢山でてくる)。

$ snmpwalk -v 1 172.16.10.1 public system               ← 172.16.10.1 の装置に対しての問い合わせ
system.sysDescr.0 = Linux dolphin 2.4.18-bf2.4 #1 Son Apr 14 09:53:28 CEST 2002 i686
system.sysObjectID.0 = OID: enterprises.ucdavis.ucdSnmpAgent.linux
system.sysUpTime.0 = Timeticks: (101949953) 11 days, 19:11:39.53
system.sysContact.0 = hoge 
system.sysName.0 = dolphin
system.sysLocation.0 = Hanno (configure /etc/snmp/snmp.local.conf)
system.sysORLastChange.0 = Timeticks: (0) 0:00:00.00
system.sysORTable.sysOREntry.sysORID.1 = OID: ifMIB
system.sysORTable.sysOREntry.sysORID.2 = OID: .iso.org.dod.internet.snmpV2.snmpModules.snmpMIB
system.sysORTable.sysOREntry.sysORID.3 = OID: tcpMIB
system.sysORTable.sysOREntry.sysORID.4 = OID: ip
system.sysORTable.sysOREntry.sysORID.5 = OID: udpMIB
system.sysORTable.sysOREntry.sysORID.6 = OID: .iso.org.dod.internet.snmpV2.snmpModules.snmpVacmMIB.vacmMIBConformance.vacmMIBGroups.vacmBasicGroup
system.sysORTable.sysOREntry.sysORID.7 = OID: .iso.org.dod.internet.snmpV2.snmpModules.snmpFrameworkMIB.snmpFrameworkMIBConformance.snmpFrameworkMIBCompliances.snmpFrameworkMIBCompliance
system.sysORTable.sysOREntry.sysORID.8 = OID: .iso.org.dod.internet.snmpV2.snmpModules.snmpMPDMIB.snmpMPDMIBConformance.snmpMPDMIBCompliances.snmpMPDCompliance
system.sysORTable.sysOREntry.sysORID.9 = OID: .iso.org.dod.internet.snmpV2.snmpModules.snmpUsmMIB.usmMIBConformance.usmMIBCompliances.usmMIBCompliance
system.sysORTable.sysOREntry.sysORDescr.1 = The MIB module to describe generic objects for network interface sub-layers
system.sysORTable.sysOREntry.sysORDescr.2 = The MIB module for SNMPv2 entities
system.sysORTable.sysOREntry.sysORDescr.3 = The MIB module for managing TCP implementations
system.sysORTable.sysOREntry.sysORDescr.4 = The MIB module for managing IP and ICMP implementations
system.sysORTable.sysOREntry.sysORDescr.5 = The MIB module for managing UDP implementations
system.sysORTable.sysOREntry.sysORDescr.6 = View-based Access Control Model for SNMP.
system.sysORTable.sysOREntry.sysORDescr.7 = The SNMP Management Architecture MIB.
system.sysORTable.sysOREntry.sysORDescr.8 = The MIB for Message Processing and Dispatching.
system.sysORTable.sysOREntry.sysORDescr.9 = The management information definitions for the SNMP User-based Security Model.
system.sysORTable.sysOREntry.sysORUpTime.1 = Timeticks: (0) 0:00:00.00
system.sysORTable.sysOREntry.sysORUpTime.2 = Timeticks: (0) 0:00:00.00
system.sysORTable.sysOREntry.sysORUpTime.3 = Timeticks: (0) 0:00:00.00
system.sysORTable.sysOREntry.sysORUpTime.4 = Timeticks: (0) 0:00:00.00
system.sysORTable.sysOREntry.sysORUpTime.5 = Timeticks: (0) 0:00:00.00
system.sysORTable.sysOREntry.sysORUpTime.6 = Timeticks: (0) 0:00:00.00
system.sysORTable.sysOREntry.sysORUpTime.7 = Timeticks: (0) 0:00:00.00
system.sysORTable.sysOREntry.sysORUpTime.8 = Timeticks: (0) 0:00:00.00
system.sysORTable.sysOREntry.sysORUpTime.9 = Timeticks: (0) 0:00:00.00

失敗パターンはこんな感じ

$ snmpwalk -v 1 172.16.10.1 public system
Timeout: No Response from 172.16.10.1
こういうときは、観測される側の装置の snmpd の設定をよく確認しよう。 参考情報としては、こういうパターンにハマった。

情報が取れることがわかったら設定ファイルを作成しよう(トラフィック編)

まずは雛形を mrtg の設定ファイル作成ツールに吐いてもらおう

shibata@dolphin:~$ sudo cfgmaker  public@172.16.10.1
--base: Get Device Info on public@172.16.10.1:
--base: Vendor Id:
--base: Populating confcache
--snpo: confcache public@172.16.10.1: Descr lo --> 1
--snpo: confcache public@172.16.10.1: Descr eth0 --> 2
--snpo: confcache public@172.16.10.1: Ip 127.0.0.1 --> 1
--snpo: confcache public@172.16.10.1: Ip 172.16.10.1 --> 2
--snpo: confcache public@172.16.10.1: Type 24 --> 1
--snpo: confcache public@172.16.10.1: Type 6 --> 2
--snpo: confcache public@172.16.10.1: Eth  --> 1
--snpo: confcache public@172.16.10.1: Eth 00-02-b3-39-af-56 --> 2
--base: Get Interface Info
--base: Walking ifIndex
--base: Walking ifType
--base: Walking ifSpeed
--base: Walking ifAdminStatus
--base: Walking ifOperStatus
# Created by
# /usr/bin/cfgmaker public@172.16.10.1


### Global Config Options

#  for Debian
WorkDir: /var/www/mrtg

#  or for NT
# WorkDir: c:\mrtgdata

### Global Defaults

#  to get bits instead of bytes and graphs growing to the right
# Options[_]: growright, bits


######################################################################
# System: debian
# Description: Linux debian 2.4.18-bf2.4 #1 Son Apr 14 09:53:28 CEST 2002 i686
# Contact: tv-hoge <info@example.com>
# Location: hoge (configure /etc/snmp/snmp.local.conf)
######################################################################


### Interface 1 >> Descr: 'lo' | Name: '' | Ip: '127.0.0.1' | Eth: '' ###
### The following interface is commented out because:
### * it is a Software Loopback interface
#
# Target[172.16.10.1_1]: 1:public@172.16.10.1:
# SetEnv[172.16.10.1_1]: MRTG_INT_IP="127.0.0.1" MRTG_INT_DESCR="lo"
# MaxBytes[172.16.10.1_1]: 1250000
# Title[172.16.10.1_1]: Traffic Analysis for 1 -- debian
# PageTop[172.16.10.1_1]: <H1>Traffic Analysis for 1 -- debian</H1>
#  <TABLE>
#    <TR><TD>System:</TD>     <TD>debian in hoge (configure /etc/snmp/snmp.local.conf)</TD></TR>
#    <TR><TD>Maintainer:</TD> <TD>tv-hoge <info@example.com></TD></TR>
#    <TR><TD>Description:</TD><TD>lo  </TD></TR>
#    <TR><TD>ifType:</TD>     <TD>softwareLoopback (24)</TD></TR>
#    <TR><TD>ifName:</TD>     <TD></TD></TR>
#    <TR><TD>Max Speed:</TD>  <TD>1250.0 kBytes/s</TD></TR>
#    <TR><TD>Ip:</TD>         <TD>127.0.0.1 (localhost)</TD></TR>
#  </TABLE>


### Interface 2 >> Descr: 'eth0' | Name: '' | Ip: '172.16.10.1' | Eth: '00-02-b3-39-af-56' ###

Target[172.16.10.1_2]: 2:public@172.16.10.1:
SetEnv[172.16.10.1_2]: MRTG_INT_IP="172.16.10.1" MRTG_INT_DESCR="eth0"
MaxBytes[172.16.10.1_2]: 1250000
Title[172.16.10.1_2]: Traffic Analysis for 2 -- debian
PageTop[172.16.10.1_2]: <H1>Traffic Analysis for 2 -- debian</H1>
 <TABLE>
   <TR><TD>System:</TD>     <TD>debian in hoge (configure /etc/snmp/snmp.local.conf)</TD></TR>
   <TR><TD>Maintainer:</TD> <TD>tv-hoge <info@example.com></TD></TR>
   <TR><TD>Description:</TD><TD>eth0  </TD></TR>
   <TR><TD>ifType:</TD>     <TD>ethernetCsmacd (6)</TD></TR>
   <TR><TD>ifName:</TD>     <TD></TD></TR>
   <TR><TD>Max Speed:</TD>  <TD>1250.0 kBytes/s</TD></TR>
   <TR><TD>Ip:</TD>         <TD>172.16.10.1 (proxy001.intra.example.com)</TD></TR>
 </TABLE>

まず、 # Created by の行の後ろから全部をコピーして設定ファイルとして /etc/mrtg ディレクトリの下にでも放り込んでおこう。

設定ファイルをそのままだと使いにくいので、下のように変えた。

====================================================== 設定ツールが吐いた状態
### Global Config Options

#  for Debian
WorkDir: /var/www/mrtg

#  or for NT
# WorkDir: c:\mrtgdata
======================================================
↓
====================================================== このように変えた
### Global Config Options

#  for Debian
WorkDir: /var/www/mrtg/status/proxy001-example-com/data/traffic
WriteExpires: Yes
Options[_]: growright, bits
IconDir: http://dolphin.intra.example.com/mrtg

#  or for NT
# WorkDir: c:\mrtgdata
======================================================

情報が取れることがわかったら設定ファイルを作成しよう( CPU 負荷編)

基本は同じなので、ファイルをコピーして CPU 負荷ように変更しよう。ポイントは「 Target[localhost_load]: 1.3.6.1.4.1.2021.10.1.5.2&1.3.6.1.4.1.2021.10.1.5.3:public@172.16.10.1 」 のところだ。なんだかよくわからんがコレで CPU 負荷が取れるらしい。(笑)…いやちゃんと書くと MIB で定義されているオブジェクト(自分でオリジナルな定義もできる)を指定しているわけで、ツリー構造をしているそのひとつを指定するわけ。上のトラフィック情報のファイルと一緒にできるがマズは基本に忠実に別ファイルで記述しておく。

# Created by
# /usr/bin/cfgmaker public@localhost


### Global Config Options

#  for Debian
WorkDir: /var/www/mrtg/status/proxy001-intra-example-com/data
WriteExpires: Yes
Options[_]: gauge,absolute,growright,nopercent
IconDir: http://dolphin.intra.example.com/mrtg

#  or for NT
# WorkDir: c:\mrtgdata

### Global Defaults

#  to get bits instead of bytes and graphs growing to the right
# Options[_]: growright, bits


######################################################################
# System: proxy001.intra.example.com
# Description: Linux dolphin 2.4.18-bf2.4 #1 Son Apr 14 09:53:28 CEST 2002 i686
# Contact: hoge <info@example.com>
# Location: Hanno (configure /etc/snmp/snmp.local.conf)
######################################################################


Target[localhost_load]: 1.3.6.1.4.1.2021.10.1.5.2&1.3.6.1.4.1.2021.10.1.5.3:public@172.16.10.1
Directory[localhost_load]: cpu
MaxBytes[localhost_load]: 100
#WithPeak[localhost_load]: mw
YLegend[localhost_load]: Load Average (%)
#LegendI[localhost_load]:
#LegendO[localhost_load]:
ShortLegend[localhost_load]: %
#Unscaled[localhost_load]: dwmy
Title[localhost_load]: CPU USAGE -- proxy001.intra.example.com
PageTop[localhost_load]: <H1> CPU USAGE -- proxy001.intra.example.com</H1>
 <TABLE>
   <TR><TD>System:</TD>     <TD>porxy001.intra.example.com in Hanno (configure /etc/snmp/snmp.local.conf)</TD></TR>
   <TR><TD>Maintainer:</TD> <TD>hoge <info@example.com></TD></TR>
   <TR><TD>Description:</TD><TD>proxy001.intra.example.com  </TD></TR>
 </TABLE>

設定ファイルとして /etc/mrtg ディレクトリの下に cpu 負荷用ファイルとしてでも放り込んでおこう。

実際に動かしてみよう

ではちゃんとファイルができるか確認してみよう。

shibata@dolphin:~$ sudo mrtg /etc/mrtg/status/proxysrv001-intra-example-com/cpu.cfg          ← 一回目なので下にエラーがでる
Rateup WARNING: /usr/bin/rateup could not read the primary log file for localhost_load
Rateup WARNING: /usr/bin/rateup The backup log file for localhost_load was invalid as well
Rateup WARNING: /usr/bin/rateup Can't remove localhost_load.old updating log file
Rateup WARNING: /usr/bin/rateup Can't rename localhost_load.log to localhost_load.old updating log file
shibata@dolphin:~$ sudo mrtg /etc/mrtg/status/proxysrv001-intra-example-com/cpu.cfg          ← 二回目なので下にエラーがでる
Rateup WARNING: /usr/bin/rateup Can't remove localhost_load.old updating log file
shibata@dolphin:~$ sudo mrtg /etc/mrtg/status/proxysrv001-intra-example-com/cpu.cfg          ← もう出ない
shibata@dolphin:~$ sudo mrtg /etc/mrtg/status/proxysrv001-intra-example-com/cpu.cfg          ← もう出ない
shibata@dolphin:~$ sudo mrtg /etc/mrtg/status/proxysrv001-intra-example-com/cpu.cfg          ← もう出ない
shibata@dolphin:~$ sudo mrtg /etc/mrtg/status/proxysrv001-intra-example-com/traffic.cfg
Rateup WARNING: /usr/bin/rateup could not read the primary log file for 172.16.10.1_2          ← 一回目なので下にエラーがでる
Rateup WARNING: /usr/bin/rateup The backup log file for 172.16.10.1_2 was invalid as well
Rateup WARNING: /usr/bin/rateup Can't remove 172.16.10.1_2.old updating log file
Rateup WARNING: /usr/bin/rateup Can't rename 172.16.10.1_2.log to 172.16.10.1_2.old updating log file
shibata@dolphin:~$ sudo mrtg /etc/mrtg/status/proxysrv001-intra-example-com/traffic.cfg          ← 二回目なので下にエラーがでる
Rateup WARNING: /usr/bin/rateup Can't remove 172.16.10.1_2.old updating log file
shibata@dolphin:~$ sudo mrtg /etc/mrtg/status/proxysrv001-intra-example-com/traffic.cfg          ← もう出ない
shibata@dolphin:~$ sudo mrtg /etc/mrtg/status/proxysrv001-intra-example-com/traffic.cfg          ← もう出ない
shibata@dolphin:~$ sudo mrtg /etc/mrtg/status/proxysrv001-intra-example-com/traffic.cfg          ← もう出ない
とまぁ、エラーが出るわけだが、最初はエラーがでるものだから、気にせず二回実行しよう。

「WorkDir: /var/www/mrtg/status/proxy001-intra-example-com/data」と書いたらソコにファイルができてるか見てみよう。

shibata@dolphin:~$ ls -l /var/www/mrtg/status/proxy001-intra-example-com/data/cpu/
total 140
-rw-r--r--    1 root     root         3402 Aug 14 10:52 localhost_load-day.png
-rw-r--r--    1 root     root           39 Aug 14 10:52 localhost_load-day.png.meta
-rw-r--r--    1 root     root         2052 Aug 14 10:32 localhost_load-month.png
-rw-r--r--    1 root     root           39 Aug 14 10:32 localhost_load-month.png.meta
-rw-r--r--    1 root     root         2714 Aug 14 10:32 localhost_load-week.png
-rw-r--r--    1 root     root           39 Aug 14 10:32 localhost_load-week.png.meta
-rw-r--r--    1 root     root         1880 Aug 13 14:12 localhost_load-year.png
-rw-r--r--    1 root     root           39 Aug 13 14:12 localhost_load-year.png.meta
-rw-r--r--    1 root     root         7898 Aug 14 10:52 localhost_load.html
-rw-r--r--    1 root     root           39 Aug 14 10:52 localhost_load.html.meta
-rw-r--r--    1 root     root        48251 Aug 14 10:52 localhost_load.log
-rw-r--r--    1 root     root        48251 Aug 14 10:47 localhost_load.old
ブラウザで該当のファイル(ここでは localhost_load.html )を見てみれば OK だ。

実運用編

MRTG はそのままでは定時運用されないので、 cron でまわそう。 Debian の場合は /etc/cron.d/mrtg ファイルができているのでソコに書き加えよう。

2-57/5 *        * * *   root    if [ -x /usr/bin/mrtg ] && [ -r /etc/mrtg/status/proxy001-intra-example-com/cpu.cfg ]; then /usr/bin/mrtg /etc/mrtg/status/proxy001-intra-example-com/cpu.cfg >> /var/log/mrtg/proxy001-intra-example-com-cpu.log 2>&1; fi
2-57/5 *        * * *   root    if [ -x /usr/bin/mrtg ] && [ -r /etc/mrtg/status/proxy001-intra-example-com/traffic.cfg ]; then /usr/bin/mrtg /etc/mrtg/status/proxy001-intra-example-com/traffic.cfg >> /var/log/mrtg/proxy001-intra-example-com-traffic.log 2>&1; fi
あとはグラフを見て悦に入る(笑)もよし、しっかり確認して上司に提言するもよし。

グラフの例

グラフとしてはこんな感じになろう。 参考に CPU 稼働率とトラフィックのペイジの上の方を切り出して下に例示する。 暇なサーバ( CPU の稼動がすくない)ならもっと仕事させてもいいし、忙しいサーバなら台数増やして不可分散をしてもよいだろう。

CPU USAGE -- localhost

System: localhost (configure /etc/snmp/snmp.local.conf)
Maintainer: hoge <hoge@example.com>
Description:localhost


The statistics were last updated Monday, 29 November 2004 at 10:32,
at which time 'localhost' had been up for 13 days, 8:19:34.
`Daily' Graph (5 Minute Average)
day
Max  In: 93.0 % Average  In: 8.0 % Current  In: 10.0 %
Max  Out: 54.0 % Average  Out: 6.0 % Current  Out: 2.0 %

Traffic Analysis for 2 -- Router

System: Router in
Maintainer: hoge <hoge@example.com>
Description:FastEthernet0/1
ifType: ethernetCsmacd (6)
ifName: Fa0/1
Max Speed: 12.5 MBytes/s
Ip: 192.168.1.1 ()


The statistics were last updated Monday, 29 November 2004 at 10:10,
at which time 'Router' had been up for 320 days, 2:12:41.
`Daily' Graph (5 Minute Average)
day
Max  In: 9734.1 kb/s (9.7%) Average  In: 4603.9 kb/s (4.6%) Current  In: 5719.0 kb/s (5.7%)
Max  Out: 2028.9 kb/s (2.0%) Average  Out: 889.6 kb/s (0.9%) Current  Out: 763.5 kb/s (0.8%)

Memorandum about Linux and Network | ほかのジャンルを見てみる | サイトマップ

免責

beacon

当方(SHIBATA Akira)は, 本サイトをご利用の際に起きるかもしれない不利益に対し, 一切責任を負いません.