python3 菜鸟教程:大作 rrdtool (像 mrtg 的東東) 完全攻略

来源:百度文库 编辑:中财网 时间:2024/10/06 17:12:53
酷!學園
酷!學園 精華區 - [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略

abelyang - 星期一 八月 25, 2003 11:03 pm
文章主題: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
rrdtool 教學
歡迎轉載 ,但有任何修改請來信告知,不得作為商業用途
作者: abelyang
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
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 是會做一些處理的 實際的狀況是
代碼:
每五鐘值存 603 筆,再來是
30 分鐘存 603 筆
2 小時值存 603 筆
一天值存 800 筆

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

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

Class 5 Soft Switch @APOL: mgcd daemon(Media GatewayControler )




# mrtg Threshold Check , 定義 Alert 所在目錄,及 Alert 值,Alert
ThreshDir: /www/htdocs//mrtg/alert/
#依我的
#remote 重
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(小於)…等運算式,讓您將這個值改成其他的值(有沒有意義需視您自身的需要而定)
代碼:
CDEF:la60u=la60,1000,GT,1000,la60,IF

意思是如果 la60(rrdtool 裏的變數) 大於 1000, 那都算成 1000 來畫圖,不然就用 la60 原來的值
(if (la60 < 1000) then la60u=1000 , else la60u=la60)[/i]
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:DST:heartbeat:min:max]
[RRA:CF:xff:steps:rows]


看起來語法好像不多(因為不多所以讓很多人看不懂),但其實有點精深,這個建檔的動作其實就像建立 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..)之最大值或最小值,而通常在監測系統時最大值與平均值是較有實際意義的.

所以,若我們再看一個例子
代碼:
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 找許多資料來參考.至少你現在看的是中文,要理解,不能
強記.我想大概的重點我想我都指出來了.


回想一下,下列的指令意義你還記得多少?
代碼:
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,若有需要更新時及時
代碼:
$>rrdtool update tcpdump.rrd  1061811856:114:0:50:1199:0:821073

上面的 1061811856 即時間值,如果就是要現在的時間值,則可以 N 代表,但要轉換成秒值,通常我們都會以
代碼:
$>timestamp=`date +%s `

來轉現在秒數,如果是某些特定時間,則可以
代碼:
$>timestamp=`date -d "2003/08/15 12:00" +%s`


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


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

6.1 LINE{1|2|3} 圖例
代碼:
#三線圖 (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 圖例
代碼:
#或如下 (畫出時,天,週,的流量圖)
#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 )

6.3 rrdtool graph 一些參數簡單介紹
你若想知道得很清楚建議您到http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/manual/rrdgraph.html
參考其詳細語法,不必費心找其他的連結,因為我覺得其巳經很詳細了.

我僅列出我要介紹的部份供大家參考,你慢慢去體會囉
rrdtool graph image-filename
-s 繪圖資料的起始時間,預設是一天前(-1d),可參考上面的 script ,-s `date …` 的應用,
-e 繪圖資料的結束時間,預設是現在(now),除date 應用外,可用 -e -1w 表示繪圖的時間結束於一週前
--no-minor 不要副格線
-t 圖檔標題
-v Y 軸說明
-w 資料區的寬度,資料區指的是數據顯示的部份,而非說明或圖例
-h 資料區的高度
-u Y 軸正值高度
-l Y 軸負值高度

DEF 重要的地方,其語法為 DEF:your_var:rrd_filename:DS_name:[AVERAGE|MAX..]
請參考上面的 tcpdump-graph.sh
主要用處在於您要取出那個 RRD 檔案的 DSN 到這個 graph 的參數來
CDEF 一個虛擬的變數,其值為 DEF 的某些運算,其運算式需寫成後序
EX: a=1+3 寫成 a=1,3 +
http=(smtp+http+telnet)/1024 寫成 http=1024,smtp,http,telnet,+,+,/
不懂 ? http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/tutorial/ 這裏可以參考,由於
CDEF 太過複雜(其實這裏才是精髓),除了 +-*/ ,您可自行研究
LINE{1|2|3}:vname[#rrggbb[:legend]]
LINE1:your_var#rgb顏色值:圖例說明,這個 "your_var" 需存在 DEF 或 CDEF 的宣告中,
AREA:vname[#rrggbb[:legend]]
AREA 則是畫出資料數值至 0 之間的區磈圖
STACK:vname[#rrggbb[:legend]]
STACK 則是表現在的圖的值,疊在上一個值上
請注意,如果使用 AREA/STACK 時需特別注意圖蓋圖的問題,一定要先畫大的值,
再畫小的值,才會有層次的效果,不然,最大的數據若最後畫,是直接壓過去哦
COMMENT 說明欄字,如 COMMENT:"Last Updated" 將在圖上產生該文字,可以用 \n 等換行符號
GPRINT GPRINT:vname:CF:format vname 即DEF 中的 your_var,而 CF 看你要輸出的文字是
AVERAGE/MAX/MIN/LAST 等數值,format 如同 printf 中的格式,
EX:
GPRINT:telnet:AVERAGE:"%10.0lf \n"
意即要輸出這段時間中 (-s ~ -e 中,telnet的平均值,%10.0lf 則是為了好算位置)
如果你不懂 printf, man 一下會比我解釋一大堆來得快.


其他沒有介紹的參數就有待你自己去發掘了(多看官網上的說明,我相信經過我的介紹您一定可以看懂的)
,還有很多沒有講到的,不過我都講完就沒有意思了.依據這裏的介紹,我們再將流量圖美化些,讓它可以
產生說明文字,更有助於我們的判讀,並將如何 update 資料也一併加入:

代碼: #tcpdump.sh
RRD_PATH="/root/study/tcpdump.rrd"
image_path="/root/study/html"
sec=300
killall tcpdump
mv ip.packet ip.packet.1
tcpdump -w ip.packet  tcp or udp or icmp &
scan_port="23 25 53 80 110"
rrd_data=""
for sport in $scan_port
do
        port=`tcpdump -r ip.packet.1 port $sport -v | sed -e ‘s/.*, len \(.*\))/
\1/g‘ |  tr ‘\n‘ ‘+‘`
        port=`echo ${port}0| bc`
        port=`expr $port / $sec`
        rrd_data="$rrd_data$port:"
done
total=`tcpdump -r ip.packet.1 -v  |grep -v ‘config‘| sed -e ‘s/.*, len \(.*\))/
1/g‘  |  tr ‘\n‘ ‘+‘`
total=` echo ${total}0 | bc`
now=`date +%s`
echo "rrdtool update tcpdump.rrd $now:$rrd_data$total" >>tcpdump.cmd
rrdtool update tcpdump.rrd $now:$rrd_data$total

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 month year"
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,/
COMMENT:"各 PORT 流量統計---最大------平均-------最小-------?#123;在\n"    
AREA:v1#339966:"HTTP"
GPRINT:t4:MAX:"      %12.0lf " 
GPRINT:t4:AVERAGE:"%12.0lf "           
GPRINT:t4:MIN:"%12.0lf "               
GPRINT:t4:LAST:"%12.0lf \n"               
AREA:v2#ffff00:"DNS"       
GPRINT:t3:MAX:"       %12.0lf " 
GPRINT:t3:AVERAGE:"%12.0lf "           
GPRINT:t3:MIN:"%12.0lf "               
GPRINT:t3:LAST:"%12.0lf \n"               
AREA:v3#FF0000:"SMTP"       
GPRINT:t2:MAX:"      %12.0lf " 
GPRINT:t2:AVERAGE:"%12.0lf "           
GPRINT:t2:MIN:"%12.0lf "               
GPRINT:t2:LAST:"%12.0lf \n"               
AREA:v4#0000ff:"TELNET"       
GPRINT:t1:MAX:"    %12.0lf " 
GPRINT:t1:AVERAGE:"%12.0lf "           
GPRINT:t1:MIN:"%12.0lf "               
GPRINT:t1:LAST:"%12.0lf \n"               
LINE2:v5#000000:"全部(Kb)"       
GPRINT:v5:MAX:"  %12.0lf "  \                             
GPRINT:v5:AVERAGE:"%12.0lf "           
GPRINT:v5:MIN:"%12.0lf "               
GPRINT:v5:LAST:"%12.0lf \n"               
COMMENT:"\n"
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`
done

hour:


day:


week:


加上數值的顯示是不是更清楚了呢 ?不過請注意 rrdtool 是不支援中文的,請您用英文來表示你的資料即可.
嗯~如果你覺得很複雜那是正常的,但是其實仔細觀察你可以發現,其實很多地方都很類似,我的感覺是在初學
時才覺得複雜,等做過了一兩個成功的例子後就覺得很簡單了,學任何東西不也都是如此嗎 ?
嗯~tcpdump 抓封包那一段不在我的介紹範圍內,有興趣的人自可 man tcpdump 自己學習一番,或是有人要
貢獻一下也是很好的.

提供大家我的幾個範例當參考,學習的過程中範例其實很重要的,但 rrdtool 的範例其實不多,不然就都是
英文的

6.4 Question: 如何抓 CISCO Switch(假設 24 port) 每個 port 流量呢 ?
6.4.1 方法一
代碼:
# 先使用 mrtg 產生 cfg 檔
cfgmaker Community_String@Switch_or_Router_IP > mrtg.cfg

再來修改 mrtg.cfg , 加入這三行,在最前面
代碼:
# 表示使用 rrdtool 來做 data 的 log , 而不使用 log file
LogFormat: rrdtool   
# rrdtool 所在路徑,如果你裝 rrdtool 的 prefix=/usr 那就是在 /usr/bin 下
PathAdd: /usr/bin/
# 自己找 RRDs.pm 在哪,如果 prefix=/usr 那大概就是在下面這個 path
LibAdd: /usr/lib/perl/


再來,只要跑 mrtg mrtg.cfg ,那 mrtg 就幫你建好 rrd 檔在 LogDir 內(一般同 WorkDir: ),
代碼:
[root@log mrtg]# mrtg /etc/mrtg/mrtg.cfg
[root@log mrtg]# ls -la *.rrd 
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_10.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_11.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_12.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_13.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_14.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_15.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_16.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_17.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_18.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_19.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_1.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_20.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_21.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_22.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_23.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_24.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_2.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_3.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_4.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_5.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_6.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_7.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_8.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_9.rrd


再來,我會百分之百建議到 http://my14all.sourceforge.net/ 抓 14all.cgi 來繪圖.
請辨明上述網站上的版本說明,14all.cgi 抓回來後要修改三個地方
代碼:
#..前略
#if MRTG_lib.pm (from mrtg) is not in the module search path (@INC)
# uncomment the following line and change the path appropriatly:
# 修改這個,找你的 mrtg 的 lib 的路徑在哪裏,建議您將 mrtg 的 pm
# 皆 copy 到 perl modules 的所在目錄
use lib qw(MRTG_lib.pm);

# if RRDs (rrdtool perl module) is not in the module search path (@INC)
# uncomment the following line and change the path appropriatly
# or use a LibAdd: setting in the config file
# 這個是你的 rrdtool 的 RRDS.pm 所在路徑,與你
use lib qw(/usr/local/rrdtool-1.0.38/lib/perl);

#中間略
### where the mrtg.cfg file is
# anywhere in the filespace
#$cfgfile = ‘/home/mrtg/mrtg.cfg‘;
# relative to the script
#$cfgfile = ‘mrtg.cfg‘;
# use this so 14all.cgi gets the cfgfile name from the script name
# (14all.cgi -> 14all.cfg)
# 修改這個對應到你的 mrtg.cfg
$cfgfile = ‘/etc/mrtg/mrtg.cfg‘;

# 後略


以上都修改完成後,將 14all.cgi 置於 mrtg 的 WorkDir 下,並請注意,14all.cgi 需
1. chmod 為 755
2. 對目錄有寫入權限
3. 且該目錄具有執行 CGI 功能 (Apache 中的 Options ExecCGI).
然後你就可以用 http://IP/WorkDir/14all.cgi 來看 mrtg+rrd 所畫出來的圖了.這是一個呈現的範例:


所以,您看是不是很簡單呢 ? (我是覺得 14all.cgi 很簡單且好用,您覺不覺得我就不知道了),用這種東
西有快速簡便的好處,就像用 CACTI 一樣簡單 (http://www.cacti.net/)

6.4.2 用自己寫的方法
建檔的方式就不在說明,上述的 mrtg 產生的 .rrd file 一個就 ds0 (in), 一個叫 ds1(out),所以我
們可以直接拿來使用,並使用 mrtg 會 collection 的 tool,而不用像前面 tcpdump 的例子自己寫
update 語法 (當然,你喜歡也可以囉)
代碼:
[root@log mrtg]# rrdtool info 192.168.0.253_1.rrd
filename = "192.168.0.253_1.rrd"
rrd_version = "0001"
step = 300
last_update = 1117181102
ds[ds0].type = "COUNTER"
ds[ds0].minimal_heartbeat = 600
ds[ds0].min = 0.0000000000e+00
ds[ds0].max = 1.2500000000e+06
ds[ds0].last_ds = "3689202706"
ds[ds0].value = 1.0680042424e+05
ds[ds0].unknown_sec = 0
ds[ds1].type = "COUNTER"
ds[ds1].minimal_heartbeat = 600
ds[ds1].min = 0.0000000000e+00
ds[ds1].max = 1.2500000000e+06
ds[ds1].last_ds = "3880427199"
ds[ds1].value = 2.7916855892e+05
ds[ds1].unknown_sec = 0
#後略

我相信前面的 rrdtool create 介紹您有看懂,這裏一定不會有問題,有問題的話,請在從頭看起.
利用原來的東西畫圖
代碼:
#!/bin/sh
INTERFACE=$1
RRDFILE="/www/htdocs/mrtg/192.168.0.253_$INTERFACE.rrd"

date_range="day week month year"
for t in $date_range
do
rrdtool graph /www/htdocs/mrtg/sample1_$t.png
--title "Switch ($SWITCH) #$INTERFACE 流量" 
-s `date -d "-1 $t" +%s`       
DEF:in=$RRDFILE:ds0:AVERAGE     
DEF:out=$RRDFILE:ds1:AVERAGE   
COMMENT:"In/Out         MAX        AVG         NOW \n" 
AREA:in#00ff00:"In ":
        GPRINT:in:MAX:"%10.0lf" 
        GPRINT:in:AVERAGE:"%10.0lf" 
        GPRINT:in:LAST:"%10.0lf\n" 
LINE2:out#0000ff:"Out":
        GPRINT:out:MAX:"%10.0lf" 
        GPRINT:out:AVERAGE:"%10.0lf" 
        GPRINT:out:LAST:"%10.0lf" 
-w 600 -h 150
done

畫出來的樣子:

如果只有這樣的功能,其實誰會想用呢?用 14all.cgi 就好了,不過再來我們看看其他的呈現方式囉,

代碼:
#!/bin/sh
#一張圖上,圖出兩個 Interface 的流量
RRDFILE1="/www/htdocs/mrtg/192.168.0.253_14.rrd"
RRDFILE2="/www/htdocs/mrtg/192.168.0.253_15.rrd"

date_range="day week month year"
for t in $date_range
do
rrdtool graph /www/htdocs/snmp.enum.org.tw/images/sample2_$t.png
--title "Switch  #14/#15 INTERFACE 流量" 
-s `date -d "-1 $t" +%s`       
DEF:in1=$RRDFILE1:ds0:AVERAGE   
DEF:in2=$RRDFILE2:ds0:AVERAGE   
DEF:out1=$RRDFILE1:ds1:AVERAGE 
DEF:out2=$RRDFILE2:ds1:AVERAGE 
CDEF:n_out1=out1,-1,*   
CDEF:n_out2=out2,-1,*   
COMMENT:"In/Out         MAX        AVG         NOW \n" 
AREA:in1#ff0000:"In14 ":
        GPRINT:in1:MAX:"%10.0lf" 
        GPRINT:in1:AVERAGE:"%10.0lf" 
        GPRINT:in1:LAST:"%10.0lf\n" 
STACK:in2#00ff00:"In15 ":
        GPRINT:in2:MAX:"%10.0lf" 
        GPRINT:in2:AVERAGE:"%10.0lf" 
        GPRINT:in2:LAST:"%10.0lf\n" 
AREA:n_out1#ff0000:"In14 ":
        GPRINT:out1:MAX:"%10.0lf" 
        GPRINT:out1:AVERAGE:"%10.0lf" 
        GPRINT:out1:LAST:"%10.0lf\n" 
STACK:n_out2#00ff00:"In15 ":
        GPRINT:out2:MAX:"%10.0lf" 
        GPRINT:out2:AVERAGE:"%10.0lf" 
        GPRINT:out2:LAST:"%10.0lf\n" 
-w 600 -h 150
done


以上用法主要著重在 CDEF,及 STACK 的應用, CDEF 將某些值轉成負數,以描繪出 in 在上(正值),out 在
下(負值),並以 AREA/STACK 將圖疊在一起,例如,如果您有兩個出口線路,就非常適合這種做法
結果:


所以,若你需要,可以堆疊出許多圖,也可以畫得很簡單,就看你的需要了.

6.5 描繪每部 DNS 的回應狀況
敝人專注於 DNS 之研究,所以回到老本行,我們看看如何來呈現此一問題
代碼:
# rrdtool 建檔語法,您可以一部 DNS 建一個 rrd file ,
rrdtool create /root/study/dnsquery.rrd -s 60   
DS:a:GAUGE:600:-100:10000
DS:b:GAUGE:600:-100:10000
DS:c:GAUGE:600:-100:10000
DS:d:GAUGE:600:-100:10000
DS:ns:GAUGE:600:-100:10000
DS:f:GAUGE:600:-100:10000
DS:g:GAUGE:600:-100:10000
RRA:AVERAGE:0.5:1:14400
RRA:AVERAGE:0.5:6:4800         
RRA:AVERAGE:0.5:24:1200         
RRA:AVERAGE:0.5:288:600         
RRA:MAX:0.5:1:14400     
RRA:MAX:0.5:6:4800             
RRA:MAX:0.5:24:1200             
RRA:MAX:0.5:288:600


取值及畫圖
代碼:

#!/bin/sh
RRD_PATH="/root/study/dnsquery.rrd"
IMAGE_PATH="/www/htdocs/mrtg"

#DNS List
host="a.dns.tw b.dns.tw 61.220.48.1 d.dns.tw ns.twnic.net e.dns.tw f.dns.tw"
rrd_data=""
for dns in $host
do
#取得 dig 最後面的所顯示的查詢時間
        msec=`/bin/dig @$dns . ns | grep ‘Query time‘ | sed -e ‘s/.*: \(.*\) [a-z].*/\1/‘`
        if [ -z $msec ];then
                msec=-100
                echo "$dns 沒有回應,請您注意"| mail MyEmail -s "$dns 無回應"
        fi
        rrd_data="$rrd_data:$msec"
done
now=`date +%s`
echo $rrd_data
rrdtool update $RRD_PATH ${now}${rrd_data}



time="day week "
for t in $time
do
rrdtool graph $IMAGE_PATH/dnsquery-$t.jpg
-t "DNS Query Response Time (${t}ly)"
-w 600 -h 250 -s `date -d "-1 $t" +%s`  -v "msec"  -X b         
        DEF:a=dnsquery.rrd:a:MAX       
        DEF:b=dnsquery.rrd:b:MAX       
        DEF:c=dnsquery.rrd:c:MAX       
        DEF:d=dnsquery.rrd:d:MAX       
        DEF:ns=dnsquery.rrd:ns:MAX     
        DEF:f=dnsquery.rrd:f:MAX       
        DEF:g=dnsquery.rrd:g:MAX       
        CDEF:z0=-1,a,b,c,d,ns,f,g,+,+,+,+,+,+,7,/,*     
        CDEF:a1=a,3000,+       
        CDEF:a11=3000,a,a,-,+   
        CDEF:b1=b,2500,+       
        CDEF:b11=2500,a,a,-,+   
        CDEF:c1=c,2000,+       
        CDEF:c11=2000,a,a,-,+   
        CDEF:d1=d,1500,+       
        CDEF:d11=1500,a,a,-,+   
        CDEF:ns1=ns,1000,+     
        CDEF:ns11=1000,a,a,-,+ 
        CDEF:f1=f,500,+         
        CDEF:f11=500,a,a,-,+   
        CDEF:g1=g,             
        AREA:z0#c0c0c0:"Average Response Time(msec)"   
        COMMENT:"\n"   
        AREA:a1#ff0000:"a.dns.tw"       
        GPRINT:a:MAX:"%12.0lf"         
        GPRINT:a:AVERAGE:"%12.0lf"     
        GPRINT:a:MIN:"%12.0lf"         
        GPRINT:a:LAST:"%12.0lf\n"       
        AREA:a11#ffffff                 
        AREA:b1#800000:"b.dns.tw"       
        GPRINT:b:MAX:"%12.0lf"         
        GPRINT:b:AVERAGE:"%12.0lf"     
        GPRINT:b:MIN:"%12.0lf"         
        GPRINT:b:LAST:"%12.0lf\n"       
        AREA:b11#ffffff                 
        AREA:c1#00ff00:"c.dns.tw"       
        GPRINT:c:MAX:"%12.0lf"         
        GPRINT:c:AVERAGE:"%12.0lf"     
        GPRINT:c:MIN:"%12.0lf"         
        GPRINT:c:LAST:"%12.0lf\n"       
        AREA:c11#ffffff                 
        AREA:d1#008000:"d.dns.tw"       
        GPRINT:d:MAX:"%12.0lf"         
        GPRINT:d:AVERAGE:"%12.0lf"     
        GPRINT:d:MIN:"%12.0lf"         
        GPRINT:d:LAST:"%12.0lf\n"       
        AREA:d11#ffffff                 
        AREA:ns1#0000ff:"ns.twnic.net" 
        GPRINT:ns:MAX:"%8.0lf"         
        GPRINT:ns:AVERAGE:"%12.0lf"     
        GPRINT:ns:MIN:"%12.0lf"         
        GPRINT:ns:LAST:"%12.0lf\n"     
        AREA:ns11#ffffff               
        AREA:f1#000080:"f.dns.tw"       
        GPRINT:f:MAX:"%12.0lf"         
        GPRINT:f:AVERAGE:"%12.0lf"     
        GPRINT:f:MIN:"%12.0lf"         
        GPRINT:f:LAST:"%12.0lf\n"       
        AREA:f11#ffffff                 
        AREA:g1#ff8040:"g.dns.tw"       
        GPRINT:g1:MAX:"%12.0lf"         
        GPRINT:g1:AVERAGE:"%12.0lf"     
        GPRINT:g1:MIN:"%12.0lf"         
        GPRINT:g1:LAST:"%12.0lf\n"     
        COMMENT:"note:<0 means no response\n"
done

這個做法很特別,你也可以轉化成像 ping 等的用法,CDEF 那一段主要在產生每個 HOST 有 500 的差距,
描繪原則即是,畫 a (這個值最大),以白色畫 3000 以下,意即去掉 AREA 3000 以下的部份,在 2500 上
畫 b, 再 2500 以下畫白色 (清除)....其他同理, 所以最後呈現每部主機的 DNS 查詢反應時間的結果,
程式稍複雜,但圖的觀感簡單清楚.



其他 DNS 部份,一般人關心是查詢或回應的狀況,若有心者可看一下這篇上的說明
http://bbs.chinaunix.net/forum/viewtopic.php?t=423629
此篇對許多 ISP 或 Domain Name 代管業者應有不少助益.

6.6 Apache Virtual Host 流量偵測
本例不用 mod_accounting ,因為其僅支援 1.3.x, 不過若您有心可以自己看看如何做,本例由 Demonbane
推薦的 mod_watch(http://www.snert.com/Software/mod_watch/index.shtml)來實現,安裝方法參考上述
網址(裝不起來不要問我哦).
代碼:
#httpd.conf 部份內容
LoadModule watch_module       modules/mod_watch.so

 
  SetHandler watch-info
 

 
  SetHandler watch-table
 


VirtualDocumentRoot /www/htdocs/%0
VirtualScriptAlias  /www/htdocs/%0/cgi-bin/

我們可以試以下列指令求得某一個 VH 的流量
代碼:
[root@log study]# /usr/local/sbin/mod_watch.pl -f ifInOctets,ifOutOctets http://my_someone_virtual_host/watch-info
4538020
235836805
4.37
my_someone_virtual_host

這個東西到這邊巳經很明顯的是 mrtg 的輸出格式,所以你若了解的話基本上 mrtg 的作法就很簡單了

代碼:
# 建檔 ,請多注意 $1 用意
#!/bin/sh
vh=$1
rrdtool create /root/study/mod_watch_$vh.rrd -s 300     
DS:in:COUNTER:600:0:100000000
DS:out:COUNTER:600:0:100000000
DS:req:COUNTER:600:0:100000000
DS:doc:COUNTER:600:0:100000000
DS:gabege:COUNTER:600:0:1
RRA:AVERAGE:0.5:1:14400
RRA:AVERAGE:0.5:6:4800         
RRA:AVERAGE:0.5:24:1200         
RRA:AVERAGE:0.5:288:600         
RRA:MAX:0.5:1:14400     
RRA:MAX:0.5:6:4800             
RRA:MAX:0.5:24:1200             
RRA:MAX:0.5:288:600


代碼:
#更新資料及畫圖
#!/bin/sh
vh=$1
RRDFILE=/root/study/mod_watch_$vh.rrd
IMAGE_PATH=/www/htdocs/211.72.210.251/images
now=`date +%s`
IN_OUT=`/usr/local/sbin/mod_watch.pl -f ifInOctets,ifOutOctets http://$1/watch-info| head -2 | tr ‘\n‘ ‘:‘`
REQ_DOC=`/usr/local/sbin/mod_watch.pl -f ifRequests,ifDocuments http://$1/watch-info|head -2 | tr ‘\n‘ ‘:‘`
rrdtool update $RRDFILE $now:${IN_OUT}${REQ_DOC}0

for t in day week month year
do
rrdtool graph $IMAGE_PATH/mod_watch_${vh}_${t}.png -t "mod_watch 範例"
-s `date -d "-1 $t" +%s`       
DEF:in=$RRDFILE:in:AVERAGE     
DEF:out=$RRDFILE:out:AVERAGE   
DEF:req=$RRDFILE:req:AVERAGE   
DEF:doc=$RRDFILE:doc:AVERAGE   
AREA:in#00ff00:"流入      "     
        GPRINT:in:MAX:"%12.0lf"         
        GPRINT:in:AVERAGE:"%12.0lf"     
        GPRINT:in:MIN:"%12.0lf"         
        GPRINT:in:LAST:"%12.0lf\n"       
LINE1:out#0000ff:"流出    "     
        GPRINT:out:MAX:"%12.0lf"         
        GPRINT:out:AVERAGE:"%12.0lf"     
        GPRINT:out:MIN:"%12.0lf"         
        GPRINT:out:LAST:"%12.0lf\n"       
LINE1:req#ff0000:"Request "     
        GPRINT:req:MAX:"%12.0lf"         
        GPRINT:req:AVERAGE:"%12.0lf"     
        GPRINT:req:MIN:"%12.0lf"         
        GPRINT:req:LAST:"%12.0lf\n"       
LINE1:doc#800000:"Document"     
        GPRINT:doc:MAX:"%12.0lf"         
        GPRINT:doc:AVERAGE:"%12.0lf"     
        GPRINT:doc:MIN:"%12.0lf"         
        GPRINT:doc:LAST:"%12.0lf\n"       
-w 400 -h 100
done

結果


發現沒 ? 什麼問題呢 ? 仔細想想為什麼 Request/Document 值為 0 呢 !? 該如何解決.....



7. 結語
該說的前面都說了,想不想學 rrdtool 完全看你對系統的掌握度...本來是只介紹 rrdtool 的,不過想說
寫多點,就 mrtg/14all.cgi 寫多點了. mrtg/rrd/14all.cgi 摸熟, 對你會很有幫助...官網是一定要去
的地方,不要只看什麼教學文件..那很難學得透徹.
hoyo - 星期一 八月 25, 2003 11:46 pm
文章主題:
果然是“大作”!
看來要花不少的時間消化吸收了!
不過還是先謝了,感謝你分享!
abelyang - 星期二 八月 26, 2003 8:04 am
文章主題:
嗯~~
這篇文章花了我十幾個晚上打字,會講"大作" 是因為 rrdtool 我查了各大搜尋引擎及論壇都沒有人寫過....我相信很多網管人員對 rrdtool 應有相當的需求才是
(當然,用商用的或 ntop 也是很好的選擇,但若你可以自己實作一套符合自己公司環境的 monitor ,再加上一些網頁的控制技巧,絕對比花錢買一套系統更值得)
中間被我那可愛的小 baby 打斷了無數次
其實前幾一我就有貼了一個版本,不過覺得實在寫得不好
就把它 drop 了,如果大家看了上面有什麼意見也可以告訴我一下
讓我將其修得更好 ~~

現在我將 rrdtool 用在
WLAN stat (WLAN 訊號及上線人數)
ROUTE (In/Out, 開機上線人數, DHCP 人數)
29 Switch 每個 Port 及總合 CGI
Snort Report (依主機/事件類別/port ....等區分)Alert
DNS DNS 流量統計
壓力測試 分別跑 BIND/APACHE....等,再以 DOS/DDOS 手法向其發出 request,以 rrdtool 記錄其間的 CPU/Memory/Network/Perforamce/Uptime/Process 等變化
個人 Mail 收寄信數及各種Reject(Spam,Virus) 數統計
.............
Hawker - 星期二 八月 26, 2003 9:28 am
文章主題: Re: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
abelyang 寫到:
前言
(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 的.因為你可能很難去控制或獲得你所要的資料,亦可能難於表現圖檔。


Abel 兄的這篇「大作」小弟佩服,rrdTool 的教學文件大概就屬你這中文版最好了!英文版也未見有如此詳細的說明,頭一次在 IT 領域內覺得看的懂中文是幸福的!讀Abel兄之大作,不勝受恩感激。臨表涕泣,不知所云,望其海涵!
abelyang - 星期二 八月 26, 2003 10:05 am
文章主題:
引言回覆: Abel 兄的這篇「大作」小弟佩服,rrdTool 的教學文件大概就屬你這中文版最好了!英文版也未見有如此詳細的說明,頭一次在 IT 領域內覺得看的懂中文是幸福的!讀Abel兄之大作,不勝受恩感激。臨表涕泣,不知所云,望其海涵!

那裏,您過獎了~不過確實,我看 http://www.rrdtool.org 網站許多地方也看得不知所云(我也覺得他在重要地方寫得太簡單了~~還好有一天我終於領悟了)
很多地方也都是反覆推敲~再找資料與看別人範例
我窮數日之力學習~而更花數倍的時間文件化
netman 兄邀我講流量分析的一些經驗,可惜我受限於現在環境而不能遠遊
所以就寫了這篇文件回敬他了 ~~

不過,要將 word 檔再貼回來版面還真是給他有點無聊的辛苦
netman - 星期二 八月 26, 2003 12:33 pm
文章主題:
感恩哪~~~~
我想哦,日後各版主只要看到是 abel 兄的文章,都可直接丟進"精華區"了.... ^_^
VBird - 星期二 八月 26, 2003 5:27 pm
文章主題:
netman 寫到: 感恩哪~~~~
我想哦,日後各版主只要看到是 abel 兄的文章,都可直接丟進"精華區"了.... ^_^ 是啊!真的很讚說! ^_^
abelyang - 星期二 八月 26, 2003 7:10 pm
文章主題:
兩位過獎了 ~~
不過我的個性本就是工程師本色~~

如果 netman 兄或 Vbird 兄可以的話將文件中的圖存在學園 Local 端如何 ?
至少不會因為我的主機斷線而看不到圖 (我的是很少斷線,不過純為預防)


.....嗯, 個人目前沒有太多時間再學 snmptrap 及 snmpset(都開會去了,無會不與呀!),不然這方面的東西應可以做得更好才是
netman - 星期二 八月 26, 2003 10:15 pm
文章主題:
這樣吧,等我找個時間,將圖抓下來,再轉成 html ,加進 study-area 網站去,
當然,圖片就會在 local 了...
Hawker - 星期二 八月 26, 2003 10:30 pm
文章主題: Re: [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略
abelyang 寫到:
但如果是 COUNTER , 前一值是 98,則會畫 2
能否請教 Abel 兄,上述的說法能否舉個例子呢?這段小弟不懂耶!
abelyang 寫到: 因為我們將 step 定為 300 秒是指若原計算時間點為 12:00 的話,記錄時要以 11:53:30~12:02:30 的平均值為主
小弟發覺 Abel 兄有張圖有做修改,新增了「line1」~「line3」的圖例說明,但這段話沒有改,所以想請教一下!這「11:53:30~12:02:30」時間區間是怎麼推算的呢?因為我推算結果應該是「11:58:30~12:02:30」,以 12:00 為中間點,前後擴展150s,是小弟忽略到文中那個重點了嗎?

小弟參考了 Abel 兄的大作和手邊的一些資料,在 Solaris 9 x86 04/03 的平台上做了一個本機網路卡的流量監控,rrdtool database 如下:
代碼: rrdtool create /usr/local/misc/rrdtool-1.0.45/var/rtls0.rrd -s 300
DS:in:DERIVE:600:0:1000000000
DS:out:DERIVE:600:0:1000000000
RRA:AVERAGE:0.5:1:576
RRA:AVERAGE:0.5:6:672
RRA:AVERAGE:0.5:24:732
RRA:AVERAGE:0.5:144:1460

DST 的型態我選用 DERIVE 而非 COUNTER,是因為有人提到如下的說法,不知Abel 兄有什麼看法呢?:
代碼: According to the RRDTool documentation, you‘re supposed to use COUNTER for these types of data, but I‘ve found RRDTool generates large spikes in the trends if the traffic counters are unexpectedly reset (ie, when you reboot your linux box).
緊接著畫 rrdtool 的圖,使用如下的 perl:
代碼: #!/usr/local/bin/perl
use RRDs;

# define location of rrdtool binary
my $rrdtool = ‘/usr/local/bin/rrdtool‘;
# define location of rrdtool databases
my $rrd = ‘/usr/local/misc/rrdtool-1.0.45/var‘;
# define location of images
my $img = ‘/work/www/htdocs/rrdtool‘;

# define the network interface
my $iface = ‘rtls0‘;
# define a description for the interface
my $descr = ‘local ethernet‘;

# get network interface info
my $in = `netstat -I $iface |grep athena|awk ‘{print \$5}‘ `;
my $out = `netstat -I $iface |grep athena|awk ‘{print \$7}‘ `;
# remove eol chars
chomp($in);
chomp($out);

print "$iface traffic in, out: $in, $out\n";

# insert values into rrd
`$rrdtool update $rrd/$iface.rrd -t in:out N:$in:$out`;

# daily traffic graph
RRDs::graph "$img/$iface-day.png",
       "-t", "traffic :: $iface $descr",
       "-h", "80", "-w", "600",
       "-a", "PNG",
       "-v", "bytes/sec",
       "DEF:in=$rrd/$iface.rrd:in:AVERAGE",
       "DEF:out=$rrd/$iface.rrd:out:AVERAGE",
       "AREA:in#11EE11:Incoming",
       "LINE1:in#009900",^M
       "GPRINT:in:MAX:  Max\\: %3.lf %s",
       "GPRINT:in:AVERAGE: Avg\\: %3.lf %S",
       "GPRINT:in:LAST: Current\\: %3.lf %Sbytes/sec\\n",
       "LINE2:out#0000FF:Outgoing",
       "GPRINT:out:MAX:  Max\\: %3.lf %S",
       "GPRINT:out:AVERAGE: Avg\\: %3.lf %S",
       "GPRINT:out:LAST: Current\\: %3.lf %Sbytes/sec";
if ($ERROR = RRDs::error) { print "$0: unable to generate daily traffic graph: $ERROR\n"; }

畫出來的結果就如下圖:

output 的部分不是很明顯,感覺很糟,有什麼方法可以改善的嗎?小弟今天的努力先到這了,我得起來走動走動了!
abelyang - 星期三 八月 27, 2003 12:05 am
文章主題:
引言回覆: 但如果是 COUNTER , 前一值是 98,則會畫 2
這個狀況是如果你的 rrdtool update 資料如果是一直會加上去的 (如網路流量資料)

12:00 1000
12:05 1200
12:10 1350

則在畫圖時會以 "差值來畫" ,即是 12:05 分畫 200,12:10 分畫 150 也就是說如果你的 update資料是累計值,則以差值來畫圖,如果 DST 是 GAUGE 的話,那它就是直接畫那個數字了 (這個狀況則較常發生在連線數,系統負載,等較無累積特性之資料)

至於使用 COUNTER 在 reset box 後的問題,在 GAUGE 也是會有一點問題, mrtg 也是一樣,在發生時間點:

12:13 linux restart,all data become to 0
12:15 100

會發生 -1250 的狀況,此時用 DRIVER 則會將其視為 0,或您的 COUNTER 宣告時即表示 0:1000000, 理論上應不會有問題 (這個我沒有多注意)
不然要用 CDEF 來特別處理,例如,如果數值小於0 就畫0
原意: v1=if (tr < 0 ) { 0 } else { tr } (如果 tr 小於 0 則為0,不然為原值)
CDEF:v1=tr,0,LT,0,tr,IF 亦可處理此一狀況(不好理解...,可將 RPN 再多看一點http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/tutorial/)

引言回覆: 小 弟發覺 Abel 兄有張圖有做修改,新增了「line 1」~「line3」的圖例說明,但這段話沒有改,所以想請教一下!這「11:53:30~12:02:30 」時間區間是怎麼推算的呢?因為我推算結果應該是「11:58:30~12:02:30」,以 12:00 為中間點,前後擴展 150s,是小弟忽略到文中那個重點了嗎?
嗯~~這是我的筆誤...我等會回頭去修正一下.是您說的狀況沒有錯, step 的 正負一半值 (+-150s)

引言回覆: RRDs::graph "$img/$iface-day.png",
"-t", "traffic :: $iface $descr",
"-h", "80", "-w", "600",
"-a", "PNG",
"-v", "bytes/sec",
"DEF:in=$rrd/$iface.rrd:in:AVERAGE",
"DEF:out=$rrd/$iface.rrd:out:AVERAGE",
"AREA:in#11EE11:Incoming",
"LINE1:in#009900",^M
"GPRINT:in:MAX: Max\\: %3.lf %s",
"GPRINT:in:AVERAGE: Avg\\: %3.lf %S",
"GPRINT:in:LAST: Current\\: %3.lf %Sbytes/sec\\n",
"LINE2:out#0000FF:Outgoing",
"GPRINT:out:MAX: Max\\: %3.lf %S",
"GPRINT:out:AVERAGE: Avg\\: %3.lf %S",
"GPRINT:out:LAST: Current\\: %3.lf %Sbytes/sec";
首先您 in 畫了兩次 , AREA,LINE2 , AREA 的功能就是 LINE{1|2|3} 至 X 軸間的區間整個都畫成 11EE11 的顏色,此時再加 Line 容易混淆 (您亦可能有自己的深意)
out 值就是一開始提到的,資料數據間相差太大時,數值小的將不容易顯現,解決方法有兩種:

1. 將 in 除以 1024 (以 Kbytes 計算),而 out 值仍為 bytes 算
v_in=in,1024,/ =>AREA:v_in...Incoming(Kb) 的輸出結果將是除過 1024 的值
2. 皆以 AREA 畫圖,但將小值放在上面 (做一次你就會明白我說的)
CDEF:v_out=in,out,+

AREA:v_out....
AREA:in.....

至少疊在上面會得較清楚些..且看到 v_out 的值除了可以看出 out 的量外也可看出 TR+TX 的總合

另外
引言回覆: "GPRINT:out:LAST: Current\\: %3.lf %Sbytes/sec";
先改成 "GPRINT:out:LAST: Current\\: %3.lf bytes/sec";
將 %S 拿掉也不要用 %s, 此時 rrdtool 將以 bytes 表示

至於您圖中間 "讓幾康(台語)" 我並不了解原因,可能是 cronjob 或您自身因素所致

不錯了呀~~第一天就有這樣的結果了 ...
當初我是 K 了三天才動手做我的第一個實作~~
也是一直出包 , 一定要出過包,不然學不好哦

PS: 若有需要我會直接改第一篇的文字或說明讓大家可以更明白
還請 netman 兄先佔緩 local 端的動作
paulso - 星期三 八月 27, 2003 4:59 am
文章主題:
netman 寫到: 感恩哪~~~~
我想哦,日後各版主只要看到是 abel 兄的文章,都可直接丟進"精華區"了.... ^_^
的確,自從 abel 兄上了 study area 之後,另各學員獲益不少
netman - 星期六 八月 30, 2003 8:21 pm
文章主題:
okay,文章已收錄至:

http://www.study-area.org/tips/rrdtool/rrdtool.html
robbinl - 星期六 九月 06, 2003 10:52 am
文章主題:
請問 ,那要用這套工具來取代mrtg, 要如何作
abelyang - 星期六 九月 06, 2003 4:18 pm
文章主題:
robbinl 寫到: 請問 ,那要用這套工具來取代mrtg, 要如何作
就您寫給我的 mail 而言是的
先了解 rrd file 的結構,建出你的 rrd file, 如果像想將 mrtg 的資料直接轉過去
可參考 http://phorum.study-area.org/viewtopic.php?t=17750
但這個例子我只 parser 前面五分鐘的而以,其他時間的數據我並沒有做

所以流程中是建 rrd file, 定期 update
畫圖可於瀏覽時再去畫即可
建議您將全篇來回多看幾次哦~剛開始做會有很多不能貫通之處
多實作才能像我這麼熟哦
polinwei - 星期二 九月 16, 2003 11:57 am
文章主題: rrdtool
請問什麼時候才需要作 update 的動作 ? 有需要排在 crontab 裡嗎?
---------------------------------------------------------------------------
.新增資料
rrdtool update filename [--template|-t ds-name[:ds-name]...] N|timestamp:value[:value...]
這個很好理解,基本上就是根據 DS來更新資料,如上述之 tcpdump.rrd,若有需要更新時及時
$>rrdtool update tcpdump.rrd 1061811856:114:0:50:1199:0:821073
上面的 1061811856 即時間值,如果就是要現在的時間值,則可以 N 代表,但要轉換成秒值,通常我們都會以
$>timestamp=`date +%s `
來轉現在秒數,如果是某些特定時間,則可以
$>timestamp=`date -d "2003/08/15 12:00" +%s`

通常這裏你得寫個小程式取數據,或用 snmpget/snmpwalk 抓資料來做 rrdtool update,再用 crontab 根據你在 rrdtool create 時的 step 來決定執行排程的時間點
http://211.72.210.199/tcpdump.txt這裏提供一個 update 範例檔給大家,其時間範圍為 2003/08/15~2003/08/25,step 為300s,根據這個檔您自己可適時的建立自己的 rrd file,最好不要抄上面才好(放不進去 rrdfile,請再將 create指令再看一次,一定是你漏了什麼了).
abelyang - 星期二 九月 16, 2003 2:40 pm
文章主題:
是的,用 cronjob 做排程,但請注意這段文字
引言回覆: 通常這裏你得寫個小程式取數據,或用 snmpget/snmpwalk 抓資料來做 rrdtool update,再用 crontab 根據你在 rrdtool create 時的 step 來決定執行排程的時間點
peyyi - 星期三 九月 24, 2003 5:45 pm
文章主題:
to~ dear abelyang:
看到這...感覺非常感動...!!竟然有人把rrd用中文寫的這麼透徹,由於我目前學校的專題也是做rrd的,找其相關資料...就很想淚滿面,因為幾乎都是英文...,每次都要從裡面臆測原意,總之頭痛萬分...當我不小心逛到這,彷彿就像在沙漠中看到綠洲,有點傻眼了...不是傻傻的眼花哦...而是佩服的眼神愣住了!!Linux基礎能力一點都沒有的我們,只能用windows2000架設,可是不知道為什麼...架構大致上都出來了,就無法產生圖解...總之目前仍是努力階段...只是看到你的大作...卻忍不住想向你說聲"利害"。
abelyang - 星期三 九月 24, 2003 10:25 pm
文章主題:
那裏~
至於 windows 版的 rrd 我沒有玩過, 我猜問題可能出在 gd 上
如果你一直都無法解決的話可至 www.rrdtool.org 上的 mailist list (rrd-users)
去問問看~我也艾莫能助
也預祝您們成功哦~

觀念若有不懂處歡迎隨時回來問 , CDEF 是一大重點哦!!
vincente - 星期四 九月 25, 2003 10:48 am
文章主題:
請教abelyang 大大,

小弟寫了一隻 script 來抓 memory 使用量的數字,想要用 rrdtool 來畫,
發現,如果數字不大,它就畫得出來,出果數字像這樣 2015116 它就畫不出來了。

是我哪個地方設錯了嗎?我都是用 GAUGE 來 create 的,是這裡的問題嗎?
可是我試過別的,也都有同樣的情況 ...

不知您是否有遇過類似的情況?
abelyang - 星期四 九月 25, 2003 12:28 pm
文章主題:
我猜可能是 DS 值的上下界沒設好
如果方便的話您可貼上來您的 rrdtool create 語法,我再幫您看看
neochen - 星期三 十一月 12, 2003 5:33 pm
文章主題:
請教abelyang大大,在你那篇大作中提到的一段
port=`tcpdump -r ip.packet.1 port $sport -v | sed -e ‘s/.*, len \(.*\))/ \1/g‘ | tr ‘\n‘ ‘+‘`
port=`echo ${port}0| bc`
port=`expr $port / $sec`
這個‘sed -e ‘s ................g‘ 我實在不是很了解,可以請你解答一下嗎?

感激不盡
abelyang - 星期三 十一月 12, 2003 5:47 pm
文章主題:
neochen 寫到: 請教abelyang大大,在你那篇大作中提到的一段
port=`tcpdump -r ip.packet.1 port $sport -v | sed -e ‘s/.*, len \(.*\))/ \1/g‘ | tr ‘\n‘ ‘+‘`
port=`echo ${port}0| bc`
port=`expr $port / $sec`
這個‘sed -e ‘s ................g‘ 我實在不是很了解,可以請你解答一下嗎?

感激不盡
tcpdump -v 的訊息格式:
17:43:18.505395 xxx.net.tw > u160-71.u61-70.giga.net.tw: icmp: echo reply (ttl 64, id 13669, len 84)
sed 在抓 那個 "84" 的結果,也就是這個封包 size
"len" 到 ")" 的結果為 \(.*\) 即是 \1 也就是第一個 match
tr 後會變成
N+N+N+N+ , 最後再補一個0成為 echo "N+N+N+N+0" | bc
求出總 size,
neochen - 星期四 十一月 13, 2003 1:34 pm
文章主題:
謝啦abelyang大大,經過你一解釋之後......通了~
再次謝謝你
abelyang - 星期五 十一月 14, 2003 4:20 pm
文章主題:
再貼一個 Performance Monitor 的例子
這個例子在監測每一部 DNS 伺服器的
53/udp 的反應時間,有點像 ping 的樣子
若你要用在 http , smtp 等上面,可以研究 hping2 的
功能,只要是有開 Port 的 Service 都可以測的出來

# 建立 rrdfile ,共七部主機,每個檢測主機連線狀況的時間點為 1 分鐘
代碼: rrdtool create /root/study/dnsquery.rrd -s 60
DS:a:GAUGE:600:-100:10000
DS:b:GAUGE:600:-100:10000
DS:c:GAUGE:600:-100:10000
DS:d:GAUGE:600:-100:10000
DS:ns:GAUGE:600:-100:10000
DS:f:GAUGE:600:-100:10000
DS:g:GAUGE:600:-100:10000
RRA:AVERAGE:0.5:1:14400
RRA:AVERAGE:0.5:6:4800
RRA:AVERAGE:0.5:24:1200
RRA:AVERAGE:0.5:288:600
RRA:MAX:0.5:1:14400
RRA:MAX:0.5:6:4800
RRA:MAX:0.5:24:1200
RRA:MAX:0.5:288:600

# 測試該機器之 DNS 連線品質
代碼: #!/bin/sh
RRD_PATH="/root/study/dnsquery.rrd"
image_path="/root/study/html"

host="主機a 主機b ....,這個例子共七部"
rrd_data=""
for dns in $host
do
#取得查詢的反應時間,查的項目為 Root 列表,非其他 Domain
                msec=`dig @$dns . ns | grep ‘Total‘ | sed -e ‘s/.*: \(.*\) [a-z].*/\1/‘`
                if [ -z $msec ];then
#如果沒有抓到 msec 字眼表示這個查詢敗失敗,改以負值表示
                          msec=-100
                 fi
                 rrd_data="$rrd_data:$msec"
done
now=`date +%s`
#更新 rrd file 資料
rrdtool update $RRD_PATH ${now}${rrd_data}


#產生圖檔 (weekly 統計)
# -x 參數為 每六小時為副格線,共七大格,每格一天,時間表示為 幾月幾日
# CDEF:z0 參數為為平均值,為方便圖的表現,填在負值
# 500,1000,1500 等數值為區分不同的主機,不加這個值,線圖會都疊在一起而難看
# 這個值也可以在 dig 那一段程式處,就先處理 (如先加 500,1000 ..)
# CDEF:a11 為一固定值,因為不能寫常數,所以給他一個恆為 3000,2500 等值之運算
代碼: rrdtool graph ./ping-week.jpg --title="DNS 查詢反應時間" -w 800 -h 600
-v "53/udp dig response time (msec)" -s `date -d "-1 week" +%s` -X b
-up-limit=1000 -x HOUR:6:DAY:7:DAY:1:0:"%m月 %d日"
DEF:a=dnsquery.rrd:a:MAX
DEF:b=dnsquery.rrd:b:MAX
DEF:c=dnsquery.rrd:c:MAX
DEF:d=dnsquery.rrd:d:MAX
DEF:ns=dnsquery.rrd:ns:MAX
DEF:f=dnsquery.rrd:f:MAX
DEF:g=dnsquery.rrd:g:MAX
CDEF:z0=-1,a,b,c,d,ns,f,g,+,+,+,+,+,+,7,/,*
CDEF:a1=a,3000,+
CDEF:a11=3000,a,a,-,+
CDEF:b1=b,2500,+
CDEF:b11=2500,a,a,-,+
CDEF:c1=c,2000,+
CDEF:c11=2000,a,a,-,+
CDEF:d1=d,1500,+
CDEF:d11=1500,a,a,-,+
CDEF:ns1=ns,1000,+
CDEF:ns11=1000,a,a,-,+
CDEF:f1=f,500,+
CDEF:f11=500,a,a,-,+
CDEF:g1=g,
AREA:z0#c0c0c0:"平均反應時間"
COMMENT:"\n"
AREA:a1#ff0000:"主機a"
GPRINT:a:MAX:"%12.0lf"
        GPRINT:a:AVERAGE:"%12.0lf"
        GPRINT:a:MIN:"%12.0lf"
        GPRINT:a:LAST:"%12.0lf\n"
AREA:a11#ffffff
AREA:b1#800000:"主機b"
GPRINT:b:MAX:"%12.0lf"
        GPRINT:b:AVERAGE:"%12.0lf"
        GPRINT:b:MIN:"%12.0lf"
        GPRINT:b:LAST:"%12.0lf\n"
AREA:b11#ffffff
AREA:c1#00ff00:"主機c"
GPRINT:c:MAX:"%12.0lf"
        GPRINT:c:AVERAGE:"%12.0lf"
        GPRINT:c:MIN:"%12.0lf"
        GPRINT:c:LAST:"%12.0lf\n"
AREA:c11#ffffff
AREA:d1#008000:"主機d"
GPRINT:d:MAX:"%12.0lf"
        GPRINT:d:AVERAGE:"%12.0lf"
        GPRINT:d:MIN:"%12.0lf"
        GPRINT:d:LAST:"%12.0lf\n"
AREA:d11#ffffff
AREA:ns1#0000ff:"主機ns"
GPRINT:ns:MAX:"%8.0lf"
        GPRINT:ns:AVERAGE:"%12.0lf"
        GPRINT:ns:MIN:"%12.0lf"
        GPRINT:ns:LAST:"%12.0lf\n"
AREA:ns11#ffffff
AREA:f1#000080:"主機f"
GPRINT:f:MAX:"%12.0lf"
        GPRINT:f:AVERAGE:"%12.0lf"
        GPRINT:f:MIN:"%12.0lf"
        GPRINT:f:LAST:"%12.0lf\n"
AREA:f11#ffffff
AREA:g1#ff8040:"主機g"
GPRINT:g1:MAX:"%12.0lf"
        GPRINT:g1:AVERAGE:"%12.0lf"
        GPRINT:g1:MIN:"%12.0lf"
        GPRINT:g1:LAST:"%12.0lf\n"
COMMENT:"註1:負值表該時間點主機查詢無回應\n"
COMMENT:"註2:各階起點差距值為 500"

結果:

cch - 星期四 一月 29, 2004 3:31 pm
文章主題:
請問
rrdtool update tcpdump.rrd 1061811856:114:0:50:1199:0:821073
中的114:0:50:1199:0:821073 所代表是什麼??value?
abelyang - 星期四 一月 29, 2004 3:57 pm
文章主題:
cch 寫到: 請問
rrdtool update tcpdump.rrd 1061811856:114:0:50:1199:0:821073
中的114:0:50:1199:0:821073 所代表是什麼??value?

第一篇你可能沒有看仔細哦,
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


這裏建了五個 Data Source, rrdtool update 時,若沒有特別指定更新的是那一個 DS, 就要輸入五個,那五個數字就是 DS 的值
ZMAN - 星期五 一月 30, 2004 12:26 pm
文章主題:
早上有緣見到了阿伯本人
(ABEL念起來像阿伯 呵呵)
不過他本人可不像阿伯喔
和鳥哥一樣具備書生氣質

重點是阿伯說
一個月內要在酷學園再貢獻三篇像這樣的巨作
PowerDNS+ PowerAdmin (DB DNS 及網頁介面)
Libnss ( 用 DB 做 login/pop3/... 等認證 )
mod_auth_mysql ( 用 DB 做 htaccess 等帳號認證

大家流口水期待吧
有酷學園和阿伯 人生是彩色的
嘻嘻
damon - 星期五 一月 30, 2004 9:40 pm
文章主題:
以趨勢而言,未來將會是ldap auth的時代,其實現在也已經幾乎是了,其他的用db來作認證的方式,都不是主流,且要整合single sing on也不適合
cch - 星期四 二月 05, 2004 5:29 pm
文章主題:
原來如此...再試試!!
abelyang 寫到: cch 寫到: 請問
rrdtool update tcpdump.rrd 1061811856:114:0:50:1199:0:821073
中的114:0:50:1199:0:821073 所代表是什麼??value?

第一篇你可能沒有看仔細哦,
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


這裏建了五個 Data Source, rrdtool update 時,若沒有特別指定更新的是那一個 DS, 就要輸入五個,那五個數字就是 DS 的值
abelyang - 星期三 六月 02, 2004 2:51 pm
文章主題:
補一下這個 Link For 中文化
感謝 Ada 兄提供給大家的文件
http://phorum.study-area.org/viewtopic.php?t=23822
cjp - 星期二 九月 14, 2004 4:10 pm
文章主題:
請問一下
例如我要將GPRINT:t2:LAST:%6.0lf的值放到某一變數A中要如何做?
abelyang - 星期二 九月 14, 2004 4:21 pm
文章主題:
不就
A=‘GPRINT:t2:LAST:%6.0lf‘
即可 ?
還是您有什麼特別用意沒解釋清楚的地方 !?
太簡單我會懷疑的
cjp - 星期二 九月 14, 2004 5:06 pm
文章主題:
RRDs::graph "c:\\inetpub\\rrdtool\\$fswrrd.gif",
"-s $start",
#"-e $end",
"-t Cisco-2F-SW-Port-$interface[1]-Traffic(1 Min Average)",
"-h", "150", "-w", "760",
"-v Bytes/sec ",
"DEF:t2=$fswrrd.rrd:RX:AVERAGE",
"DEF:t1=$fswrrd.rrd:TX:AVERAGE",
"COMMENT:PORT-----MAX------AVG-----MIN-----NOW(Bytes)\\n",
"AREA:t2#339966:RX",
"GPRINT:t2:MAX:%7.0lf",
"GPRINT:t2:AVERAGE:%6.0lf",
"GPRINT:t2:MIN:%6.0lf",
"GPRINT:t2:LAST:%6.0lf\\n", <------例如想要將這個流量的值放到A這個變數
my $A=‘GPRINT:t2:LAST:%6.0lf‘, <------abelyang您的意思是這樣嗎
"AREA:t1#0000ff:TX",
"GPRINT:t1:MAX:%7.0lf",
"GPRINT:t1:AVERAGE:%6.0lf",
"GPRINT:t1:MIN:%6.0lf",
"GPRINT:t1:LAST:%6.0lf\\n",
"COMMENT:\\n",
"COMMENT:Last Updated: $timenum $timenum2";

PS:我是想藉由這個值來判斷目前traffic.
我PERL學沒多久,還請不吝指教,謝謝.
abelyang - 星期三 九月 15, 2004 11:15 am
文章主題:
引言回覆: "GPRINT:t2:LAST:%6.0lf\\n", <------例如想要將這個流量的值放到A這個變數
my $A=‘GPRINT:t2:LAST:%6.0lf‘, <------abelyang您的意思是這樣嗎
"AREA:t1#0000ff:TX",
my $A="GPRINT:t2:LAST:%6.0lf";

RRD:GRAPH ...
....
"$A",
....

您如此試看看,我不確定是否可以,因為我沒有用 RRDcgi 或 RRD pm,
這種功能我都是組好 command 字串 (rrdtool graph ....),
去做 system call 為主
cjp - 星期四 九月 16, 2004 3:01 pm
文章主題:
請問abelyang
像我要將GPRINT:t2:LAST輸出的值----->"346"這個放到變數"A"裡有辦法嗎?
請幫我想像看!謝謝.


下面的做法好像只是將參數給"A"沒辦法單純取得目前流量的值.
my $A="GPRINT:t2:LAST:%6.0lf";
RRD:GRAPH ...
....
"$A",
....
abelyang - 星期四 九月 16, 2004 5:43 pm
文章主題:
果然~是你問的太簡單... ,文字寫得太簡單之故
下次記得,不然不理你了 ^^

我看你上面的例子是 --step 60
就用這個來回答好了,這個功能在我沒有說明的
rrdtool fetch 或 rrdtool xport 中
不過 rrdtool fetch 我實在沒弄明白,你想要的這個功能之前我也
做不到,所以那個時候就改了一個 for mysql 的版本,所有的資料
都存 mysql , 只可惜 ada 兄沒興趣.
PS: 存 DB 後面的處理就很好做,只是久了資料就會很多

我用 rrdtool xport 給你參考,你自己再用 perl 的 RE parser 或 XML_Parser 出來吧

rrdtool xport --start -60s DEF:a=dnsquery.rrd:a:AVERAGE XPORT:a:DNS_QUERY

代碼:



 
    1095328500
    60
    1095328620
    3
    1
   
      DNS_QUERY
   

 
 
    10953285001.4800000000e+02
    10953285603.3933333333e+01
    1095328620NaN
 




你打 rrdtool xport 就會有語法的解釋...
cjp - 星期四 九月 16, 2004 9:06 pm
文章主題:
[quote="cjp"]abelyang
很感謝你的教導,跟著你的腳步真的是學了不少東西

請問底下這些欄位各是代表什麼意思???


10953285001.4800000000e+02
10953285603.3933333333e+01
.................................................^^^^^^^^^^^^
看起來好像是目前的traffic,不知道我說的對不對
1095328620NaN
[/quote]
cjp - 星期四 九月 16, 2004 10:01 pm
文章主題:
abelyang
很感謝你的教導,跟著你的腳步真的是學了不少東西

請問底下這些欄位各是代表什麼意思???


10953285001.4800000000e+02
10953285603.3933333333e+01
.................................................^^^^^^^^^^^^
看起來好像是目前的traffic,不知道我說的對不對
1095328620NaN

abelyang - 星期五 九月 17, 2004 2:22 am
文章主題:
你說的沒有錯呀~
至於是否有更好的方法,我只能建議你要自己去找找..

那個 xport 出來的東西,你用 perl 的 XML Parser pm
很簡單就可以解出,自己多練習囉,自己也要多驗證,
你若自己肯去看 rrdtool 官網,你的疑問上面就寫得很明白了
cjp - 星期五 九月 17, 2004 2:47 pm
文章主題:
請問abelyang用 perl 的 XML Parser pm轉出來是像下面這樣子嗎?最後一行的錯誤訊息是什麼意思呢?
用rrdtool xport匯出來的資料存成"xxx.XML"不可以直接用網頁的方式看嗎?謝謝

\\ ()
xport || #10;
xport ||
xport \\ ()
xport meta || #10;
xport meta ||
xport meta \\ ()
xport meta start || 1095400980
xport meta //
xport meta || #10;
xport meta ||
xport meta \\ ()
xport meta step || 60
xport meta //
xport meta || #10;
xport meta ||
xport meta \\ ()
xport meta end || 1095401100
xport meta //
xport meta || #10;
xport meta ||
xport meta \\ ()
xport meta rows || 3
xport meta //
xport meta || #10;
xport meta ||
xport meta \\ ()
xport meta columns || 1
xport meta //
xport meta || #10;
xport meta ||
xport meta \\ ()
xport meta legend || #10;
xport meta legend ||
xport meta legend \\ ()
xport meta legend entry || 111
xport meta legend //
xport meta legend || #10;
xport meta legend ||
xport meta //
xport meta || #10;
xport meta ||
xport //
xport || #10;
xport ||
xport \\ ()
xport data || #10;
xport data ||
xport data \\ ()
xport data row \\ ()
xport data row t || 1095400980
xport data row //
xport data row \\ ()
xport data row v || 1.5340000000e+004
xport data row //
xport data //
xport data || #10;
xport data ||
xport data \\ ()
xport data row \\ ()
xport data row t || 1095401040
xport data row //
xport data row \\ ()
xport data row v || 2.0116666667e+004
xport data row //
xport data //
xport data || #10;
xport data ||
xport data \\ ()
xport data row \\ ()
xport data row t || 1095401100
xport data row //
xport data row \\ ()
xport data row v || NaN
xport data row //
xport data //
xport data || #10;
xport data ||
xport //
xport || #10;
//
\\ (id me)
foo || Hello World
//

no element found at line 1, column 0, byte -1 at C:/perl/site/lib/XML/Parser.pm line 187
abelyang - 星期五 九月 17, 2004 6:01 pm
文章主題:
你要好好自己思考吧...如果 XML 不行,沒有別的方法嗎 !?
不需要每件事情都問人,先把 perl 學好,再來想這個問題
難道還需要我教你 perl 或語言
cjp - 星期四 九月 23, 2004 11:27 am
文章主題:
abelyang說的很有道理
我要的需求都TRY出來了,還是很感謝你的指導.
我是用fetch的方式抓流量,然後再來發mial的告警
abelyang - 星期四 九月 23, 2004 11:59 am
文章主題:
嗯~您的學習方式是對的...
官網上對 fetch 很清楚的解釋,
我的說明大柢上只是引領大家進入 rrdtool 的路...
(最難的是對 create 的語法理解),再來路怎麼走怎麼修就得看個
人發揮了
realhawk2004 - 星期一 九月 27, 2004 1:12 pm
文章主題: [問題]请教rrdtool的问题
请教:我在create *.rrd和update之后,create graph,为什么出现如下错误。多谢!!

2148 Segmentation fault rrdtool graph html/example.png --title "HostPort Traffic" DEF:t1=$RRD_FILE:http:AVERAGE LINE3:t1#ff0000:"http" -h200 -w 480 -s `date -d "-1 week" +%s` -v "Bytes per second"
abelyang - 星期一 九月 27, 2004 1:22 pm
文章主題:
Segmentation fault ,你應該是 rrdtool 沒裝好...
注意看看 make;make install 是否有什麼嚴重警告
另外,就是您的 OS 是 !?
realhawk2004 - 星期一 九月 27, 2004 5:03 pm
文章主題:
abelyang 寫到: Segmentation fault ,你應該是 rrdtool 沒裝好...
注意看看 make;make install 是否有什麼嚴重警告
另外,就是您的 OS 是 !?
您好!!我的OS是Redhat Enterprise 3.0 我安装rrdtool没有出现错误提示。我的rrdtool版本是:1.0.40,实在不明白怎么会出现这种问题。谢谢提供帮助!!
abelyang - 星期一 九月 27, 2004 5:59 pm
文章主題:
這種狀況我只能請您多找幾個不同的 rrdtool 版本試看看了
因為我沒有你的環境,不知道你的 complier 條件等
多試試看幾個不同版本
adrianmak - 星期一 十二月 06, 2004 9:58 pm
文章主題:
看過了abelyang的rrdtool 文章,有幾點不明白
e.g.
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

如abelyang 說,mrtg是每5min 有603筆資料, 所以abelyang 就用603
這數目是否隨意的? 比如我想每5min 有 400筆資料 ? 得嗎?
abelyang - 星期一 十二月 06, 2004 11:20 pm
文章主題:
是的,你愛多少筆就用多少筆沒關係
只是 rrd file 大小會受影響而以,
你可多觀察看看, DS 項目數,及 RRA 的定義,對檔案大小的影響
及您 step 間的關係,儘量先自己做,自己觀察,自己找答案,非到不得巳再來問就好, 因為您這個問題較小 case , 多做就知道了
adrianmak - 星期二 十二月 07, 2004 10:36 am
文章主題:
abelyang學長,

筆數多少只對檔案size 有所影響,這點明白
還會對其他有所影響嗎? e.g. 準確度,
e.g.
RRA:AVERAGE:0.5:1:603 \ 與 RRA:AVERAGE:0.5:1:1000

一個每5min 603筆資料,
另一個每5min 1000筆資料

當plot圖時會否有分別?? 是否筆數越多越準確??
abelyang - 星期二 十二月 07, 2004 11:22 am
文章主題:
你再把第一篇看仔細一點...

RRA 控制筆數,603 只有 603x5=3015 分鐘
也就是你的五分鐘資料只有最近30小時的而以
超過30小時的就看有沒有其他 RRA 項目支援了

你在另一個主題中的問題:
引言回覆:
我想問這修改以rrdtool 支持出中文,
但好像修改的部份是hard code的,e.g. font, char coding

我做的修改只 for 我自己的環境在用,你若有興趣,
自可自己改, 在我改的部份中有一行:
setlocale 我註解掉了,有心您可自己研究
至於 font path 問題,
您可 man mkfontdir 去看看結構問題
adrianmak - 星期二 十二月 07, 2004 3:00 pm
文章主題:
mrtg 每筆資料最少要5min
rrdtool有沒有這限制,e.g.我想每1min
adrianmak - 星期二 十二月 07, 2004 3:57 pm
文章主題:
[quote="abelyang"]你再把第一篇看仔細一點...
RRA 控制筆數,603 只有 603x5=3015 分鐘
也就是你的五分鐘資料只有最近30小時的而以
超過30小時的就看有沒有其他 RRA 項目支援了
[quote]

3015 mins為什麼你說只有最近30小時 ??
我的理解是 3015/60 = 50.25小時
adrianmak - 星期二 十二月 07, 2004 3:58 pm
文章主題:
50.25小時 即有最近2天資料

是嗎?
abelyang - 星期二 十二月 07, 2004 5:23 pm
文章主題:
是的,是50 小時,筆誤
1min 問題, 您何不自己試就好呢 ?
自己做實驗就知道了吧
adrianmak - 星期二 十二月 07, 2004 6:07 pm
文章主題:
我看了一篇官方英文文件與abelyang的中文教學,
大致上都已明白怎樣用rrdtool 來create, update 資料
不過還有一點是mrtg 以
5min for a day graph
30min for a week graph
2hr for a month graph
1day for a year graph
我想知那些, 5min, 30min, 2hr, 1day 是否一定要用這些數字?
換句話說,可否
10min for a day graph
1hr for a week graph
1day for a month graph
1month for a year graph


abelyang - 星期二 十二月 07, 2004 6:32 pm
文章主題:
這個問題巳沒什麼好回答的,留給你自己去試吧
adrianmak - 星期二 十二月 07, 2004 10:38 pm
文章主題:
麻煩abelyang學長給我一看以下是我的rrdtool 配置
用來plot eth1 in & out 流量,但plot 出來的圖沒有數據

不知是那方面出錯

rrdtool create eth1.rrd
--start `date +%s`
--step 300
DS:eth1_in:COUNTER:600:0:12500000
DS:eth1_out:COUNTER:600:0:1250000
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:MIN:0.5:1:603
RRA:MIN:0.5:6:603
RRA:MIN:0.5:24:603
RRA:MIN:0.5:288:800
RRA:LAST:0.5:1:603
RRA:LAST:0.5:6:603
RRA:LAST:0.5:24:603
RRA:LAST:0.5:288:800


以下shell script 是放在cron 每5min執行一次
#!/bin/bash
now=`date +%s`

in=eval snmpwalk -c public -v 1 localhost ifInOctets.3 | gawk ‘{ print $4 }‘
out=eval snmpwalk -c public -v 1 localhost ifOutOctets.3 | gawk ‘{ print $4 }‘

/usr/local/rrdtool/bin/rrdtool update /usr/local/rrdtool/db/eth1.rrd $now:$in:$out

/usr/local/rrdtool/bin/rrdtool graph /usr/local/httpd/htdocs/mrtg/test.png
--title "eth1 testing"
DEF:in=/usr/local/rrdtool/db/eth1.rrd:eth1_in:AVERAGE
DEF:out=/usr/local/rrdtool/db/eth1.rrd:eth1_out:AVERAGE
LINE2:in#000080:"incoming"
LINE2:out#0000FF:"outgoing"
-v "bytes" -M

但出來的圖沒有數據

adrianmak - 星期三 十二月 08, 2004 5:47 pm
文章主題:
解決了!! 是個shell script 問題!!
adrianmak - 星期五 十二月 10, 2004 6:12 pm
文章主題:
我想問有時某個時段有很大流量e.g. 1.5M 其餘時段一般時400k
這造成個圖的比例有太正常,其餘時段的只顯示出很少

如何解決 ?
abelyang - 星期五 十二月 10, 2004 6:34 pm
文章主題:
一條線 1 ~1000000 , 結果 1 很小,15000 很大,
結果 1 幾乎看不見,本來就這樣呀 , 您覺得呢 ?
15000 要寫成 150, 1 還是寫 1

若你真要做且不會混淆原來的 150 , 那就去看 CDEF 的用法
想想看你的邏輯有什問題
adrianmak - 星期六 十二月 11, 2004 7:20 am
文章主題:
I try to use tcpdump.sh but I got a problem
sed: -e expression #1, char 19: Unterminated `s‘ command
sed: -e expression #1, char 19: Unterminated `s‘ command
sed: -e expression #1, char 20: Unterminated `s‘ command
adrianmak - 星期六 十二月 11, 2004 7:28 am
文章主題:
這個是我修改一點abelyang提供的tcpdump.ssh
用來plot http, bittorrent
代碼:
RRD_PATH="/usr/local/rrdtool/db/tcpdump.rrd"
image_path="/usr/local/httpd/htdocs/mrtg"
sec=300
killall tcpdump
mv ip.packet ip.packet.1
/usr/sbin/tcpdump -w ip.packet  tcp or udp or icmp &
scan_port="80 9000"
rrd_data=""
for sport in $scan_port
do
        port=`/usr/sbin/tcpdump -r ip.packet.1 port $sport -v | sed -e ‘s/.*, len \(.*\))/
\1/g‘ |  tr ‘\n‘ ‘+‘`
        port=`echo ${port}0| bc`
        port=`expr $port / $sec`
        rrd_data="$rrd_data$port:"
done
total=`/usr/sbin/tcpdump -r ip.packet.1 -v  |grep -v ‘config‘| sed -e ‘s/.*, len \(.*\))/
1/g‘  |  tr ‘\n‘ ‘+‘`
total=` echo ${total}0 | bc`
now=`date +%s`
echo "/usr/local/rrdtool/bin/rrdtool update tcpdump.rrd $now:$rrd_data$total" >>tcpdump.cmd
/usr/local/rrdtool/bin/rrdtool update tcpdump.rrd $now:$rrd_data$total

image_path=/usr/local/httpd/htdocs/mrtg
now=`date "+%Y/%m/%d %H:%M:%S"`
start_time=`date -d "2003/08/12 19:00" +%s`
time="hour day week month year"
for t in $time
do
/usr/local/rrdtool/bin/rrdtool graph $image_path/example-$t.png
--title "Application port traffic analysis"   
DEF:t1=$RRD_PATH:bt:AVERAGE
DEF:t2=$RRD_PATH:http:AVERAGE
DEF:t3=$RRD_PATH:total:AVERAGE
CDEF:v1=t1,t2,+
CDEF:v2=t1
CDEF:v3=t3,1024,/
COMMENT:"PORT analysis---max---average----min-----now\n"
AREA:v1#339966:"HTTP"
GPRINT:t4:MAX:"      %12.0lf "
GPRINT:t4:AVERAGE:"%12.0lf "
GPRINT:t4:MIN:"%12.0lf "
GPRINT:t4:LAST:"%12.0lf \n"
AREA:v2#FF0000:"BT"
GPRINT:t2:MAX:"      %12.0lf "
GPRINT:t2:AVERAGE:"%12.0lf "
GPRINT:t2:MIN:"%12.0lf "
GPRINT:t2:LAST:"%12.0lf \n"
LINE2:v3#000000:"Total(Kb)"
GPRINT:v3:MAX:"  %12.0lf "
GPRINT:v3:AVERAGE:"%12.0lf "
GPRINT:v3:MIN:"%12.0lf "
GPRINT:v3:LAST:"%12.0lf \n"
COMMENT:"\n"
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`
done

但執行是有以下錯誤
sed: -e expression #1, char 19: Unterminated `s‘ command
sed: -e expression #1, char 19: Unterminated `s‘ command
sed: -e expression #1, char 20: Unterminated `s‘ command
likerain - 星期一 十二月 13, 2004 9:49 am
文章主題:
大大..真是太感謝你了....多虧你的這個大作啊
russell - 星期五 十二月 17, 2004 1:24 am
文章主題:
請教abel兄...

rrd檔產生後,可否"新增"or"刪除"某幾個欄位
例如,我有一個rrd file,collect mem_usage,free,page_fault,page-in,page-out
二個月後,覺得pages的三個欄位已不需要,是否可以只刪這三個欄位,
而不需重新 create rrd.(考量到舊資料的保留)
或是有其它方式可以將要保留的欄位資料轉到新的rrd file.
謝謝.
韓仔 - 星期四 一月 06, 2005 10:44 am
文章主題:
請教abel兄.

我用rrdtool來監測dns server,我的作法如下:
一、rrdtool為1.0.41版
二、參考您的語法建立rrd file
rrdtool create /root/dns/dnsquery.rrd -s 60
DS:a:GAUGE:600:-100:10000
DS:b:GAUGE:600:-100:10000
DS:c:GAUGE:600:-100:10000
DS:d:GAUGE:600:-100:10000
DS:ns:GAUGE:600:-100:10000
DS:f:GAUGE:600:-100:10000
DS:g:GAUGE:600:-100:10000
RRA:AVERAGE:0.5:1:14400
RRA:AVERAGE:0.5:6:4800
RRA:AVERAGE:0.5:24:1200
RRA:AVERAGE:0.5:288:600
RRA:MAX:0.5:1:14400
RRA:MAX:0.5:6:4800
RRA:MAX:0.5:24:1200
RRA:MAX:0.5:288:600

三、用vi建立check.sh
#!/bin/sh
RRD_PATH="/root/dns/dnsquery.rrd"
image_path="/var/www/html/rrdtool"


#host="10.12.10.151 10.12.10.155 10.12.10.201 10.12.10.202 10.12.10.12 10.10.10.1 10.10.10.2 "
rrd_data=""
for dns in $host
do
#取得查詢的反應時間,查的項目為 Root 列表,非其他 Domain
msec=`dig @$dns . ns | grep ‘Total‘ | sed -e ‘s/.*: \(.*\) [a-z].*/\1/‘`
if [ -z $msec ];then
#如果沒有抓到 msec 字眼表示這個查詢敗失敗,改以負值表示
msec=-100
fi
rrd_data="$rrd_data:$msec"
done
now=`date +%s`
#更新 rrd file 資料
rrdtool update $RRD_PATH ${now}${rrd_data}

四、在crontab中加入一筆

0-59/5 * * * * /root/dns/check.sh

五、畫圖
#rrdtool graph ./ping-week.jpg --title="ASEK DNS response time" -w 800 -h 600
-v "53/udp dig response time (msec)" -s `date -d "-1 week" +%s` -X b
-up-limit=1000 -x HOUR:6:DAY:7:DAY:1:0:"%mMonth %dDay"
DEF:a=dnsquery.rrd:a:MAX
DEF:b=dnsquery.rrd:b:MAX
DEF:c=dnsquery.rrd:c:MAX
DEF:d=dnsquery.rrd:d:MAX
DEF:ns=dnsquery.rrd:ns:MAX
DEF:f=dnsquery.rrd:f:MAX
DEF:g=dnsquery.rrd:g:MAX
CDEF:z0=-1,a,b,c,d,ns,f,g,+,+,+,+,+,+,7,/,*
CDEF:a1=a,3000,+
CDEF:a11=3000,a,a,-,+
CDEF:b1=b,2500,+
CDEF:b11=2500,a,a,-,+
CDEF:c1=c,2000,+
CDEF:c11=2000,a,a,-,+
CDEF:d1=d,1500,+
CDEF:d11=1500,a,a,-,+
CDEF:ns1=ns,1000,+
CDEF:ns11=1000,a,a,-,+
CDEF:f1=f,500,+
CDEF:f11=500,a,a,-,+
CDEF:g1=g,
AREA:z0#c0c0c0:"AVG response time"
COMMENT:"\n"
AREA:a1#ff0000:"主機a"
GPRINT:a:MAX:"%12.0lf"
GPRINT:a:AVERAGE:"%12.0lf"
GPRINT:a:MIN:"%12.0lf"
GPRINT:a:LAST:"%12.0lf\n"
AREA:a11#ffffff
AREA:b1#800000:"DNS server b"
GPRINT:b:MAX:"%12.0lf"
GPRINT:b:AVERAGE:"%12.0lf"
GPRINT:b:MIN:"%12.0lf"
GPRINT:b:LAST:"%12.0lf\n"
AREA:b11#ffffff
AREA:c1#00ff00:"DNS server c"
GPRINT:c:MAX:"%12.0lf"
GPRINT:c:AVERAGE:"%12.0lf"
GPRINT:c:MIN:"%12.0lf"
GPRINT:c:LAST:"%12.0lf\n"
AREA:c11#ffffff
AREA:d1#008000:"DNS server d"
GPRINT:d:MAX:"%12.0lf"
GPRINT:d:AVERAGE:"%12.0lf"
GPRINT:d:MIN:"%12.0lf"
GPRINT:d:LAST:"%12.0lf\n"
AREA:d11#ffffff
AREA:ns1#0000ff:"DNS server ns"
GPRINT:ns:MAX:"%8.0lf"
GPRINT:ns:AVERAGE:"%12.0lf"
GPRINT:ns:MIN:"%12.0lf"
GPRINT:ns:LAST:"%12.0lf\n"
AREA:ns11#ffffff
AREA:f1#000080:"DNS server f"
GPRINT:f:MAX:"%12.0lf"
GPRINT:f:AVERAGE:"%12.0lf"
GPRINT:f:MIN:"%12.0lf"
GPRINT:f:LAST:"%12.0lf\n"
AREA:f11#ffffff
AREA:g1#ff8040:"DNS server g"
GPRINT:g1:MAX:"%12.0lf"
GPRINT:g1:AVERAGE:"%12.0lf"
GPRINT:g1:MIN:"%12.0lf"
GPRINT:g1:LAST:"%12.0lf\n"
COMMENT:"1:negative value mean no response\n"
COMMENT:"2:GAP=500"

六、從圖中卻沒有看到什麼流量耶,不知道那裡有錯誤,希望abel兄幫忙一下,謝謝。[/img]
abelyang - 星期四 一月 06, 2005 6:58 pm
文章主題:
引言回覆: #host="10.12.10.151 10.12.10.155 10.12.10.201 10.12.10.202 10.12.10.12 10.10.10.1 10.10.10.2 "
rrd_data=""
for dns in $host
do
#取得查詢的反應時間,查的項目為 Root 列表,非其他 Domain
msec=`dig @$dns . ns | grep ‘Total‘ | sed -e ‘s/.*: \(.*\) [a-z].*/\1/‘`
if [ -z $msec ];then
#如果沒有抓到 msec 字眼表示這個查詢敗失敗,改以負值表示
msec=-100
fi
rrd_data="$rrd_data:$msec"
done
now=`date +%s`
#更新 rrd file 資料
rrdtool update $RRD_PATH ${now}${rrd_data}
請先確定這一段有執行結果
echo 出來看看
韓仔 - 星期五 一月 07, 2005 8:50 am
文章主題:
經過我echo的結果,不論是在命令列或網頁都好像沒有什麼產生耶。

我是在command line直接把那些指令貼上執行,不含那些中文。

那裡有錯誤了呢?謝謝
k1951223 - 星期五 一月 07, 2005 4:17 pm
文章主題: rrdtool 問題
各位學長
我最近在學習rrdtool 來作一些系統的效能監測
有下列幾個問題,請各位學長幫忙解答一下

1. 如何在要瀏覽資料時 ,再畫圖

有不少篇文章提到要查資料時再畫圖,可以減少系統的負擔
但是大多數的範例都是在更新資料時順便更新圖檔
在文章中提到的 mrtg + rrdtool 使用 my14all.cgi
我有實作成功,他會去讀取 mrtg的.cfg 檔案 , 作為畫圖的
設定資料,但是我用 rrdtool 去更新 rrd 檔案時, 要如何直
接讀取 rrd 檔作畫圖, 若是要自己寫 cfg 檔, 那要如何寫
是否有格式及範例

2. 在更新資料及畫出日,週,月,年 的統計資料時,大多使用
date %s 及 date -d 等功能,因為我的環境須要跨平台
在 AIX 及 Solaris 上也要使用 , 但是在 某些平台上並
沒有上列的功能可以使用,不知有什麼好的方法可以取代

3. 若是要查一天以前的詳細資料, 以五分鐘為單位的,
一定要寫入資料庫嗎,有什麼辦法可以作到,
另外若是要寫入資料庫的話要如何作

感謝各位學長的協助
k1951223 - 星期五 一月 07, 2005 5:45 pm
文章主題: rrdbrowse
各位學長
在查看有關rrdtool 時發現了 rrdbrowse
請問各位學長有沒有人使用過,可以發表一下
使用感想及安裝方法等
網址 http://www.rrdbrowse.org/index.php
abelyang - 星期二 一月 11, 2005 12:20 pm
文章主題:
韓仔,
你的問題在於你對 "程式" 或 "script" 沒有概念...
你看 dig 的訊息, grep 的條件自己修改一下即可,
不知如何修改不要問我.

k1951223,
rrdtool 本身可以指定時間,不見得要用 date 來做,
例如, -s -1d 是一天前, rrdtool 會自動把他換成秒
這樣的問題,建議您自己研究一下 AIX 等 date 的用法
或在 rrdtool 的 graph 指令上多研究,
至於 rrdbrowse 沒有用過,因為只要了解
rrdtool/snmp/language , 這些東西都可以自己做
k1951223 - 星期二 一月 11, 2005 6:06 pm
文章主題: rrdcgi
感謝 abelyang 的回覆

我現在使用RRDCGI 作劃圖的動作,
相關及用法介結連結如下

http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/rrdcgi.html

可以在查看網頁時才劃圖更新資料,而且語法很簡單

如 abelyang 的回覆 利用 --start -1d --end now 可以指定要劃圖的時間

但是有一個問題是劃新的圖時會根據設定來制作圖檔,
隔一段時間再執行時也會更新資料
但是若是更改cgi 檔案的內容再劃圖則不會根據新的設定重新制作圖檔
不知是否有學長知道要如何處理,

註: 因為要提供使用者在網頁選擇日期後,劃出當天的資料
韓仔 - 星期五 一月 14, 2005 9:08 am
文章主題:
請教abel兄.
我在command line打入
#dig @10.10.10.1 . ns | grep ‘Query time‘ | sed -e ‘s/.*: \(.*\) [a-z].*/\1/‘
得到以下結果
3

但是我將整個script改成以下
#!/bin/sh
RRD_PATH="/root/dns/dnsquery.rrd"
image_path="/var/www/html/rrdtool"
#host="10.12.10.151,10.12.10.155,10.12.10.201,10.12.10.202,10.12.10.12,10.10.10.1,10.10.10.2"
rrd_data=""
for dns in $host
do
msec=`dig @$dns . ns | grep ‘Query time‘ | sed -e ‘s/.*: \(.*\) [a-z].*/\1/‘`
if [ -z $msec ];then
msec=-100
fi
rrd_data="$rrd_data:$msec"
done
now=`date +%s`
rrdtool update $RRD_PATH ${now}${rrd_data}

卻得到以下的結果,可以幫我檢查一下嗎?

#./check.sh
ERROR: expected 7 data source readings (got 0) from 1105664563:...
abelyang - 星期五 一月 14, 2005 11:30 am
文章主題:
k 兄的問題不是很清楚您的狀況,或可再描述清楚些

韓兄的問題,可以很明顯感覺得您對 shell script 不是很了解,
建議您先修好要用的語言,並了解其他的 debug 技巧,再來
研究您現在所碰到的問題較好
k1951223 - 星期五 一月 14, 2005 11:44 am
文章主題: rrdtool
abelyang 學長
我的問題主要是因為,有需求要查看之前的資料
例如,三天前的每五分鐘一筆,一天的流量圖
在利用rrd 畫圖時,必需要等五分鐘後有新的資
料寫入rrd 去執行 rrd GRAPH 時才會更新圖檔
若是沒有新資料寫入,去執行 rrd GRAPH 並不會
更新圖檔,除非把圖檔刪除,建立新的檔案才會立即
更新,是否有什麼參數之類的,可以立即更新圖檔,
或是有什麼寫法,可以立即產生
netboy - 星期日 一月 16, 2005 3:19 pm
文章主題:
我现在装好了rrd,但是发现它不支持中文啊,请问楼主是否可以共享一下修改后的rrdtool ?谢谢
abelyang - 星期二 一月 18, 2005 9:48 am
文章主題:
k1951223 兄,
您用的東西我可能沒用過,無法幫助您,不過建議您可以自己
在 cgi 產生圖檔前,cgi 先做 delete 圖檔的動作,應可以才是
我自己是都這樣做的

netboy:
請把這串全部看完,裏面有提到..
k1951223 - 星期五 一月 21, 2005 6:55 pm
文章主題: rrd cgi 畫圖
各位學長
發現一個網站 http://donitor.shows.it/
有利用rrdtool 去統計 eDonkey 的伺服器流量
在按下圖檔時會秀出不同時間區間的資料
分為 12h , 2d , 8d , 32d 幾種

示範 http://www.edu.uni-klu.ac.at/~splattne/donitor/monitor_12h.html

下載 http://aleron.dl.sourceforge.net/sourceforge/donitor/donitor_1.3.2.tgz
Ada - 星期二 二月 01, 2005 5:20 pm
文章主題:
補充一下,新版的 rrdtool for windows 只剩下 rrdtool.exe 而以...
另外,Windows 上的 rrdtool 一樣有中文字的問題...
k1951223 - 星期四 三月 17, 2005 7:43 pm
文章主題: 圖檔即時更新
各位學長
我現在利用 RRD CGI 作畫圖的動作
己經可以輸入結束時間去查詢過去的流量資料了
但是有幾個問題,使用運作上不是很順利,要請教
各位學長有沒有好一點的作法.

1. 產生圖檔不會更新的問題,有參考 abelyang 的建議
先將圖檔刪除再去,產生新的圖檔及顥示在網頁上

但是這樣變成會有重覆性的 io 動作,是否有辦法將圖
檔產生在記憶體或是變數之類的,就不用將圖存入硬碟
中了

2. 我是利用在url 加上查詢時間以更改畫圖的時間區段,
但是在更改了查詢的時間後,輸入 Enter 鍵圖檔並不會
更新,要按下重新整埋或是 F5 鍵 ,才會顥示新的圖檔,
我也有在html 的輸出加上 no-cache 的設定,還是會有
一様的情形.

請問是否有方法解決上列的情形,不過如果能找到問題一的
解決方法,也許就不會有問題二了


以後,
韓仔 - 星期三 四月 13, 2005 4:34 pm
文章主題:
關於之前詢問rrd的問題,目前已經測試ok了。跟大家分享一下。

先建立rrd file 用以下的指令

#rrdtool create /dnsrrd/dnsquery.rrd -s 60
DS:a:GAUGE:600:-100:10000
DS:b:GAUGE:600:-100:10000
DS:c:GAUGE:600:-100:10000
DS:d:GAUGE:600:-100:10000
DS:ns:GAUGE:600:-100:10000
DS:f:GAUGE:600:-100:10000
DS:g:GAUGE:600:-100:10000
RRA:AVERAGE:0.5:1:14400
RRA:AVERAGE:0.5:6:4800
RRA:AVERAGE:0.5:24:1200
RRA:AVERAGE:0.5:288:600
RRA:MAX:0.5:1:14400
RRA:MAX:0.5:6:4800
RRA:MAX:0.5:24:1200
RRA:MAX:0.5:288:600

建立查詢的script,以七台dns server為例,測試root server的response time

#vi check.sh
#!/bin/sh
RRD_PATH="/dnsrrd/dnsquery.rrd"
image_path="/var/www/html/rrd"

host="10.10.10.5 10.10.10.7 10.12.10.72 10.15.10.13 10.12.11.121 10.13.10.155 10.12.10.84"
rrd_data=""
for dns in $host
do
msec=`dig @$dns . ns | grep ‘Query‘ | sed -e ‘s/.*: \(.*\) [a-z].*/\1/‘`
if [ -z $msec ];then
msec=-100
fi
rrd_data="$rrd_data:$msec"
done
now=`date +%s`
#?? rrd file ??
rrdtool update $RRD_PATH ${now}${rrd_data}



#??
image_path="/var/www/html/rrd"
image_path=/var/www/html/rrd
now=`date "+%Y/%m/%d %H:%M:%S"`
start_time=`date -d "2005/04/13 16:00" +%s`
time="hour day week "
for t in $time
do
/usr/bin/rrdtool graph $image_path/eek_dns$t.png
--title "EEK DNS response time" -h 700 -w 600
-v "53/udp dig response time (msec)" -s `date -d "-1 week" +%s`
-up-limit=1000 -x HOUR:6:DAY:7:DAY:1:0:"%mMonth %dDay"
DEF:a=dnsquery.rrd:a:MAX
DEF:b=dnsquery.rrd:b:MAX
DEF:c=dnsquery.rrd:c:MAX
DEF:d=dnsquery.rrd:d:MAX
DEF:ns=dnsquery.rrd:ns:MAX
DEF:f=dnsquery.rrd:f:MAX
DEF:g=dnsquery.rrd:g:MAX
CDEF:z0=-1,a,b,c,d,ns,f,g,+,+,+,+,+,+,7,/,*
CDEF:a1=a,3000,+
CDEF:a11=3000,a,a,-,+
CDEF:b1=b,2500,+
CDEF:b11=2500,a,a,-,+
CDEF:c1=c,2000,+
CDEF:c11=2000,a,a,-,+
CDEF:d1=d,1500,+
CDEF:d11=1500,a,a,-,+
CDEF:ns1=ns,1000,+
CDEF:ns11=1000,a,a,-,+
CDEF:f1=f,500,+
CDEF:f11=500,a,a,-,+
CDEF:g1=g,
AREA:z0#c0c0c0:"AVG response time"
COMMENT:"\n"
AREA:a1#ff0000:"DNS server a"
GPRINT:a:MAX:"%12.0lf"
GPRINT:a:AVERAGE:"%12.0lf"
GPRINT:a:MIN:"%12.0lf"
GPRINT:a:LAST:"%12.0lf\n"
AREA:a11#ffffff
AREA:b1#800000:"DNS server b"
GPRINT:b:MAX:"%12.0lf"
GPRINT:b:AVERAGE:"%12.0lf"
GPRINT:b:MIN:"%12.0lf"
GPRINT:b:LAST:"%12.0lf\n"
AREA:b11#ffffff
AREA:c1#00ff00:"DNS server c"
GPRINT:c:MAX:"%12.0lf"
GPRINT:c:AVERAGE:"%12.0lf"
GPRINT:c:MIN:"%12.0lf"
GPRINT:c:LAST:"%12.0lf\n"
AREA:c11#ffffff
AREA:d1#008000:"DNS server d"
GPRINT:d:MAX:"%12.0lf"
GPRINT:d:AVERAGE:"%12.0lf"
GPRINT:d:MIN:"%12.0lf"
GPRINT:d:LAST:"%12.0lf\n"
AREA:d11#ffffff
AREA:ns1#0000ff:"DNS server e"
GPRINT:ns:MAX:"%12.0lf"
GPRINT:ns:AVERAGE:"%12.0lf"
GPRINT:ns:MIN:"%12.0lf"
GPRINT:ns:LAST:"%12.0lf\n"
AREA:ns11#ffffff
AREA:f1#000080:"DNS server f"
GPRINT:f:MAX:"%12.0lf"
GPRINT:f:AVERAGE:"%12.0lf"
GPRINT:f:MIN:"%12.0lf"
GPRINT:f:LAST:"%12.0lf\n"
AREA:f11#ffffff
AREA:g1#ff8040:"DNS server g"
GPRINT:g1:MAX:"%12.0lf"
GPRINT:g1:AVERAGE:"%12.0lf"
GPRINT:g1:MIN:"%12.0lf"
GPRINT:g1:LAST:"%12.0lf\n"
COMMENT:"1:negative value mean no response\n"
COMMENT:"2:GAP=500"
COMMENT:"Last Updated: $now"
done


目前只有一個問題,產生出來的格式旁的刻度為0.2 ...等等,不知道要如何改成2 4 6這些整數呢?[/b]
abelyang - 星期四 四月 14, 2005 2:28 pm
文章主題:
如果有圖,大家會更明瞭您的問題所在 (0.2??)
abelyang - 星期二 五月 10, 2005 1:52 am
文章主題:
rrdtool 1.2.X 巳出來一陣子囉...
大家可研究看看...
與上星期同一時間的圖如何畫 ?
我要 DsA 全部,但 DsB 要一個月前就好...
有好幾個新功能...
代碼: Usage: rrdtool [options] command command_options

* graph - generate a graph from one or several RRD

        rrdtool graph filename [-s|--start seconds] [-e|--end seconds]
                [-x|--x-grid x-axis grid and label]
                [-Y|--alt-y-grid]
                [-y|--y-grid y-axis grid and label]
                [-v|--vertical-label string] [-w|--width pixels]
                [-h|--height pixels] [-o|--logarithmic]
                [-u|--upper-limit value] [-z|--lazy]
                [-l|--lower-limit value] [-r|--rigid]
                [-g|--no-legend]
                [-F|--force-rules-legend]
                [-j|--only-graph]
                [-n|--font FONTTAG:size:font]
                [-m|--zoom factor]
                [-A|--alt-autoscale]
                [-M|--alt-autoscale-max]
                [-R|--font-render-mode {normal,light,mono}]
                [-B|--font-smoothing-threshold size]
                [-E|--slope-mode]
                [-N|--no-gridfit]
                [-X|--units-exponent value]
                [-L|--units-length value]
                [-S|--step seconds]
                [-f|--imginfo printfstr]
                [-a|--imgformat PNG]
                [-c|--color COLORTAG#rrggbb[aa]] [-t|--title string]
                [DEF:vname=rrd:ds-name:CF]
                [CDEF:vname=rpn-expression]
                [VDEF:vdefname=rpn-expression]
                [PRINT:vdefname:format]
                [GPRINT:vdefname:format]
                [COMMENT:text]
                [SHIFT:vname:offset]
                [TICK:vname#rrggbb[aa][:[fraction][:legend]]]
                [HRULE:value#rrggbb[aa][:legend]]
                [VRULE:value#rrggbb[aa][:legend]]
                [LINE[width]:vname[#rrggbb[aa][:[legend][:STACK]]]]
                [AREA:vname[#rrggbb[aa][:[legend][:STACK]]]]
                [PRINT:vname:CF:format] (deprecated)
                [GPRINT:vname:CF:format] (deprecated)
                [STACK:vname[#rrggbb[aa][:legend]]] (deprecated)

abelyang - 星期四 五月 26, 2005 5:47 pm
文章主題:
還沒寫好,先借這裏貼一下,看看 layout 情形

RRDTOOL 1.2.x 的差異

1.說明
自從上次的 rrdtool 教學後,頗受好評,不過實至今日, rrdtool 巳從 1.0.x 昇級至 1.2.x 版本,這個 1.2.x
版本基本除了 graph 外,並沒有太多太大的變動,而在 graph 上新增了許多功能,本文的目的主要是向大家解釋
這些新的東西,至於原有的東西您可自參考
http://phorum.study-area.org/viewtopic.php?t=18496 之說明.

2.安裝
這一版的安裝是較費事的,因為它用了幾個較少用的東西(對我而言真的是較少用),你可以在
http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/pub/?M=D
下載到最新版的 tarball , 這個 URL 下有一個 libs/ 的目錄內的東西最好也都一次下載,因為裝 1.2.x
版的 rrdtool 一定會用到. contrib/ 下的東西也值得有興趣的人好好研究.

下載後的東西,請先安裝 libs 下的東西,基本上的裝法就是(每一個 tarball 都要)
代碼:
$>./configure --help         #看好好看一下有什麼要注意的
$>./configure --prefix=/usr     #把東西裝到 /usr 目錄下
$>make ; make install      #編譯及安裝


是的,的確有點費事,且有些 libs 裝起來也要花不少時間,只好耐心等囉.



感覺上的差異
1.2.x 版的 rrdtool 繪圖不再使用 GD , 而使用 libart 及 freetype 等功能來畫圖,所以,我個人在用起
來時,感覺速度上較 1.0.x 版慢了許多,
代碼:
#以 1.2.8 畫 100 張圖,time 所計算之時間
real    1m23.076s
user    0m52.855s
sys     0m7.021s
#以 1.0.42 畫 100 張圖,time 所計算之時間
real    0m27.234s
user    0m21.629s
sys     0m5.209s

所以,可以明顯感覺到 1.2.x 較 1.0.x 版本畫圖上慢上了許多,一般公認大概差了 2~3 倍的時間,主要因為
作者(oetiker) 要讓 rrdtool 的 output 可以產生 PDF 檔,所以才造成這種現象,至於使用上的取捨,就看
您的需求囉, 並沒有說新版的一定會較好這種理由.



新的東西(以下介紹皆針對 rrdtool graph)
DEF:=::[:step=][:start=