博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

系统※网络技术实验室

System & Databses & Networking & Security & Services
evegl.cublog.cn
RRDtools 教學 (一)

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 <tobi@oetiker.ch>;
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 (
累計值,像流量資料),小於00:產生圖檔時,    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 )

发表于: 2007-02-14,修改于: 2007-02-14 10:42,已浏览300次,有评论0条 推荐 投诉

给我留言
版权所有 ChinaUnix.net 页面生成时间:2.85293