Debian Lenny + MRTGでCPU、メモリ、ディスク監視

■今回の材料は以下の通り。

 debian lenny でのローカルからのSNMP
 http://d.hatena.ne.jp/labunix/20110719

 debian squeezeにMRTGを導入する。
 http://d.hatena.ne.jp/labunix/20110718

 自分のブログのダメ出し4 2008R2のMRTG
 http://d.hatena.ne.jp/labunix/20111115

 debian squeezeを動画再生サーバにする
 http://d.hatena.ne.jp/labunix/20120109

■debian lennyにMRTGを導入

$ sudo apt-get install apache2 mrtg snmp snmpd snmptrapfmt
$ snmpwalk -v 1 localhost -c public | wc -l
32
$ snmpwalk -v 1 localhost -c public system | wc -l
32

$ sudo mkdir /var/www/mrtg
$ whereis -b mrtg
mrtg: /usr/bin/mrtg /etc/mrtg.cfg /usr/share/mrtg

■2012/01/14追記
 ※以下はmrtgのcrontabへの登録は不要

$ sudo env EDITOR=vim crontab -e
$ sudo env EDITOR=vim crontab -l | grep -v "^#\|^\$"
*/5 * * * * env LANG=C /usr/bin/mrtg /etc/mrtg.cfg 2>&1 | tee -a /var/log/mrtg/mrtg.log

 ※mrtgのインストール時に作られる。

$ dpkg -L mrtg | grep cron
/etc/cron.d
/etc/cron.d/mrtg

$ sudo cat /etc/cron.d/mrtg
*/5 *   * * *   root    if [ -x /usr/bin/mrtg ] && [ -r /etc/mrtg.cfg ]; then env LANG=C /usr/bin/mrtg 
/etc/mrtg.cfg 2>&1 | tee -a /var/log/mrtg/mrtg.log ; fi

■mrtgの初回動作時にはまず画像を置く。

$ ls /var/www/mrtg/
mrtg-l.png  mrtg-m.png  mrtg-r.png

■mrtgの動作チェック

$ sudo tail -f /var/log/mrtg/mrtg.log

 参考:SNMP and MRTG on Sarge quick start
 http://www.debian-administration.org/articles/366

■debian lennyにsnmpdを設定

$ grep -v "^#\|^\$" /etc/snmp/snmpd.conf  | head -1
com2sec paranoid  default         public

$ sudo vim /etc/snmp/snmpd.cof
$ grep -v "^#\|^\$" /etc/snmp/snmpd.conf  | head -3
com2sec readonly default            public
com2sec readonly 127.0.0.1         public
com2sec readonly 192.168.72.0/24    public

$ sudo /etc/init.d/snmpd restart
$ snmpwalk -v 1 localhost -c public system | wc -l
31

$ sudo grep [snmp] /var/log/syslog | grep Connection | cut -c 45- | tail -1
 Connection from UDP: [127.0.0.1]:56439

■MIBの検索、出力、入力に使うオプション

$ snmptranslate -h 2>&1 | grep -A 9 "\-T" | grep "T\|B:\|p:"
  -T TRANSOPTS          Set various options controlling report produced:
                          B:  print all matching objects for a regex search
                          p:  print tree format symbol table

$  snmptranslate -h 2>&1 | grep -A 18 "\-O" | grep "\-O\|n:"
  -O OUTOPTS            Toggle various defaults controlling output display:
                          n:  print OIDs numerically

$  snmptranslate -h 2>&1 | grep -A 18 "\-I" | grep "\-I\|R:"
  -I INOPTS             Toggle various defaults controlling input parsing:
                          R:  do random access to OID labels

■CPUの使用率のMIBチェック
  ※計算式:100-idle値(%)

$ snmptranslate -On -IR system
.1.3.6.1.2.1.1

$ snmptranslate -TB Cpu
UCD-SNMP-MIB::ssCpuRawSoftIRQ

$ snmptranslate -On -IR ssCpuRawSoftIRQ
1.3.6.1.4.1.2021.11.61

$ snmptranslate -Tp 1.3.6.1.4.1.2021.11 | grep Cpu | head -3
   +-- -R-- Integer32 ssCpuUser(9)
   +-- -R-- Integer32 ssCpuSystem(10)
   +-- -R-- Integer32 ssCpuIdle(11)

$ snmptranslate -On -IR ssCpuIdle
.1.3.6.1.4.1.2021.11.11

$ snmpwalk -c public -v 1 localhost ssCpuIdle
UCD-SNMP-MIB::ssCpuIdle.0 = INTEGER: 98

$ echo -n "CPU使用率(%): ";snmpwalk -c public -v 1 localhost ssCpuIdle | awk -F\: '{print 100-$4}'
CPU使用率(%)1

■メモリ空き容量(平均)のMIBチェック
 ※計算式:(平均空き容量/総メモリ量)*100
 ※計算式:(平均スワップ空き容量/総スワップ容量)*100

$ snmptranslate -TB Mem | head -1
UCD-SNMP-MIB::memory

$ snmptranslate -On -IR memory
.1.3.6.1.4.1.2021.4

$ snmptranslate -Tp .1.3.6.1.4.1.2021.4 | grep Avail | head 2
   +-- -R-- Integer32 memAvailSwap(4)
   +-- -R-- Integer32 memAvailReal(6)

$ snmptranslate -Tp .1.3.6.1.4.1.2021.4 | grep Total | head -2
   +-- -R-- Integer32 memTotalSwap(3)
   +-- -R-- Integer32 memTotalReal(5)

$ snmpwalk -c public -v 1 localhost memAvailReal
UCD-SNMP-MIB::memAvailReal.0 = INTEGER: 43956 kB

$ echo -n "メモリ空き容量(%) : "; echo $( \
snmpwalk -c public -v 1 localhost memTotalReal | awk '{print $4}'; \
snmpwalk -c public -v 1 localhost memAvailReal | awk '{print $4}') | awk '{print ($2/$1)*100}'
メモリ空き容量(%) : 2.08191

$ echo -n "スワップ空き容量(%): "; echo $( \
snmpwalk -c public -v 1 localhost memTotalSwap | awk '{print $4}'; \
snmpwalk -c public -v 1 localhost memAvailSwap | awk '{print $4}') | awk '{print ($2/$1)*100}'
スワップ空き容量(%): 99.9729

■ディスクの使用率
 ※ディスク構成によって変化、またsnmpd.confの設定変更が必要。

$ snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.2021.13.15.1.1.2 | grep sda
UCD-DISKIO-MIB::diskIODevice.18 = STRING: sda
UCD-DISKIO-MIB::diskIODevice.19 = STRING: sda1
UCD-DISKIO-MIB::diskIODevice.20 = STRING: sda2
UCD-DISKIO-MIB::diskIODevice.21 = STRING: sda3

$ sudo fdisk -l /dev/sda | awk '{print $1}' | grep \/ | column
/dev/sda1       /dev/sda2       /dev/sda3

■以下のようにデバイスの番号を付与してIOReads/Writesを得る。

$ snmptranslate -On -IR diskIODevice
.1.3.6.1.4.1.2021.13.15.1.1.2

$ snmptranslate -On -IR diskIOReads
.1.3.6.1.4.1.2021.13.15.1.1.5

$ snmptranslate -On -IR diskIOWrites
.1.3.6.1.4.1.2021.13.15.1.1.6

$ for list in diskIODevice diskIOReads diskIOWrites;do \
     snmpwalk -c public -v 1 localhost "$list".21 | awk '{print $4}'; \
   done | xargs echo -n | awk '{print "Device : " $1 "\tIOReads : " $2 "\tIOWrites : " $3}'
Device : sda3   IOReads : 72178 IOWrites : 234001

■「snmpd.conf」の修正

$ sudo grep ^disk /etc/snmp/snmpd.conf
$ sudo vim /etc/snmp/snmpd.conf
$ sudo grep ^disk /etc/snmp/snmpd.conf
disk / 10000

$ sudo /etc/init.d/snmpd restart

■「/dev/sda1」のシステムディスクの使用率を得る

$ snmptranslate -On -IR dskTotal
.1.3.6.1.4.1.2021.9.1.6

$ snmptranslate -On -IR dskAvail
.1.3.6.1.4.1.2021.9.1.7

$ snmptranslate -On -IR dskPercent
.1.3.6.1.4.1.2021.9.1.9

$ snmptranslate -On -IR dskPercentNode
.1.3.6.1.4.1.2021.9.1.10

$ echo -n "ディスク使用率(%) : "; echo $( \
  snmpwalk -c public -v 1 localhost dskDevice | awk '{print $4}'; \
  snmpwalk -c public -v 1 localhost dskPercent | awk '{print $4}')
ディスク使用率(%) : /dev/sda1 15

$ df | grep sda1 | awk '{print $5}'
16%

■「/dev/sda1」のシステムディスクのi-node使用率を得る

$ snmpwalk -c public -v 1 localhost dskPercentNode
UCD-SNMP-MIB::dskPercentNode.1 = INTEGER: 3

$ df -i | grep sda1 | awk '{print $5}'
3%

■mrtgの設定に戻る
 ※「LANG=C」指定は必須

$ sudo cfgmaker --global 'WorkDir: /var/www/mrtg' --output /etc/mrtg.cfg public@127.0.0.1
$ sudo indexmaker /etc/mrtg.cfg --columns=1 --output /var/www/mrtg/index.html
$ sudo mrtg
-----------------------------------------------------------------------
ERROR: Mrtg will most likely not work properly when the environment
       variable LANG is set to UTF-8. Please run mrtg in an environment
       where this is not the case. Try the following command to start:
       env LANG=C /usr/bin/mrtg
-----------------------------------------------------------------------

$ sudo LANG=C mrtg
2012-01-09 21:54:01, Rateup WARNING: /usr/bin/rateup Can't remove 127.0.0.1_2.old updating log file
2012-01-09 21:54:01, Rateup WARNING: /usr/bin/rateup Can't remove 127.0.0.1_9.old updating log file
2012-01-09 21:54:01, Rateup WARNING: /usr/bin/rateup Can't remove 127.0.0.1_10.old updating log file
$ sudo LANG=C mrtg
$ ls /var/www/mrtg/
127.0.0.1_10-day.png    127.0.0.1_2-week.png   127.0.0.1_9.html
127.0.0.1_10-month.png  127.0.0.1_2-year.png   127.0.0.1_9.log
127.0.0.1_10-week.png   127.0.0.1_2.html       127.0.0.1_9.old
127.0.0.1_10-year.png   127.0.0.1_2.log        index.html
127.0.0.1_10.html       127.0.0.1_2.old        mrtg-l.png
127.0.0.1_10.log        127.0.0.1_9-day.png    mrtg-m.png
127.0.0.1_10.old        127.0.0.1_9-month.png  mrtg-r.png
127.0.0.1_2-day.png     127.0.0.1_9-week.png
127.0.0.1_2-month.png   127.0.0.1_9-year.png

■mrtg.cfgに追加されるCPU情報のチェック

$ snmptranslate -Tp .1.3.6.1.4.1.2021.10.1.1
+-- -R-- Integer32 laIndex(1)
         Range: 0..3

$ snmptranslate -Tp .1.3.6.1.4.1.2021.10.1.2
+-- -R-- String    laNames(2)
         Textual Convention: DisplayString
         Size: 0..255

$ snmpwalk -c public -v 1 localhost  laIndex
UCD-SNMP-MIB::laIndex.1 = INTEGER: 1
UCD-SNMP-MIB::laIndex.2 = INTEGER: 2
UCD-SNMP-MIB::laIndex.3 = INTEGER: 3

$ snmpwalk -c public -v 1 localhost  laNames
UCD-SNMP-MIB::laNames.1 = STRING: Load-1
UCD-SNMP-MIB::laNames.2 = STRING: Load-5
UCD-SNMP-MIB::laNames.3 = STRING: Load-15

■mrtgにCPU情報チェックを追加

# echo "CPU"; \
  echo '
# CPU Load Average

Options[cpu]: gauge,absolute,integer,nopercent,growright
MaxBytes[cpu]: 100
YLegend[cpu]: CPU Load Average (%)
Legend1[cpu]: 1 min CPU Load Average
Legend2[cpu]: 5 min CPU Load Average
LegendI[cpu]: 1min
LegendO[cpu]: 5min
ShortLegend[cpu]: percent (%)
Unscaled[cpu]: dwmy
Target[cpu]: .1.3.6.1.4.1.2021.10.1.5.1&.1.3.6.1.4.1.2021.10.1.5.2:public@localhost
Title[cpu]: CPU Load Average
PageTop[cpu]: <H1>CPU Load Average</H1>
  ' >> /etc/mrtg.cfg
CPU

# LANG=C mrtg && echo "ok"
ok

■mrtg.cfgに追加されるメモリ情報チェック

$ snmptranslate -Tp .1.3.6.1.4.1.2021.4.6.0
+-- -R-- Integer32 memAvailReal(6)

$ snmptranslate -Tp .1.3.6.1.4.1.2021.4.4.0
+-- -R-- Integer32 memAvailSwap(4)

$ snmptranslate -Tp .1.3.6.1.4.1.2021.4.5.0
+-- -R-- Integer32 memTotalReal(5)

$ MEMREALMAX=$(snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.4.5.0 | awk '{print $4}')
$ echo $MEMREALMAX
1997200

$ snmptranslate -Tp .1.3.6.1.4.1.2021.4.3.0
+-- -R-- Integer32 memTotalSwap(3)

$ MEMSWAPMAX=$(snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.4.3.0 | awk '{print $4}')
$ echo $MEMSWAPMAX
6146184

■mrtg.cfgにメモリ情報チェックを追加

# echo "MEM"; \
  echo '
# Memory

Target[memory]: .1.3.6.1.4.1.2021.4.6.0&.1.3.6.1.4.1.2021.4.4.0:public@localhost
MaxBytes1[memory]: '${MEMREALMAX}'
MaxBytes2[memory]: '${MEMSWAPMAX}'
Options[memory]: gauge,absolute,growright
Unscaled[memory]: dwmy
kMG[memory]: k,M
Title[memory]: Memory Free
PageTop[memory]: <H1>Memory Free</H1>
YLegend[memory]: Memory Free(Bytes)
ShortLegend[memory]: (Bytes)
Legend1[memory]: Real Memory
Legend2[memory]: Swap Memory
LegendI[memory]: Real
LegendO[memory]: Swap
  ' >> /etc/mrtg.cfg
MEM

■mrtg.cdfに追加されるディスク情報の確認

$ snmptranslate -Tp  .1.3.6.1.4.1.2021.9.1.9.1
+-- -R-- Integer32 dskPercent(9)

$ snmpwalk -v 1 -c public localhost dskPercent
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 15

#echo "Disk";
 DISKSIZE=$(df -h | grep sda1 | awk '{print $2}'); \
 echo '
# Disk Space Watch

Target[disk]: .1.3.6.1.4.1.2021.9.1.9.1&.1.3.6.1.4.1.2021.9.1.9.1:public@localhost
MaxBytes[disk]: 100
Unscaled[disk]: dwmy
Options[disk]: gauge,absolute,nopercent,noinfo,growright
YLegend[disk]: Disk Used(%)
ShortLegend[disk]: (%)
LegendI[disk]: / Disk used
LegendO[disk]: / Disk Used
Legend1[disk]: / Disk used
Legend2[disk]: / Disk used
Title[disk]: Disk Used /
PageTop[disk]: <h1>Disk Used /</h1>
 <div id="sysdetails">
 <table>
  <tr>
  <td>System:</td>
  <td>webserver</td>
  </tr>
  <tr>
  <td>Maintainer:</td>
  <td>Root <root@localhost> </td>
  </tr>
  <tr>
  <td>Capacity of disk</td>
  <td>'${DISKSIZE}'</td>
  </tr>
 </table>
 </div>
  ' >> /etc/mrtg.cfg
Disk

■最終チェック

# indexmaker /etc/mrtg.cfg --columns=1 --output /var/www/mrtg/index.html
# ls /var/www/mrtg
127.0.0.1_10-day.png    127.0.0.1_2.log        cpu-year.png    memory-day.png
127.0.0.1_10-month.png  127.0.0.1_2.old        cpu.html        memory-month.png
127.0.0.1_10-week.png   127.0.0.1_9-day.png    cpu.log         memory-week.png
127.0.0.1_10-year.png   127.0.0.1_9-month.png  cpu.old         memory-year.png
127.0.0.1_10.html       127.0.0.1_9-week.png   disk-day.png    memory.html
127.0.0.1_10.log        127.0.0.1_9-year.png   disk-month.png  memory.log
127.0.0.1_10.old        127.0.0.1_9.html       disk-week.png   memory.old
127.0.0.1_2-day.png     127.0.0.1_9.log        disk-year.png   mrtg-l.png
127.0.0.1_2-month.png   127.0.0.1_9.old        disk.html       mrtg-m.png
127.0.0.1_2-week.png    cpu-day.png            disk.log        mrtg-r.png
127.0.0.1_2-year.png    cpu-month.png          disk.old
127.0.0.1_2.html        cpu-week.png           index.html

$ iceweasel http://`hostname -f`/mrtg &

■何故メモリの空き容量だけ100%表示ではないのだろうか。
 というわけで空き容量の%を求めるスクリプトを書いた。
 以下のように使用量を求めるには、100から引くのも良い。

 変更前:awk '{print ($1/$2)*100}'
 変更後:awk '{print 100-(($1/$2)*100)'

□追記
 「/var/www/mrtg/mem.log」を見ると整数値しか無い。
 小数点以下切捨てであれば単に「awk -F\. '{print $1}'」にパイプすれば良い。
 四捨五入は後で考える。。。
□

# cat /usr/local/bin/mem.sh
#!/bin/sh

MEMSWAPMAX=$(snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.4.3.0 | awk '{print $4}')
MEMSWAPAVG=$(snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.4.4.0 | awk '{print $4}')
MEMREALMAX=$(snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.4.5.0 | awk '{print $4}')
MEMREALAVG=$(snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.4.6.0 | awk '{print $4}')

echo "${MEMREALAVG} ${MEMREALMAX}" | awk '{print ($1/$2)*100}'
echo "${MEMSWAPAVG} ${MEMSWAPMAX}" | awk '{print ($1/$2)*100}'
uptime | awk '{print $3 $4}'
/bin/hostname
exit 0
 
# chmod +x /usr/local/bin/mem.sh
# mem.sh
2.40857
99.9725

# echo "Mem Percent"; \
  echo '
# Mem Free Average
 
Options[mem]: gauge,absolute,integer,nopercent,growright
MaxBytes[mem]: 100
YLegend[mem]: MEM Free Average (%)
Legend1[mem]: Real MEM Free Average
Legend2[mem]: Swap MEM Free Average
LegendI[mem]: Real
LegendO[mem]: Swap
ShortLegend[mem]: percent (%)
Unscaled[mem]: dwmy
Target[mem]: `/usr/local/bin/mem.sh`
Title[mem]: MEM Free Average
PageTop[mem]: <H1>MEM Free Average</H1>
' >> mrtg.cfg
Mem Percent

# LANG=C mrtg
# indexmaker /etc/mrtg.cfg --columns=1 --output /var/www/mrtg/index.html

■左側が更新するようにデフォルトの動作に戻すには
 各所の「Options[*]:」の「growright」指定を削除する