■今回の材料は以下の通り。
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 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
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 '
# 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
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
■最終チェック
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}'」にパイプすれば良い。
四捨五入は後で考える。。。
□
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
2.40857
99.9725
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
■左側が更新するようにデフォルトの動作に戻すには
各所の「Options[*]:」の「growright」指定を削除する