rrdtoolを使ってsysstat(sar)のログをグラフ化する

画像消えたので作り直しました。10分だけデータとってます。

1秒間隔で取得したsar -n DEVの値から送受信パケット数、キロバイト数、sar -uからCPU使用率をrrdtoolでグラフ化したのでそのメモを残します。
ksar使える環境なら、そっちの方が早いと思います。
Debian/lenny+rrdtoolバージョン1.3.1-4
全体を通してhttp://www.itmedia.co.jp/enterprise/articles/0705/30/news022.htmlを参考にしました。コマンドの各パラメータについても説明されています。
本家ドキュメント
http://www.mrtg.org/rrdtool/doc/index.en.html

  1. sysstatによるモニタリング
    sar -o sar.log 1 7200

  2. 1のログから対象とするデータを抜き出しテキスト化
    sar -n DEV -f sar.log|grep eth0|grep -v Ave > eth0
    sar -u -f sar.log|grep all|grep -v Ave > cpu

  3. データベースの作成およびデータベースへの登録

    ``` {lang="bash" line="1"}

    !/bin/sh -x

    掃除

    rm -rf ./eth0andcpu.rrd

    変数の用意(システム時刻、全体行数、現在行)

    declare -i sysclock declare -i last_line declare -i current_line

    システム時間は取ったログの開始時刻

    例)date -d '2011/11/20 16:36:19' '+%s'

    sysclock=1291883460

    データベースの作成

    rrdtool create eth0andcpu.rrd --start $((sysclock - 1)) --step 1
    DS:rxpps:GAUGE:5:0:U
    DS:txpps:GAUGE:5:0:U
    DS:rxkBps:GAUGE:5:0:U
    DS:txkBps:GAUGE:5:0:U
    DS:cpu_idle:GAUGE:5:0:U
    RRA:LAST:0.5:1:3600

    ループ処理準備

    sysstatの結果から全体行数を取得

    last_line=$(wc -l eth0|awk -F" " '{print $1}')

    現在行の初期化

    current_line=1

    ループ処理開始

    1行目から始めて全体行数以下の間実行

    while [ ${current_line} -le ${last_line} ] do

    意味ない

    echo ${current_line}

    各入力用変数に値を入れていく

    val_rxpps=$(awk -v val="${current_line}" -F" " 'NR == val { print $4 }' ./eth0) val_txpps=$(awk -v val="${current_line}" -F" " 'NR == val { print $5 }' ./eth0) val_rxkBps=$(awk -v val="${current_line}" -F" " 'NR == val { print $6 }' ./eth0) val_txkBps=$(awk -v val="${current_line}" -F" " 'NR == val { print $7 }' ./eth0) val_cpu_idle=$(awk -v val="${current_line}" -F" " 'NR == val { print $9 }' ./cpu)

    意味ない。

    echo $val_rxpps

    echo $val_txpps

    echo $val_rxkBps

    echo $val_txkBps

    echo $val_cpu_idle

    データベースの更新

    rrdtool update eth0andcpu.rrd ${sysclock}:${val_rxpps}:${val_txpps}:${val_rxkBps}:${val_txkBps}:${val_cpu_idle}

    現在行をインクリメント

    current_line=$((current_line + 1))

    システム時間もインクリメント。stepが1sなので+1。合わせなかったらどうなる?

    sysclock=$((sysclock + 1)) done

    ループ処理終了

    ```

  4. グラフの作成

    ``` {lang="bash" line="1"}

    !/bin/sh -x

    掃除

    rm -rf ./eth0andcpu.png

    グラフ作成

    rrdtool graph eth0andcpu.png --imgformat PNG -s 1291883460 -e 1291887000 --x-grid MINUTE:1:MINUTE:10:MINUTE:10:0:"%H:%M"
    DEF:txpps=eth0andcpu.rrd:txpps:LAST
    DEF:txkBps=eth0andcpu.rrd:txkBps:LAST
    DEF:rxpps=eth0andcpu.rrd:rxpps:LAST
    CDEF:r_rxpps=rxpps,-1,
    DEF:rxkBps=eth0andcpu.rrd:rxkBps:LAST
    CDEF:r_rxkBps=rxkBps,-1,

    DEF:cpu_idle=eth0andcpu.rrd:cpu_idle:LAST
    CDEF:r_cpu_idle=100,cpu_idle,-
    AREA:txpps#c8c2be:"txpps"
    AREA:txkBps#887f7a:"txkBps"
    AREA:r_rxpps#f2a0a1:"rxpps"
    AREA:r_rxkBps#c53d43:"rxkBps"
    LINE1:r_cpu_idle#FF0000:"cpu"
    -w 500 -h 350 ```

で、一番上のグラフが出来上がります。
個人的に気をつけないといけないなと思った事↓
rrdtool create時、DS、RRAをちゃんと考えて設定する事
rrdtool update時、抜き出してる数値が正しいか確認する事
rrdtool graph時、面倒くさいけど描画する順番とか色とか気をつける事。体裁も大事。

links

social