監視(hotsanic)調整

hotsanicの対応kernelは2.4~2.6(2.6は完全対応ではない)なので調整が必要な部分がある

全てを調整する気はないので必要な部分だけ修正することにする

まずはざくっと解析

解析

ファイル構成

d Documentation
- README
d backup             :configのバックアップが入る
- clearall           ③初期化
- convert.pl
- diagrams.pl        :グラフ作成(rrdtimer.plから起動)
d images
d lib
- makeindex.pl       :HTMLのインデックス作成
d modules            ④モジュール
d not configured
- rrdgraph           ①サービス(init.dに登録 → /etc/init.d/rrdgraph)
- rrdtimer.pl        ②メイン(rrdgraphから起動)
- settings
- setup.pl
d tools
d var                :ログ等

①サービス:rrdgraph

start

# service rrdgraph start
--
cd "/opt/HotSaNIC"
./rrdtimer.pl Dp

stop

# service rrdgraph stop
--
cd "/opt/HotSaNIC"
./clearall CLEAR_COUNTERS

②メイン:rrdtimer.pl

各モジュールのread-data.plを以下のように起動して常駐させる

read-data.pl start netstat
read-data.pl start part
read-data.pl start sensors
read-data.pl start system
read-data.pl start traffic

時刻から10秒刻み(各分の0、10、20・・・)で以下の処理を実行(sleep(10-time%10)で処理してる)

③初期化

# clearall CLEAR_WEBPAGE
This will destroy everything under /home/localhost/HotSaNIC and therefore your web-graphs. Enter  yes  to continue
yes

# clearall CLEAR_DATABASES
This will destroy all sampled data. Enter  yes  to continue
yes

# clearall CLEAR_GRAPHS

④モジュール

データ読み込み、初期rrd作成や更新、グラフ作成等の処理系は各モジュール別に実装され実行される

modules下にはPC固有、複数のunix系OSに対応するためにOS依存と汎用に分かれている

・メイン:read-data.pl(常駐する)

usage: ./read-data.pl [start/stop/status/configure/sample/update/version/help/showargs]

・rrd作成:makerrd

・rrd更新:update または ./platform/*(プラットフォーム別にモジュールがある)

・グラフ作成:diagrams.pl

・インデックス作成:makeindex.pl

・セットアップ:setup.pl

調整

《 traffic 》

INが+(上)OUTがー(下)なのはサーバサイドから観た場合問題はない

しかしsamba経由で書込みしてみるとINとOUTの転送量の表示が逆になっている

settingsでSWAPIO="yes"にすると転送量の扱いが反転しINがー(下)OUTが+(上)になるが表示はこれで正常なので良しとし、ついでに単位をbits/sに変更(STYLE="bits")した

# vi modules/traffic/settings
#STYLE="bytes"
STYLE="bits"
#SWAPIO="no"
SWAPIO="yes"
#DEV="eth0,12500000,12500000,100 MBit Ethernet"
#DEV="lo,12500000,12500000,100 MBit Ethernet"
DEV="eth0,12500000,12500000,Giga bit ethernet"

凡例の順がそのままなのでmodules/traffic/diagrams.plを修正して上をOUTにした(グラフの作成順序を変更すれば位置が変わる)

《 diskio 》

kernel2.4と2.5は/proc/statからデータ採取し対応されている

kernel2.6以降は/proc/diskstatsとなり未対応

2.4 /proc/stat(仕様)

disk_io: (2,0):(31,30,5764,1,2) (3,0):...
    (メジャー番号, ディスクインデックス番号):(情報なし (noinfo), 読み込み回数, 読み込みブロック数, 書き出し回数, 書き出しブロック数)
    (Linux 2.4 のみ)

2.6 /proc/diskstats(仕様)

cat /proc/diskstats | grep 'sda '
    8 0 sda 2461810 61427 148062742 6482992 660009 1544934 67900384 45642376 0 7162961 52128751

    Field 1 -- # of reads issued
    Field 2 -- # of reads merged
    Field 3 -- # of sectors read
    Field 4 -- # of milliseconds spent reading
    Field 5 -- # of writes completed
    Field 6 -- # of writes merged
    Field 7 -- # of sectors written
    Field 8 -- # of milliseconds spent writing
    Field 9 -- # of I/Os currently in progress
    Field 10 -- # of milliseconds spent doing I/Os
    Field 11 -- weighted # of milliseconds spent doing I/Os

cat /proc/diskstats | grep 'hda1 '
    3 1 hda1 25838 525266 1505217 12041736

    Field 1 -- # of reads issued - Total number of reads issued to this partition.
    Field 2 -- # of sectors read - Total number of sectors requested to be read from this partition.
    Field 3 -- # of writes issued - Total number of writes issued to this partition.
    Field 4 -- # of sectors written - Total number of sectors requested to be written to this partition

注)kernel2.5.xから変更になった

3.2 /proc/diskstats(正式仕様は見つからず2.6と同じとなっている)

仕様では2.6から変更されてなくディスク全体とパーティションで情報量(フィールド)が異なる

しかし実際はディスク全体とパーティションで同じ出力構成になっている

$ cat /proc/diskstats
   1       0 ram0 0 0 0 0 0 0 0 0 0 0 0
    (略)
   8       0 sda 6479 2234 246054 70860 1583 439 22088 28364 0 19444 99228
   8       1 sda1 5071 1901 231642 62972 1413 312 18976 22756 0 17908 85740
   8       2 sda2 617 221 7194 4912 153 114 2936 5096 0 4388 10000
   8       3 sda3 468 112 4634 1968 9 13 176 432 0 1340 2400
   8       4 sda4 160 0 1280 780 0 0 0 0 0 780 780

おそらく全て次のとおりだと思われる

○  Field 1 -- # of reads issued
    Field 2 -- # of reads merged
○  Field 3 -- # of sectors read
    Field 4 -- # of milliseconds spent reading
○  Field 5 -- # of writes completed
    Field 6 -- # of writes merged
○  Field 7 -- # of sectors written
    Field 8 -- # of milliseconds spent writing
    Field 9 -- # of I/Os currently in progress
    Field 10 -- # of milliseconds spent doing I/Os
    Field 11 -- weighted # of milliseconds spent doing I/Os

○の部分を利用すれば良いはず

$racc: 読み込み回数
$rsec: 読み込みセクタ数
$wacc: 書き出し回数
$wsec: 書き出しセクタ数

以下を3.2用としてmodules/diskio/platform/linux.pmに追加

if($args{KERNEL} eq "3.2") {
    my @stats = ();
    open FILE, "/proc/diskstats";
    while(<FILE>) { if( $_ =~ /sd[a-z][ 1-9]/ ) { push(@stats, $_); } }
    close FILE;
    foreach my $entry(@stats) {
        my(undef,
           $major, $minor, $devnm,
           $racc, undef, $rsec, undef,
           $wacc, undef, $wsec,
           undef, undef, undef, undef
           ) = split / +/, $entry;
        $num = $major . "_" . $minor;
        #print "$entry$devnm, $num, RC:$racc, WC:$wacc, RS:$rsec, WS:$wsec\n";
        store_values($args{MODNAME}, $num, $racc, $wacc, $rsec, $wsec, 512);
    }
}

カーネルバージョン($args{KERNEL})取得モジュールの変更も必要(lib/HotSaNICparser.pm)

HotSaNICparser::identify_kernel();
・2.1~2.6までしか判断してなく適合しない場合はデフォルトの2.0になる
・3.*を3.2にする

《 sensors 》

システム固有

《 part 》

現状は汎用で問題なし

《 netstat 》

現状は汎用で問題なし

《 system 》

未調整

CPU:/proc/stat から取得

$ cat /proc/stat
cpu  4813 9226 3771 5275130 6652 0 45 0 0 0
cpu0 1209 3475 873 1317867 1498 0 13 0 0 0
cpu1 1618 1034 1122 1320211 873 0 11 0 0 0
cpu2 755 3504 628 1316598 3236 0 18 0 0 0
cpu3 1230 1212 1146 1320452 1044 0 3 0 0 0

Field 1 -- user
Field 2 -- nice
Field 3 -- system
Field 4 -- idle
Field 5 -- iowait (kernel2.5.41から)
Field 6 -- irq (kernel2.6.0-test4から)
Field 7 -- softirq (kernel2.6.0-test4から)
Field 8 -- steal (kernel2.6.11から)
Field 9 -- guest (kernel2.6.24から)
Field10 -- guest_nice (kernel2.6.33から)

Load average:/proc/loadavg から取得

過去1分、5分、15分の間の実行待ちプロセス数の平均数
ランキュー(待ち行列)に溜まったタスク (task_struct構造体 ≒ プロセス)の数を、ハードウェアクロックの割り込み毎に数え上げて時間単位での平均値を出している

Users:who利用

loginユーザ数取得

memory:/proc/meminfo から取得

MemTotal, MemFree, Buffers, Cached, SwapTotal, SwapFree を利用

int:/proc/stat から取得

uptime:/proc/uptime から取得

《 全体 》

$CONFIG{ITIME}を追加して10秒刻みのデータ読み込み間隔をsettingsで調整できるようにした