MRTGでディスクIO、メモリキャッシュの情報取得

■前回のあらすじ。

 Debian Lenny + MRTGでCPU、メモリ、ディスク監視
 http://d.hatena.ne.jp/labunix/20120110

■snmptranslateのツリーから「miblist.txt」を作成

$ snmptranslate -Tp | grep Integer | \
   sed s/" "/"\n"/g | sort | uniq | \
   grep -v "Integer\|\-\||" | awk -F \( '{print $1}' > miblist.txt
$ wc -l miblist.txt
160 miblist.txt

■ループを使ってごっそり取得。

$ for list in `cat miblist.txt`;do snmpwalk -v 1 -c public localhost ${list};done > miblist.check

■使えないと思われる最後の値が「0」のリスト

$ grep " 0\$" miblist.check > zero_miblist.txt

■使えると思われる最後の値が「0」以外のリスト

$ grep -v " 0\$" miblist.check > use_miblist.txt

■「essy_miblist.txt」として保存、一覧する

$ awk -F\. '{print $1}' use_miblist.txt | grep -v "Index\|End" | uniq | sed s/".*::"//g > easy_miblist.txt
$ column -c 100 easy_miblist.txt
dskAvail                        inetCidrRouteMetric3            memTotalReal
dskMinPercent                   inetCidrRouteMetric4            memTotalSwap
dskMinimum                      inetCidrRouteMetric5            mteResourceSampleMinimum
dskPercent                      ipCidrRouteMetric2              nsModuleTimeout
dskPercentNode                  ipCidrRouteMetric3              ssCpuIdle
dskTotal                        ipCidrRouteMetric4              ssCpuSystem
dskUsed                         ipCidrRouteMetric5              ssCpuUser
hrMemorySize                    ipDefaultTTL                    ssIOReceive
hrProcessorLoad                 ipReasmTimeout                  ssIOSent
hrSWRunPerfCPU                  ipv6IpDefaultHopLimit           ssSwapIn
hrSWRunPerfMem                  laLoadInt                       ssSwapOut
hrStorageAllocationUnits        logMatchMaxEntries              ssSysContext
hrStorageSize                   memAvailReal                    ssSysInterrupts
hrStorageUsed                   memAvailSwap                    tcpConnLocalPort
hrSystemInitialLoadDevice       memBuffer                       tcpConnRemPort
ifMtu                           memCached                       tcpMaxConn
ifNumber                        memMinimumSwap                  tcpRtoMax
inetCidrRouteMetric1            memShared                       tcpRtoMin
inetCidrRouteMetric2            memTotalFree                    udpLocalPort

■ディスクIOを知りたいが、OBJECTの名前が正しいか不安。。。

$ vmstat | cut -c 45-56
-----io----
   bi    bo
     8     9

$ grep IO easy_miblist.txt
ssIOReceive
ssIOSent

■データを取ってみる

$ snmpwalk -v 1 -c public localhost ssIOSent
UCD-SNMP-MIB::ssIOSent.0 = INTEGER: 43 blocks/s

$ snmpwalk -v 1 -c public localhost ssIOReceive
UCD-SNMP-MIB::ssIOReceive.0 = INTEGER: 0 blocks/s

■各OIDと一つ上位のOIDを引いてみる。

$ snmptranslate -On -IR ssIOReceive
.1.3.6.1.4.1.2021.11.6

$ snmptranslate -On -IR ssIOSent
.1.3.6.1.4.1.2021.11.5

$ snmptranslate -Tp .1.3.6.1.4.1.2021.11 | head -1
+--systemStats(11)

■データを取って見た際の「::」の左側がMIBファイルの名前。
 debianでは「/usr/share/snmp/mibs」配下にある。
 以下の通り期待している値であることが分かる。

$ grep -A 26 ssIOSent /usr/share/snmp/mibs/UCD-SNMP-MIB.txt
ssIOSent OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "blocks/s"
    MAX-ACCESS  read-only
    STATUS      deprecated
    DESCRIPTION
        "The average amount of data written to disk or other
         block device, calculated over the last minute.

         This object has been deprecated in favour of
         'ssIORawSent(57)', which can be used to calculate
         the same metric, but over any desired time period."
    ::= { systemStats 5 }

ssIOReceive OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "blocks/s"
    MAX-ACCESS  read-only
    STATUS      deprecated
    DESCRIPTION
        "The average amount of data read from disk or other
         block device, calculated over the last minute.

         This object has been deprecated in favour of
         'ssIORawReceived(58)', which can be used to calculate
         the same metric, but over any desired time period."
    ::= { systemStats 6 }

■最大値が必要。
 ※ファイルシステム、ディスクサイズによって異なる。

 参考:ext3フォーマット時のブロックサイズ
 http://blog.hirokikana.com/?p=104

$ whereis -b dumpe2fs
dumpe2fs: /sbin/dumpe2fs

■最大値とブロックサイズを得る。

$ sudo /sbin/dumpe2fs /dev/sda1 | grep "Block size\|Block count"
dumpe2fs 1.41.3 (12-Oct-2008)
Block count:              12207384
Block size:               4096

■mrtg.cfg用のチェック

$ snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.11.5.0
UCD-SNMP-MIB::ssIOSent.0 = INTEGER: 2 blocks/s

$ snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.11.6.0
UCD-SNMP-MIB::ssIOReceive.0 = INTEGER: 0 blocks/s

■「mrtg.cfg」に追加

# BLOCKMAX=$(/sbin/dumpe2fs /dev/sda1 | grep "Block count" | awk -F\: '{print $2}')
dumpe2fs 1.41.3 (12-Oct-2008)

# echo $BLOCKMAX
12207384

# echo "add DiskIO"; \
   echo '
# IO Sent/Reveive

Target[DiskIO]: .1.3.6.1.4.1.2021.11.5.0&.1.3.6.1.4.1.2021.11.6.0:public@localhost
MaxBytes1[DiskIO]: '${BLOCKMAX}'
MaxBytes2[DiskIO]: '${BLOCKMAX}'
Options[DiskIO]: gauge,absolute,growright
Unscaled[DiskIO]: dwmy
Title[DiskIO]: Disk Sent / Reveive
PageTop[DiskIO]: <H1>Disk Sent / Reveive</H1>
YLegend[DiskIO]: Disk Sent / Reveive(Blocks/s)
ShortLegend[DiskIO]: (Blocks)
Legend1[DiskIO]: Disk Sent Blocks
Legend2[DiskIO]: Disk Reveive Blocks
LegendI[DiskIO]: Sent
LegendO[DiskIO]: Reveive
  ' >> /etc/mrtg.cfg
add DiskIO

■mrtgコマンドでhtml作成

$ sudo LANG=C mrtg
2012-01-11 22:50:29, Rateup WARNING: /usr/bin/rateup could not read the primary log file for diskio
2012-01-11 22:50:29, Rateup WARNING: /usr/bin/rateup The backup log file for diskio was invalid as well
2012-01-11 22:50:29, Rateup WARNING: /usr/bin/rateup Can't remove diskio.old updating log file
2012-01-11 22:50:29, Rateup WARNING: /usr/bin/rateup Can't rename diskio.log to diskio.old updating log file
$ sudo LANG=C mrtg
2012-01-11 22:50:32, Rateup WARNING: /usr/bin/rateup Can't remove diskio.old updating log file
$ sudo LANG=C mrtg
■トップページの更新

$ sudo indexmaker /etc/mrtg.cfg --columns=1 --output /var/www/mrtg/index.html

■ログのチェック
 ※「tail -f」では無いことに注意

$ tac /var/www/mrtg/diskio.log | tail -5
1326289500 0 0 0 0
1326289800 0 0 0 0
1326290078 15 40 38 46
1326290102 65 46 65 46
1326290102 65 46

■例えばメモリキャッシュは?

$ grep -i cache easy_miblist.txt
memCached

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

■メモリキャッシュをクリアするのに適したタイミングを得る。
 ※恐らくvmplayerを終了したらクリアするべきだろうと思う。他のタイミングが無いかも確認したい。

 Linux のメモリキャッシュをクリアする
 http://futuremix.org/2009/09/clear-linux-memory-cach

$ sudo sysctl -a 2> /dev/null | grep ^vm | grep cache
vm.drop_caches = 1
vm.vfs_cache_pressure = 100

■指定するべき値は「man proc」にある。

1 -> ページキャッシュ解放
2 -> ダーティキャッシュ、inode解放
3 -> ページキャッシュとダーティキャッシュ、inode解放

$ env LANG=C man proc | grep -A 11 '/proc/sys/vm/drop_caches '
       /proc/sys/vm/drop_caches (since Linux 2.6.16)
              Writing to this file causes the kernel  to  drop  clean  caches,
              dentries  and  inodes from memory, causing that memory to become
              free.

              To free pagecache, use echo  1  >  /proc/sys/vm/drop_caches;  to
              free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
              to  free  pagecache,  dentries  and  inodes,  use   echo   3   >
              /proc/sys/vm/drop_caches.

              Because  this  is  a non-destructive operation and dirty objects
              are not freeable, the user should run sync(8) first.

■上記から、あるタイミングに以下のコマンドを実行したい。
 ※「sync」を3回やるのは古い人。

# cat cache_clear.sh
#!/bin/bash
echo "[Before]"
free
sync
sync
sync
sleep 1
sysctl -w vm.drop_caches=3
echo "[After]"
free

■「キャッシュ」はメモリの一部。よって以下の計算式で暫定の最大値を得る。
 ※メモリ空き容量、スワップメモリの空き容量と併せて見る前提であれば、必要充分な精度だと思う。

★以下の計算式から整数値を取り出す(小数点以下切捨て & 2^10の倍数)
$ free | head -1 | sed s/^/"header:"/ | head -1 | awk '{print "( "$2" - ( "$3" + "$6" + "$7" ) )/1024/1024"}'
( total - ( used + buffers + cached ) )

★暫定計算
$ CACHEMAX=$(free | grep Mem | awk '{print ($2-$3+$6+$7)/1024/1024}' | awk -F\. '{print $1*1024*1024}')
$ echo $CACHEMAX

■バッファ値も取れるので、併せてグラフ化する。

$ grep -i "buffer\|cache" use_miblist.txt
UCD-SNMP-MIB::memBuffer.0 = INTEGER: 24276 kB
UCD-SNMP-MIB::memCached.0 = INTEGER: 30380 kB

■OIDチェック

$ snmptranslate -On -IR memBuffer
.1.3.6.1.4.1.2021.4.14

$ snmptranslate -On -IR memCached
.1.3.6.1.4.1.2021.4.15

■mrtg.cfg用チェック

$ snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.4.14.0
UCD-SNMP-MIB::memBuffer.0 = INTEGER: 71776 kB

$ snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.4.15.0
UCD-SNMP-MIB::memCached.0 = INTEGER: 106664 kB

■「mrtg.cfg」に追加

# CACHEMAX=$(free | grep Mem | awk '{print ($2-$3+$6+$7)/1024/1024}' | awk -F\. '{print $1*1024*1024}')

# echo "add Used Cache/Buffer"; \
   echo '
# Used Cache/Buffer

Target[cache]: .1.3.6.1.4.1.2021.4.14.0&.1.3.6.1.4.1.2021.4.15.0:public@localhost
MaxBytes1[cache]: '${CACHEMAX}'
MaxBytes2[cache]: '${CACHEMAX}'
Options[cache]: gauge,absolute,growright
Unscaled[cache]: dwmy
Title[cache]: Used Cache/Buffer
PageTop[cache]: <H1>Used Cache/Buffer</H1>
YLegend[cache]: Used Cache/Buffer(Bytes)
ShortLegend[cache]: (Bytes)
Legend1[cache]: Used Cache Bytes
Legend2[cache]: Used Buffer Bytes
LegendI[cache]: Cache
LegendO[cache]: Buffer
  ' >> /etc/mrtg.cfg
add Used Cache/Buffer

■mrtgコマンドでhtml作成

# LANG=C mrtg
2012-01-11 23:40:29, Rateup WARNING: /usr/bin/rateup could not read the primary log file for cache
2012-01-11 23:40:29, Rateup WARNING: /usr/bin/rateup The backup log file for cache was invalid as well
2012-01-11 23:40:29, Rateup WARNING: /usr/bin/rateup Can't remove cache.old updating log file
2012-01-11 23:40:29, Rateup WARNING: /usr/bin/rateup Can't rename cache.log to cache.old updating log file
# LANG=C mrtg
2012-01-11 23:40:31, Rateup WARNING: /usr/bin/rateup Can't remove cache.old updating log file
# LANG=C mrtg
■トップページの更新

$ sudo indexmaker /etc/mrtg.cfg --columns=1 --output /var/www/mrtg/index.html

■ログのチェック
 ※「tail -f」では無いことに注意

$ tac /var/www/mrtg/cache.log | tail -5
1326292500 0 0 0 0
1326292800 0 0 0 0
1326292830 2398 3555 71960 106668
1326292832 71960 106668 71960 106668
1326292832 71960 106668