文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>RRDtools 教學 (一)

RRDtools 教學 (一)

时间:2007-02-14  来源:evegl

rrdtool 教學
歡迎轉載 ,但有任何修改請來信告知,不得作為商業用途
作者: abelyang <abelyang{at}twnic{dot}net{dot}tw>;
version: 1.0
最後修正時間: 2005/05/26 00:10
轉載時請保持此一宣告

1.前言
(http://www.rrdtool.org)
什麼是 rrdtool 呢 ? 其實他和 mrtg 是同一家族, 主要都是在產生 time-series 的圖檔(如流量,負載,
溫度,人數.....),不過因為 mrtg 當初的考量是畫兩種資料在圖上(或四個值),後來原作者覺得不足,所以
另外又開發了 rrdtool, rrdtool 本身可和 mrtg 結合,但其結合基本上僅在於將 mrtg 的文字檔的log
轉成 rrd 儲存格式,通常 user 尚需要 mrtg-rrd/rrdcgi 去轉換,不過總覺得美中不足,因為最終其實你用
到的還是 rrdtool,雖然還有像 my14all (http://my14all.sourceforge.net/) 這類的 tools 可以轉換並
畫圖,但其追根究底 還是以 rrdtool 為 base, 所以 rrdtool 變成了最終也是最好的選擇。

平心而論 rrdtool 的學習遠比 mrtg 來得困難,且相關文件資料也沒有 mrtg多,其中中文的參考又幾乎沒有,
如果沒有較深厚的 Linux 基礎(尤其是 Shell Script) 或了解 SNMP,懂得英文及好學的心,否則是不建議學
習 rrdtool 的.因為你可能很難去控制或獲得你所要的資料,亦可能難於表現圖檔。

當然,每個人看法不見得相同,完全看個人需要而定,就像用 mrtg 畫 CPU Load, Memory Usage,HTTP Client,
Process...., 純使用 mrtg 是較簡單且好用的,但是你要做很多圖,每張圖之間的關聯生基本上可能需要你用
眼睛去判斷.但如果使用rrdtool 可以讓你四張疊成一張,如此也較好比較出其中的因果關係,不過此時你得懂
得控制圖的表現方式來達到顯示上最好的結果.基本上學 rrdtool 完全不需要有 mrtg 的經驗. 但最好對系
統資訊獲得的方法(cmd/ snmp/Shell Script )熟一點會較好處理.


最大  CPU 純系統負載;        27.0 %         平均   CPU 純系統負載;5.0 % 目前   CPU 純系統負載;        0.0 %
最大  CPU 使用者負載;        2.0 %         平均   CPU 使用者負載;0.0 % 目前   CPU 使用者負載;        0.0 %


最大 RAM 系統負載; 16.0 %   平均   RAM 系統負載;  4.0 %   目前  RAM 系統負載; 3.0 %  
最大 RAM 使用者負載; 1.0 %  平均   RAM 使用者負載; 0.0 %  目前 RAM 使用者負載; 0.0 %  


最大   連線數目 : 91.0 %   平均   連線數目 : 3.0 %   目前   連線數目 : 1.0 %  
最大   上線人數 : 6.0 %   平均   上線人數 :  0.0 %   目前   上線人數 : 0.0 %  

使用 rrdtool 匯整:

綠色為 RAM 之使用率,藍色為 CPU 負載,而紅色系則為連線數,如此,以三合一的方式,更能顯示連線數與系統
的關係(這張圖可以看出其沒有太大相關)

2.下載與安裝
本節說明僅適用 rrdtool 1.0.x
去官網下載 tarball 或 Google 找 RPM 皆可,個人都習慣用 tarball 裝,安裝方法同一般的程式
$>;./configure --prefix=/usr/local
$>;make
$>;make install

Complier 過程中會有幾個 Warning,但是對整個環境並沒有影響.基本上安裝部份都不會有什麼問題, rrdtool
的 tarball 內即可附了 libgd,zlib 等自用的 lib,不會像 mrtg FAQ 一樣裝好了試一下打 rrdtool ,看會不
會出現類似訊息

[root@pc071 study]# rrdtool
RRDtool 1.0.42 Copyright 1997-2001 by Tobias Oetiker <[email protected]>;
Usage: rrdtool [options] command command_options
Valid commands: create, update, graph, dump, restore,
last, info, fetch, tune, resize, xport
RRDtool is distributed under the Terms of the GNU General
Public License Version 2. (www.gnu.org/copyleft/gpl.html)
For more information read the RRD manpages

可以看出來 rrdtool 有 11 個 options, 此處介紹 create/update/graph 其餘的部份較屬於 RRD File 的
備份/回存及資訊顯示等,與我們主題較無關.另外像 rrdcgi 或 rrd 的 perl module 皆不在我們的介紹範圍
內,但其用法並無二致,有興趣之人自可至官方網站查看.

3.建立 RRD 檔 (rrdtool create)
建立 RRD file 的指令及意義你一定要弄懂,如此圖才能畫的好,不過唯有實作你才能體會的深, 只有看過是不
夠的.相信有不少人看過 rrdtool 網站上的說明,個人覺得上面有幾個部份 英文蠻難的(你覺不覺得我就不知了
)... 再說明之前我們先了解 mrtg log 的儲存格式...以一般而言 mrtg 大家習慣都是 5m 做 一次,那一天要
做 288 次, 你的 mrtg 跑一年不就有 10 萬行的資料了,但實際上mrtg log 是會做一些處理的 實際的狀況是

CODE:

[Copy to clipboard]

每五鐘值存 603 筆,再來是
30 分鐘存 603 筆
2 小時值存 603 筆
一天值存 800 筆

註:詳細內容請參考您自身的 mrtg log 檔,並觀察第一欄(timestamp) 的變化

3.1 論 mrtg 的優點
個人感覺即是籣單而好用,能符合多數人的需求.且網路上中文的資料多.
2.x 版後支援 Logformat 為 RRD 而不為 text logfile, 以方便較短的 interval 及僅做資料收集動作
支援 Threhold Check,這個一般人都沒有什麼研究,但其實是 monitor 中重要的一個 Alert 動作

CODE:

[Copy to clipboard]

#mrtg target 部份
Target[sg-apol-mgcd]:`/root/study/enum.sh softswitch ABC mgcd`
MaxBytes1[sg-apol-mgcd]:6000
MaxBytes2[sg-apol-mgcd]: 512000
Title[sg-apol-mgcd]: Class 5 VoIP SoftSwitch status
Legend1[sg-apol-mgcd]: CPU 時間
Legend2[sg-apol-mgcd]: MEM 使用
LegendI[sg-apol-mgcd]: CPU 時間(秒)
LegendO[sg-apol-mgcd]: MEM 使用(KB)
YLegend[sg-apol-mgcd]: CPU/MEM usage
PageTop[sg-apol-mgcd]: <h1>;Class 5 Soft Switch @APOL: mgcd daemon(Media GatewayControler )</h1>;

# mrtg Threshold Check , 定義 Alert 所在目錄,及 Alert 值,Alert 程式
ThreshDir: /www/htdocs//mrtg/alert/
#依我的程式,本例為 SoftSwitch CPU 每分鐘佔用超過 10 秒,以 MSN 傳送訊息給相關管理者,並從
#remote 重開 daemon service
ThreshMaxI[sg-apol-mgcd]: 1000
ThreshProgI[sg-apol-mgcd]:/www/htdocs/snmp.enum.org.tw/mrtg/alert/send_MSN.sh

3.2 mrtg 的缺點
mrtg 最大的缺點是處理效率問題
主要原因在於:
1. 偵測時間不能小於5分鐘,即使你每分鐘跑一次,圖上也是畫 5 分鐘的變化
2. 偵測 Target 過多,機器會跑不動,主因在
        2.1 mrtg 每次都會畫圖(最多一個target 會更動到4個圖),不實際, Broswer 時才畫才可能偵測上千
        上萬個 Target.
        2.2 要更新 log file(絕不是什麼插入一行數據,而是N筆資料的修改)
        2.3 要更新每個 target 的 html page
3. 不能表現三種以上資料

如果 Scope 小, mrtg 再上述幾點狀況不會構成問題,若 Scpoe 大,例如, 1000+ Target 要做,大概 90% 的機
器都跑 不動(可以把 mrtg.cfg 複製個 1000 份,每份改一個 filename & target name 即可測試).即使你用
speedcgi ,也只是把1000 變成 2000, 因為根本問題並沒有解決

mrtg 資料儲存的方法固定
如此 log 檔才不會太大,畫 d w m y (day,week,month,year) 圖時才會快,不過你可以
想像,你的每五分鐘資料過了 50  個小時後(5x603=3015 分鐘,約50小時) 就會變成 30 分鐘平均值....,..
當您需要一個月前每五分鐘值,以無法再從 mrtg 中找到,因為它會將6 個5分鐘合併計算為一個30分鐘,且
你無法改變這種現況.

無法繪出特定時間需求
mrtg 另外的限制是無法產生說我要最近3天,最後三個月,近十年來等資料,上個月與本月比較,特別標示上班
時間...等繪圖,資料的運算處理上也較少,其僅能產生日週月等較固定的資料.

數值差異過大問題       
如果你有兩個資料,一個是 Web 連線數,一個是 Web 資料傳輸量,此時你要將這兩個值畫在 mrtg 上,你會發
現,連線數的線圖將小得幾乎看不見,因為傳輸量的值太大了,以致於不能於圖上充份表現出來.除非你的 script
先做了適當的運算,如傳輸量以 K 算,再輸出. (註:mrtg 雖可讓你用 K 值當 Y 軸,但是此時連線數的線值看
起來就和0一樣了),在 mrtg 要解決此一問題,只有事先處理(連線數輸入 logfile 時先給他 x1000),但 rrdtool
是允許你後來再加工運算的


eth0 流量:藍線為 tx,綠線為 tr,但此時 tr 看起來幾乎感覺不到他的存在
(不知什麼是 TR/TX 建議您不要看下去了)

數值再處理的運算式功能
如果您的圖表上突然有一個很大的值,此時,mrtg 的圖檔原資料因 Y 軸的資料都將因此而壓縮,使用 rrdtool
可以用 GE (大於),LE(小於)…等運算式,讓您將這個值改成其他的值(有沒有意義需視您自身的需要而定)

CODE:

[Copy to clipboard]

CDEF:la60u=la60,1000,GT,1000,la60,IF

意思是如果 la60(rrdtool 裏的變數) 大於 1000, 那都算成 1000 來畫圖,不然就用 la60 原來的值
(if (la60 < 1000) then la60u=1000 , else la60u=la60)
CDEF 教學可參考 http://rrdtool.planetmirror.com//tutorial/cdeftutorial.html

MRTG 自有其優缺點, RRDTOOL 也不見得是最佳解,用什麼東西來做你的 Monitor 端看個人的需要而定囉

以下,我們就開始來介紹 rrdtool 的一些基本用法,至於更深入的東西待您自己去發掘了

4. rrdtool 建檔語法 (rrdtool create)

rrdtool create filename
[--start|-b start time]
[--step|-s step]
[DS:ds-name ST]
[RRA:CF]


看起來語法好像不多(因為不多所以讓很多人看不懂),但其實有點精深,這個建檔的動作其實就像建立 mrtg 的
log 檔,但是 rrd 讓你可以自訂五分鐘資料筆數,平均值為多少時間單位,最大值為多少時間單位,要存幾筆資料,
即使用事後發現不足或有問題,依然可使用 tune 來調整.

create         顧名思義,即建檔
filename         隨你取,習慣上會以 .rrd 結尾
--start         這個 filename 的資料記錄起始日期 ,以 1970 年至今的秒數 (預設是現在)
--step                資料的間格時間,習慣上我們會設 300 (秒),您可視自己的需求而定

下面的部份難一點了哦~~要仔細體會了,直接以例子做說明,比如說我們要測 eth0 上的 某些 udp/tcp port
的流量及 總流量(IP 層以上):

DS:telnet:COUNTER:600:0:100000000 \
DS:smtp:COUNTER:600:0:100000000 \
DS:domain:COUNTER:600:0:100000000 \
DS:http:COUNTER:600:0:100000000 \
DS:total:COUNTER:600:0:100000000 \

DS         Data Source DS "宣告" 的意思
telnet         是 DSN (name) , 欄位名稱,意即"變數名稱",
COUNTER 是DST(type),習慣上常用如果輸入資料依序為 98 100 98:
        1.GAUGE(個別值,像CPU loading):產生圖檔時,畫 98 100 98
        2.COUNTER (累計值,像流量資料):產生圖檔時,畫,2 -2
        3.DERIVE (累計值,像流量資料),小於0畫0:產生圖檔時,畫    2   0
        4.ABSOLUTE 如同 COUNTER,但 COUNTER 可能 overflow(數值過大),所以會取絕對值
        補充說明,COUNTER/DERIVE/AVSOLVTE 雖是取差值,但會再除以兩次間隔間的秒數,如上 COUNTER
        例,兩次間隔間為 300 秒,那畫出來的就是 2/300,-2/300 的值
600         是有效期(heartbeat),如果連續如果原來在 12:00 要產生資料而沒有產生,前後 300 秒 (共 600
        秒)的平均值會算成 12:00 的值,如果都沒有值,則會成為 "UNKNOWN" (UN,就像 mrtg 沒有資料時,
        會畫一平線的狀況一樣),考考你,如果你想把現有的 mrtg logfile 轉成 rrd file, 這個值該設為
        多少呢 ?86400 以上
0:100000000         是說 DSN 的數值有效範圍,如果超出這個值,皆視為 UN,這裏也可以寫成 U:U 代表不限範圍

DS 的部份剛開始一定記不熟,不過用久了就不會有太大問題了,一個好記的方式即 "三文字,三數字".
RRA 可能對少數人不容易理解,其實就是什麼資料要存幾筆,以下例為仿 mrtg logfile
RRA:AVERAGE:0.5:1:603 \
RRA:AVERAGE:0.5:6:603 \
RRA:AVERAGE:0.5:24:603 \
RRA:AVERAGE:0.5:288:800 \
RRA:MAX:0.5:1:603 \
RRA:MAX:0.5:6:603 \
RRA:MAX:0.5:24:603 \
RRA:MAX:0.5:288:800

RRA                即 Round Robin Archive,你可以把它看成像 DS,但是這裏主要在處理資料筆數
AVERAGE         在 rrd 稱為 CF (consolidation function),此處我們使用平均數,共有四種類別
                :AVERAGE, MIN,MAX, LAST 意即平均值,最大值,最小值,最後一筆.
0.5:1:603         因為我們將 step 定為 300 秒是指若原計算時間點為 12:00 的話,記錄時要以
                11:57:30~12:02:30 的平均值為主,這個值若在此時間點內只有一筆資料的話,其
                意即是平均值,所以此一值即表原 telnet/smtp…等共要記錄幾筆(若 mrtg 此值為
                 603),603 是指要存 603 筆 (此處故意與 mrtg 同,以利大家判斷),超過603筆,
                則最早之一筆將被移出.
0.5:6:603         僅就 6 解釋,取 6 筆資料(每筆為 step 值,在此意即5分鐘)為平均值( 30 分鐘),
                存 603 筆
0.5:24:603        24 即二小時
0.5:288:800         288 即一天

請注意,不是 0.5:1:603 中的1 就是五分鐘,其乃依據你的 --step 值而定,如果 --step 3600 , 那 0.5:6:603
這一行就是六小時合起來的平均值了.若將 AVERAGE 換成MIN/MAX 的意義則是取該時間點中 (如上例之5min/
30min/2hr..)之最大值或最小值,而通常在監測系統時最大值與平均值是較有實際意義的.

所以,若我們再看一個例子

CODE:

[Copy to clipboard]

rrdtool create sample.rrd -s 600 -b `date -d "2005/03/01" +%s` \
DS:DS1:COUNTER:6000:0:100 \
RRA:MAX:0.5:5:1000

如果 2005/03/01 後,每十分鐘各輸入
1 2 3 4 5 6 7 8 9 10 20 30 40 50 60 70 80 90 100
試問,若畫20050301 該天的圖, 會有幾個數據? 值為何 ? 為什麼 ?

答案為3個數據,值分別為 0.001666667/0.016666667/0.016666667 ,為什麼就看您的理解囉


RRA 再解釋一下大家會較清楚:


所以, DS 主要在宣告資料名稱(DSN)及資料型式(DST),heartbeat 決定資料時間的有效範圍,RRA 則定義了
資料的儲存數量及存什麼樣的 CF (AVERAGE/MAX...),~~其實懂了意義就容易了,不過當出我在 K 資料時,
到是有不少英文與理解上的問題呢!還得在 google 找許多資料來參考.至少你現在看的是中文,要理解,不能
強記.我想大概的重點我想我都指出來了.

回想一下,下列的指令意義你還記得多少?

CODE:

[Copy to clipboard]

rrdtool create /root/study/tcpdump.rrd -s 300 -b `date -d "-1 month" +%s` \
DS:telnet:GAUGE:600:0:10000000 \
DS:smtp:GAUGE:600:0:10000000 \
DS:domain:GAUGE:600:0:10000000 \
DS:http:GAUGE:600:0:10000000 \
DS:pop3:GAUGE:600:0:10000000 \
DS:total:GAUGE:600:0:10000000 \
RRA:AVERAGE:0.5:1:603 \
RRA:AVERAGE:0.5:6:603          \
RRA:AVERAGE:0.5:24:603         \
RRA:AVERAGE:0.5:288:800         \
RRA:MAX:0.5:1:603 \
RRA:MAX:0.5:6:603 \
RRA:MAX:0.5:24:603 \
RRA:MAX:0.5:288:800

-b 處我讓他建立一個一月前為起始的資料,以下我提供一個 rrdtool update 的範例檔
記注意,如果你巳新增了 12:00 的資料, 12:00 之前的資料你就不能再更新了,rrdtool 會和你說
timestamp 小於最後一筆.

5.更新 RRD 資料 (rrdtool update)

rrdtool update filename [--template|-t ds-name[:ds-name]...] N|timestamp:value[:value...]


這個很好理解,基本上就是根據 DS來更新資料,如上述之 tcpdump.rrd,若有需要更新時及時

CODE:

[Copy to clipboard]

$>;rrdtool update tcpdump.rrd  1061811856:114:0:50:1199:0:821073

上面的 1061811856 即時間值,如果就是要現在的時間值,則可以 N 代表,但要轉換成秒值,通常我們都會以

CODE:

[Copy to clipboard]

$>;timestamp=`date +%s `

來轉現在秒數,如果是某些特定時間,則可以

CODE:

[Copy to clipboard]

$>;timestamp=`date -d "2003/08/15 12:00" +%s`

通常這裏你得寫個小程式取數據,或用 snmpget/snmpwalk 抓資料來做 rrdtool update,再用 crontab
根據你在 rrdtool create 時的 step 來決定執行排程的時間點
http://211.72.210.251/tcpdump.txt
這裏提供一個 update 範例檔給大家,其時間範圍為 2003/08/15~2003/08/25,step 為 300s,根據這個檔
您自己可適時的建立自己的 rrd file,最好不要抄上面才好(放不進去 rrdfile,請再將 create 指令再看
一次,一定是你漏了什麼了).

6. 畫圖 (rrdtool graph)
先用簡單範例,引起你的興趣... (看起來好複雜…)

6.1 LINE{1|2|3} 圖例

CODE:

[Copy to clipboard]

#三線圖 (LINE1 是細線,尚有 LINE2,LINE3 (粗線條) 等)
RRD_FILE=/root/study/tcpdump.rrd
rrdtool graph html/example.png \
--title "Host Port Traffic " \
DEF:t1=$RRD_FILE:telnet:AVERAGE \
DEF:t2=$RRD_FILE:smtp:AVERAGE \
DEF:t3=$RRD_FILE:domain:AVERAGE \
LINE3:t1#ff0000:"telnet"        \
LINE2:t2#00ff00:"smtp"          \
LINE1:t3#0000ff:"domain"        \
-h 200 -w 480 -s `date -d "-1 week" +%s` \
-v "Bytes per second"

結果圖表 (三線,LINE3 最粗, LINE1 最細)


由這張圖可以看出來,以三條線來表示三個 port 時,線形有粗細之分(自己需定義),不過此時因每個時
間點不同而有可能交叉,可能增加了我們閱覽時的困難.因為以線來表示較難看出總合情況,所以我們要將
每條線疊起來形成一個堆壘的圖,如此就看出來整個機器這幾個 port 的狀況
(本例以 AREA 繪制,亦可以 STACK 描繪,後述)

6.2 AREA,CDEF 圖例

CODE:

[Copy to clipboard]

#或如下 (畫出時,天,週,的流量圖)
#filename: tcpdump-graph.sh
RRD_PATH="/root/study/tcpdump.rrd"
image_path="/root/study/html"
image_path=/home/httpd/html/enum/study
now=`date "+%Y/%m/%d %H:%M:%S"`
start_time=`date -d "2003/08/12 19:00" +%s`
time="hour day week "
for t in $time
do
/usr/local/bin/rrdtool graph $image_path/example-$t.png \
--title "本機重要 port 流量統計" \
DEF:t1=$RRD_PATH:telnet:AVERAGE \
DEF:t2=$RRD_PATH:smtp:AVERAGE \
DEF:t3=$RRD_PATH:domain:AVERAGE \
DEF:t4=$RRD_PATH:http:AVERAGE \
DEF:t5=$RRD_PATH:total:AVERAGE \
CDEF:v1=t1,t2,t3,t4,+,+,+ \
CDEF:v2=t1,t2,t3,+,+ \
CDEF:v3=t1,t2,+ \
CDEF:v4=t1 \
CDEF:v5=t5,1024,/ \
AREA:v1#339966:"HTTP" \
AREA:v3#FF0000:"SMTP"        \
AREA:v4#0000ff:"TELNET"        \
LINE2:v5#000000:"Total(Kb)"        \
COMMENT:"\n" \
COMMENT:"Last Updated:  $now" \
-v "per second (bytes)" -M -U 10 \
-Y -X b -h 200 -w 480 -s `date -d "-1 $t" +%s` -b 1024
done               

流量小時圖:


流量日圖


流量週圖


上述三圖我們是以區磈(AREA)來畫出,但是原資料如果我們以AREA來畫將出現互相覆蓋的情況,所以得
做一些運作(CDEF 那一段),將適當的加總另外給予另外一變數,而 Total 之值因為過大,如果我們以原
值畫於圖上將造成 HTTP/SMTP/TELNET 的圖形無法適當反應,所以將其除以 1024,而以 Kbytes 來表示.
Rrdtool 是不是很活呢?不過也因為其較靈活所以你多少得花許多時間自己去體會.
個人覺得剛開始學時不容易掌握到要緊,只有靠練習才能生巧,rrd 畫出來的圖覺得比 mrtg 來得有變化,
也更容易 "Customize",但 mrtg 是較好學習的. 若無特殊需要的確不需要另學 rrd.
(註:mrtg 3.x 應會改用 rrd , 之前有看到過這樣文章,我也是先 mrtg->;mrtg-rrd->;rrd )

相关阅读 更多 +
排行榜 更多 +
泽塔奥特曼变身器模拟器手机版下载

泽塔奥特曼变身器模拟器手机版下载

角色扮演 下载
假面骑士ZZZ模拟器SWF下载

假面骑士ZZZ模拟器SWF下载

角色扮演 下载
军团再临安卓版下载

军团再临安卓版下载

策略塔防 下载