rrdtool基礎から応用
TRANSCRIPT
RRDTool基礎から応用株式会社はてな
システムプラットホーム部id:shoichimasuhara
■自己紹介
● id:shoichimasuhara
● Twitter:@shoichimasuhara
● 所属:株式会社はてな システムプラットホーム部
● 経歴
● 塾講師
● 陸上自衛官
● 鯖管 (レンサバ)
● はてなインフラ (イマココ)
RRDTool基礎
■RRDToolって?
● RRD(Round Robin Database)を操作するためのツール (そのままですね)
● 今回はTobias Oetikerさんのrrdtool 1.4.7 について話します
http://oss.oetiker.ch/rrdtool/
● 大雑把に言うと、ラウンドロビンデータベースを
● 作って(rrdtool create)
● 更新して(rrdtool update)
● グラフを書く(rrdtool graph)
ためのものです
■RRD(Round Robin Database)って?
● データサイズの変わらないただ一つでもないデータベース
● ラウンドロビン方式でデータが格納されます
● 古いものは期限が来ると破棄されます
● rrdtoolにおけるRRDは基本的に時系列データを蓄積します
■RRD(Round Robin Database)って?
● イメージするなら円形状のデータストア
データを順番に入れていく
■RRD(Round Robin Database)って?
● イメージするなら円形状のデータストア
1周したら古いデータを破棄
■RRDの作成
● rrdtool create を使います
● コマンドはこんな感じ
rrdtool create ファイル名 オプション スキーマ定義
● オプションには
--start 初期時刻
--step 更新間隔 (先ほどの輪の小さい丸の間隔)
などがあります
■スキーマ定義
● DS (Data Source)
● MySQLでいう所のカラム定義
● DS:DS名:DSタイプ:ハートビート:最小値:最大値 で定義
● DSタイプはGAUGE,COUNTER,DERIVE,ABSOLUTEのどれか
● ハートビートは有効更新間隔
● RRA (Round Robin Archives)
● データサイズを決めるようなもの
● RRA:RRAタイプ:xff:ステップ数:行数 で定義
● データ保存期間は ステップ秒数*ステップ数*行数
● RRAタイプはAVERAGE,MIN,MAX,LASTのどれか
● 全DSで共通
● 複数定義できる
■作成サンプル
rrdtool create test.rrd \
--start 1385765991 \
--step 300 \
DS:value1:600:0:1000 \
DS:value2:600:0:1000 \
RRA:AVERAGE:0.5:1:864 \
RRA:AVERAGE:0.5:12:2016 \
■RRDの更新
● rrdtool update を使います
● (実は微妙に奥が深かったりしますが) ここでは単純にタイムスタンプ:値:値:値... をぶち込むだけ
rrdtool update ファイル名 1385766415:10:20
■グラフの描画
● rrdtool graph を使います
● rrdtool の中で一番複雑
rrdtool graph 出力画像ファイル名 オプション グラフ定義
● 詳しく説明すると日がくれるのでとりあえず例
■グラフサンプル
● このコマンドを実行するとこんなグラフがかけますrrdtool graph test.png \ --start 1384614000 \ --end 1385218800 \ DEF:value1=test.rrd:value1:AVERAGE \ DEF:value2=test.rrd:value2:AVERAGE \ AREA:value1#00FF00 \ LINE1:value2#FF0000 \
■DEFとCDEFとVDEFについて
● DEF (data definition)
データソースからデータを定義します (時系列データ)
● CDEF (data calculation)
他の時系列データから計算をして新しい時系列データを定義します (時系列データ)
● VDEF (variable definition)
時系列データなどからひとつの値を定義します(値)
RRDTool応用
■グラフの比較
● 先ほどのグラフのvalue1 > value2 の領域を可視化したい
● 2行追加するとできます
rrdtool graph test.png \ --start 1384614000 \ --end 1385218800 \ DEF:value1=test.rrd:value1:AVERAGE \ DEF:value2=test.rrd:value2:AVERAGE \ CDEF:value3=value1,value2,GT,INF,* \ AREA:value3#FFDDDD \ LINE2:value1#00FF00 \ LINE1:value2#FF0000 \
■グラフの比較
● 先ほどのグラフのvalue1 > value2 の領域を可視化したい
● 2行追加するとできます
rrdtool graph test.png \ --start 1384614000 \ --end 1385218800 \ DEF:value1=test.rrd:value1:AVERAGE \ DEF:value2=test.rrd:value2:AVERAGE \ CDEF:value3=value1,value2,GT,INF,* \ AREA:value3#FFDDDD \ LINE2:value1#00FF00 \ LINE1:value2#FF0000 \
■ちょっと説明
● CDEF:value3=value1,value2,GT,INF,*
● 何やってるの?
● value1 と
● value2 を
● GT ( > ) で比較して
● INF(無限大特殊変数) を
● * (かけ) た
■移動平均線を描いてみる
● TRENDを使います
● 1日移動平均線の定義だとこんな感じ
CDEF:value2=value1,86400,TREND
■移動平均線を描いてみる
● TRENDを使います
● 1日移動平均線の定義だとこんな感じ
CDEF:value2=value1,86400,TREND 簡単便利
■過去のグラフとの重ね合わせ
● SHIFTを使います
● CDEF:value2=value1 CDEFで一度違う変数に渡して
● SHIFT:value2:86400 ずらします
■過去のグラフとの重ね合わせ
● SHIFTを使います
● CDEF:value2=value1 CDEFで一度違う変数に渡して
● SHIFT:value2:86400 ずらします
● 例では1日ずらしただけですが、一週間前のグラフを表示すると異常がわかりやすくて便利です
■最小二乗法による線形予測
● LSL(Least Squares Line)機能を使います
● データから y=ax+b の形を求める
● LSLSLOPE で a (傾き)を
● LSLINT で b (切片)を求めて
● CDEFで直線の時系列データを定義します
■最小二乗法による線形予測 rrdtool graph test.png \ --start 1384614000 \ --end 1385218800 \ DEF:value1=test.rrd:value1:AVERAGE \ VDEF:a=value1,LSLSLOPE \ # 傾き VDEF:b=value1,LSLINT \ # 切片 CDEF:value2=value1,POP,a,COUNT,*,b,+ \ # スミマセンこれ良くわかってない・・ AREA:value1#00FF00 \ LINE1:value2#FF0000 \
■最小二乗法による線形予測 rrdtool graph test.png \ --start 1384614000 \ --end 1385218800 \ DEF:value1=test.rrd:value1:AVERAGE \ VDEF:a=value1,LSLSLOPE \ # 傾き VDEF:b=value1,LSLINT \ # 切片 CDEF:value2=value1,POP,a,COUNT,*,b,+ \ # スミマセンこれ良くわかってない・・ AREA:value1#00FF00 \ LINE1:value2#FF0000 \
■最小二乗法による線形予測rrdtool graph test.png \ --start 1384614000 \ --end 1385218800 \ DEF:value1=test.rrd:value1:AVERAGE \ VDEF:a=value1,LSLSLOPE \ # 傾き VDEF:b=value1,LSLINT \ # 切片 CDEF:value2=value1,POP,a,COUNT,*,b,+ \ # スミマセンこれ良くわかってない・・ AREA:value1#00FF00 \ LINE1:value2#FF0000 \
hrule(横線)を引くとなお見やすくなります (交点を求めることもできますが今回は割愛)
■曲線予測
● PREDICTを使います
CDEF:trend=value1,3600,TREND 移動平均を求めて
CDEF:value2=86400,-8,3600,trend,PREDICT PREDICTに突っ込む
■曲線予測 rrdtool graph test.png \ --start 1384614000 \ --end 1385218800 \ DEF:value1=test.rrd:value1:AVERAGE \ CDEF:trend=value1,3600,TREND \ CDEF:value2=86400,-8,3600,trend,PREDICT \ AREA:value1#00FF00 \ LINE1:value2#FF0000 \
■曲線予測 rrdtool graph test.png \ --start 1384614000 \ --end 1385218800 \ DEF:value1=test.rrd:value1:AVERAGE \ CDEF:trend=value1,3600,TREND \ CDEF:value2=86400,-8,3600,trend,PREDICT \ AREA:value1#00FF00 \ LINE1:value2#FF0000 \
こんなグラフが出ます
■もう少しマシな予測
● 指数平滑法のうち季節周期も考慮してくれる Holt-Winters が使えます
● ただしgraph定義だけではダメで、createする時点から設定が必要
● 正直良くわからないので使ったことは無いです
● 詳しくはこちら http://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html
RRDToolのおまけ
■rrdcached
● rrdtoolをインストールすると付録でついて来ます
● unix socket またはネットワーク越しでrrdtoolが操作できるデーモン
● 本来は高頻度のupdateに耐えるためのcacheサーバ
● 今時SSDだしストレージの書き込み速いしそんなに要らないような
■rrdcached
● ドキュメントに
● create
● update
● graph
などが使えるように書いてるけど使えなかった (1.4.4)
● そこで rrdtool user ML に質問投げてみたら
■rrdcached
trunk versionじゃないとと動かないよそれHAHAHA
■rrdcached
って返事が返ってきた
■rrdcached
マジか
■rrdcached
そんなもんwebのドキュメントに載せんな
■まとめ
● rrdtool、多機能すぎてお腹いっぱい
● 頑張って使えばいろいろ出来そう
● コマンド叩くのはツライのである程度決め打ちで出来れば便利
● 予測機能を使っていきたい
ご清聴ありがとうございました