MRTG的作者 Tobias Oetiker(瑞士) [1]所製作的工具,可以自行定義和繪製流量圖形。
MRTG是個簡單的流量圖繪製工具,但是如果要繪製比較複雜一點的圖形,MRTG就不夠力,因此他另外提供了 RRDTool。
要使用RRDTool 可分為三個部分:
1. 建立RRD資料庫
2. 餵入資料
3. 繪製圖形
當然用說的很簡單,每個步驟都不是很容易上手,但是他繪製的圖形很優美,吸引不少人去學習他,要說到RRDTool的說明文件,不得不提StudyArea[2] abelyang 所寫的文章,可作為初學者的第一步,美中不足的是因為年代久遠,文中有些設定已經作廢。由於功能強大,我還有很多沒搞清楚,因此就我知道的作說明。
例如這是一個RRDTools繪製的範例圖
<<以下部分中文說明的用語是我自己編的>>
安裝
請看 [CENTOS7] 安裝rrdtool+RRDs+PERL
建立RRD資料庫
RRD資料庫有別於純文字的log檔,他是2進位檔,得利用 rrdtool create 建立。
請下此指令,因為指令很長,所以每一行後面有個反斜線'\' 告訴系統指令沒打完,'\'後面不要再有其他的字元。
rrdtool create a.rrd --start '-2day' --step 300 \ DS:item1:COUNTER:600:0:U \ DS:item2:COUNTER:600:0:U \ DS:item3:COUNTER:600:0:U \ RRA:MAX:0.5:1:2016 \ RRA:AVERAGE:0.5:1:2016 \ RRA:LAST:0.5:1:2016
第1行 上面的範例建立一個 a.rrd的資料庫,
--start 資料啟始時間,可以使用時戳或是文字,例如 --start 154421200、--start '-6month'
--step 每筆資料的間隔時間(秒) 300代表5分鐘
第2-4行
DS 代表資料類型,等同於資料表中的欄位,他的格式是這樣的
DS:欄位名稱:類型:心跳值:最小值:最大值
類型可使用
GAUGE 資料是多少就多少,例如溫度、濕度、目前時速等
COUNTER 資料是累加的要選這個,例如累積流量,累積里程、電表度數等
DCOUNTER 同上,但是資料是有小數點的倍精數
DERIVE | DDERIVE | ABSOLUTE | COMPUTE 這些我沒搞懂
心跳值(heartbeat)
基本上此值是step的2倍,例如設定為600時,假設要取12:00的數據,而前後300秒的值(11:55-12:05) 經過平均或是取最大或最小都算是12:00的有效值。
最小值
此數據能接受的最小值,小於此值則該筆數據被忽略,不限定的話可設定為大寫的U
最大值
此數據能接受的最大值,大於此值則該筆數據被忽略,不限定的話可設定為大寫的U
第5-7行
RRA 是 Round Robin Archive ,定義數據收集的方式,他的格式是這樣:
RRA:歸檔方式:未知容許比率:幾筆算成一個小單元:最大小單元數
歸檔方式
有四種可選 AVERAGE | MIN | MAX | LAST
未知容許比率
可設定0~1,這個數值代表可接受未知數據的比例,例如你由10筆記錄組成1個RRA的小單元(稱之為CDP),設定0.7的話,你只能容許有6筆資料遺失,如果遺失7筆的話,此小單元就定義為缺失(Unknown),換句話說,設為0不容許任何遺失,設為1全部遺失才是Unknown。當然如果你的小單元是只有一個數據組成的話,設成多少都不重要。
幾筆算成一個小單元
例如12筆5分鐘資料設為一個小單元,則設定為12
最大小單元數
超過此值會被刪除,如此而已
餵入資料
餵入資料比較簡單,只要把資料用冒號串起來就好
但有一些限制:
1. 欄位數一定要完全相同否則會被拒絕
2. 第一筆一定是時戳,後再帶入欄位的資料,如上例中我有3個DS:時戳:DS1:DS2:DS3。
3. 時戳一定要比rrd限定時戳來得大,例如建立時有指定 --start '-2day',因此不能餵入二天以前的數據。
4. 要循序,舊的資料要先餵,否則會出錯。
餵入資料是個漫長的過程,我餵入過10,000,000行的資料(1000個檔案),花了11個小時。
繪製圖形
繪圖不太容易
rrdtool graph a.png \ -a PNG --title 'in Query範例' \ --vertical-label "數量/s" \ --width 400 \ --start '-1day' \ --x-grid 'HOUR:1:HOUR:6:HOUR:4:0:%H' \ 'DEF:s1=a.rrd:item1:AVERAGE:start=-2day' \ 'DEF:s2=a.rrd:item2:MAX' \ 'DEF:s3=a.rrd:item1:MIN' \ 'CDEF:c2=s1' \ 'SHIFT:c2:86400' \ 'AREA:s2#00ff00:Switch 2min' \ 'AREA:s3#F0ffc0:Switchn:STACK' \ 'LINE1:c2#ff00E0:Switch 1avg' \ "COMMENT:各 PORT 流量統計---平均-------最小" \ 'GPRINT:s1:LAST:count\: %7.2lf ' \ 'GPRINT:c2:LAST:上週count\: %7.2lf ' \
第5行 繪製圖型起始1天前
第6行 X座標格式[3],
簡單說明一下,第一組是小刻度格線HOUR:1表示每小時換一輕線;第二組是大刻度格線,HOUR:6表示每6小時畫一紅線;第三組是標籤值,HOUR:4表示每4小時打一個標籤;第四組是位移和顯示格式,位移可讓你顯示的標籤看是對齊格線還是格子,例如向右移一小時,就寫3600,最後的是格式,例如[3]:
%Y | Year as four digits, e.g. 2009 |
---|---|
%m | Month as two digits, with leading zero, e.g. 01 02 ... 09 10 11 12 |
%d | Day as two digits, with leading zero, e.g. 01 02 ... 30 31 |
%a | Abbreviated weekday, mon tue wed thu fri sat sun |
%H | Hour as two digits, with leading zero, e.g. 00 01 ... 22 23 |
%M | Minute as two digits, with leading zero, e.g. 00 01 ... 58 59 |
%S | Second as two digits, with leading zero, e.g. 00 01 ... 58 59 and 60(!) |
第7-9行 DEF定義資料從rrd取得欄位,這表示繪圖時是可以跨rrd的。
第10行 CDEF是將數據作計算,後置表示法。(後置表示法在計算機學學到2 30年,第一次實用上能用到)
第11行 SHIFT是把資料移位,此例中c2原本等於s1(2天前到目前48小時的資料),移位86400秒,前天的就被移到昨天,昨天的被移到明天,但繪圖時是從一天前繪製到目前,所以就能在圖上同時顯示今天和昨天的資料。[4]
第12-13行 畫面積圖,大圖先畫,小圖後畫,第13最後有一個'STACK',表示把圖加在上面那個面積圖上產生堆疊效果。
第14行 畫線圖,注意是LINE1,沒有LINE2,3...我想原作者是想要增加其他線形,但一直沒做。
第15行 COMMENT 註解,註解要換行用\n。
第16-17行 GPRINT 是圖例,同時也能用LAST顯示最後一筆數據,你也能換成MAX顯示最大值;%7.2lf表示顯示7個整數和2個小數位。
--slope-mode 線看起來會更平滑,但是稍微失真
--upper-limit 100 垂直最大值設為100(至少要有100),事實上有可能超過
--lower-limit 0 垂直最小值設為0(至少會有0),事實上有可能更低
--rigid 剛性限定垂直刻度一定介在 --lower-limit 和 --upper-limit之間
--no-legend 不要圖例
--logarithmic y軸取對數
--border 5 外框的厚度5,這裡的外框是指最外圍,而非圖本身
改變顏色
--color 可以改變顏色,一行一筆,例如:上左是紅色、下右是綠色、底色是藍
--color "SHADEB#00FF00"
--color "CANVAS#0000FF"
其它可用的位置名稱為:GRID, MGRID 網格、主網格;FONT 文字;FRAME:外框,這個外框是指下面圖例的小框,廢;ARROW∶x, y軸的箭頭。
使用判斷式
rrdtool 有提供 if else之類的判斷式,稱之為rrdgraph_rpn - About RPN Math in rrdtool graph [13][14]
可用的運算子是 LT, LE, GT, GE, EQ, NE
舉例而言,
- if val1 為真, val2就設為val1, 否則為100
'CDEF:val2=val1,val1,100,IF'
- if val1 為真, val2就設為val1*300, 否則為上一個值
'CDEF:val2=val1,val1,300,*,PREV,IF'
- if val1 大於1000, val2就設為1000, 否則為val1
'CDEF:val2=val1,1000,GT,1000,val1,IF'
熟析這個東西,可以讓我們過濾不必要的資料,非常的方便。
查看最後資料的時戳
在餵入資料時,如果最後時戳大於你數據的時戳就會報錯:
你可以使用 last 選項來確認最後加入的時戳
1549027201
查看RRD狀態
查看資料、匯出資料
rrdtool dump a.rrd > a.xml
回復XML資到到RRD
-r 是進行欄位限制檢查,回復只能從 xml回復
修改RRD參數
餵入數據是RRD資料庫的硬傷,很慢,沒必要千萬別重建,因此如果設定錯誤,修改是最佳解,舉例。
修改類型為GAUGE:
修改上界為無限:
rrdtool tune rrdfile.rrd -a item1:U
相關參數請參考[11]
參考資料
[1] RRDTool官網 https://oss.oetiker.ch/rrdtool/index.en.html (EN)
[2] StudyArea http://www.study-area.org/tips/rrdtool/rrdtool.html (正體中文)
[3] X座標格式 http://rrdtool.vandenbogaerdt.nl/tutorial/x-grid.php (EN)
[4] shoichimasuhara https://www.slideshare.net/shoichimasuhara/rrdtool-35507239 (日)
[5] shoichimasuhara https://www.slideshare.net/VirtualTech-JP/vtj-open-stackbizseminar1309254?next_slideshow=1 (日)
[6] 防止資料不連續 https://stackoverflow.com/questions/38723029/how-can-i-avoid-getting-blank-spaces-in-my-rrdtool-graphs (EN)
[7] Getting Started with RRDtool http://cuddletech.com/articles/rrd/rrdintro.pdf
[8] http://blog.51cto.com/freeloda/1307492 (簡)
[9] 使用中文字 CENTOS7] 安裝中文字型
[10] DNS STAT 物件 https://thwack.solarwinds.com/docs/DOC-169132 (EN)
[11] RRDTUNE https://oss.oetiker.ch/rrdtool/doc/rrdtune.en.html (EN)
[12] https://www.serveradminblog.com/2010/11/remove-spikes-from-rrd-graphs-howto/
[13] http://manpages.ubuntu.com/manpages/bionic/man1/rrdgraph_rpn.1.html
[14] https://oss.oetiker.ch/rrdtool/tut/rpntutorial.en.html
[15] DRAW VERTICAL LINE https://marc.info/?l=rrd-users&m=117458019235193