日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RRDTool学习资料备忘

發布時間:2023/11/30 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RRDTool学习资料备忘 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

RRDtool?簡介
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內容?:
A)官方文檔?:http://oss.oetiker.ch/rrdtool/doc/index.en.html
B)abel?兄的大作?:http://bbs.chinaunix.net/viewthread.php?tid=552224&highlight=rrdtool
??????????????http://bbs.chinaunix.net/viewthread.php?tid=552220&highlight=rrdtool
作者?:ailms?<ailms{@}263{dot}net>
版本?:v1
最后修改?:2006/11/18?0:06
**********************************************************************************************************************
[/color]
?
??在介紹?RRDtool?之前,讓我們先回顧一下它的前身:MRTG。相信只要做網管工作的朋友,對?MRTG?這個軟件一定不會陌生,

至少也可能聽過。MRTG?可以通過?SNMP?協議直接訪問?SNMP?Object?,例如?ifInOctect?和?ifOutOctect?;也可以通過外部?

script?的方式,來監測cpu、內存、磁盤利用率、數據庫的表空間利用率等信息。只要把?MRTG?放入?crontab?中讓其自動運行,

MRTG?就可以自動為你繪制出每天、每周、每月、每年的統計圖表。?MRTG?甚至還為你提供了自動生成配置文件的?cfgmaker?和

自動生成?HTML?頁面的?indexmaker?這兩個工具,讓你省去逐個編寫?cfg?文件的痛苦。到目前為止,還有很多人在使用它。它現在

有?Unix、Windows?各種平臺,windows?平臺上甚至出現了?PRTG?這樣和?MRTG?很象的東東,輕點鼠標就可以漂亮的完成工作。

既然如此,我們為什么還要介紹?RRDtool?呢?先讓我們看幾個問題,幾個在?MRTG?使用中常見的問題?:


[size=4]?一)MRTG?不能作什么?[/size]

A)[color=blue]MRTG?一張圖表只能顯示2個對象,一個輸入,一個輸出。[/color]如果你想同時顯示多個對象呢?例如筆者的單位有12臺服務器。如果想

???把它們的負載情況都顯示在一個圖表上,MRTG?至少需要6張圖。

B)[color=blue]MRTG無法回放數據。[/color]MRTG?的圖是自動生成的,所采用的數據也是由?MRTG?自己提取的,例如5分鐘平均的記錄有288條,??MRTG每20分鐘合并一次,

????每次合并4個記錄。在50個小時后,288條記錄將全部變成20分鐘平均的數據。如果你想回放這些數據怎么辦呢?對不起,只能去

????看第2個圖了(每周)。

C)[color=blue]MRTG?只有?COUNTER?和?GAUGE?這兩種計算類新。[/color]如果我要監測兩個數值型的對象之間的大小,它們之間的差值可以是正數,也可以

???是負數。MRTG?能實現嗎?筆者在多次試驗中發現,MRTG?對于負數的和?‘.15’??這樣格式的小數(通常都是bc的輸出)的識別會出錯。

???例如把?‘.72’?識別為?72,把?-1?識別為?1。

D)[color=blue]MRTG?無法實現有條件的繪圖。[/color]有時候我們只想看某個服務器在一年之中的宕機時間,正常時間我們不關心;或者我們想看當前值和去年同期相比究竟如何??這些都是

?????MRTG無法做到的

[size=4]二)?MRTG?的優點[/size]

那?MRTG?和?RRDtool?相比就沒有優點了嗎?也不是。簡單、方便就是它的最大優點。

(MRTG?中還有一個好東西就是自動告警功能,相比之下,RRDtool?在這方面的配置比較復雜,

?還不如直接作到?shell?script中)

前面提到?MRTG?能夠通過?cfgmaker?和?indexmaker?快速建立配置文件和HTML頁面。而?RRDtool?在這兩方面都需要自己動手。

數據的采集→插入數據→提取數據→繪圖→建立?HTML?,這些步驟都是需要你自己動手的。RRDtool?給了使用它的人最大程度的自由。但這種

自由對于新手或者沒有耐心的人來說可能是一種考驗。相比之下,MRTG?就容易上手多了。


[size=4]?三)?RRDtool?的定義[/size]

???RRDtool?代表?“Round?Robin?Database?tool”?,作者同時也是?MRTG?軟件的發明人。官方站點位于http://oss.oetiker.ch/rrdtool/?。

???所謂的“Round?Robin”?其實是一種存儲數據的方式,使用固定大小的空間來存儲數據,并有一個指針指向最新的數據的位置。我們可以把用于存儲
???
??數據的數據庫的空間看成一個圓,上面有很多刻度。這些刻度所在的位置就代表用于存儲數據的地方。所謂指針,可以認為是從圓心指向這些刻度的

??一條直線。指針會隨著數據的讀寫操作自動移動。要注意的是,這個圓沒有起點和終點,所以指針可以一直移動,而不用擔心到達終點后就無法前進

??的問題。在一段時間后,當所有的空間都存滿了數據,就又從頭開始存放。這樣整個存儲空間的大小就是一個固定的數值。所以RRDtool?就是使用類似

??的方式來存放數據的工具,RRDtool?所使用的數據庫文件的后綴名是?‘.rrd’。


[size=4]?四)RRDtool?的特殊之處[/size]

A)?首先?RRDtool?存儲數據,扮演了一個后臺工具的角色。但同時?RRDtool?又允許創建圖表,這使得?RRDtoo??看起來又像是前端工具。其他的數據庫

?????????只能存儲數據,不能創建圖表。

B)?RDtool?的每個?rrd?文件的大小是固定的,而普通的數據庫文件的大小是隨著時間而增加的

C)?其他數據庫只是被動的接受數據,?RRDtool?可以對收到的數據進行計算,例如前后兩個數據的變化程度(rate?of??change),并存儲該結果。

D)?RRDtool?要求定時獲取數據,其他數據庫則沒有該要求。如果在一個時間間隔內(heartbeat)沒有收到值,則會用?UNKN?代替,其他數據庫則不會這樣做

[size=4]?五)總結RRDtool?和?MRTG?的不同之處[/size]

A)?MRTG?是采用配置文件的方式來監控的;

??????RRDtool?則沒有配置文件一說。所有操作都是通過命令(也可以寫成script方式)執行

B)?MRTG?有自動采集數據的功能(通過?snmp);

?????RRDtool?沒有,需要手工或者通過?shell/perl?腳本來獲取數據

C)?MRTG?每次運行都會更新圖片和日志;

?????RRDtool?默認知識接收數據,并不會繪圖,除非手工執行?graph?命令

D)?MRTG?采用明文的?log?方式存放歷史數據;
????
?????RRDtool?采用數據庫的方式來存放數據;

E)?MRTG?無法回放日志數據,因為?MRTG?會對日志進行合并;

?????RRDtool?采用?RRA?的概念,把不同統計周期的數據單獨存放,所以可以做到歷史數據的回放功能

F)?MRTG?的?log?中每種周期的記錄的數量是自動維護的;
???
?????RRDtool?的?RRA?中的記錄數是可以自定義的。

G)?MRTG?中數據的統計時間間隔是固定的,例如?5分鐘平均,30分鐘平均,2小時平均,1天平均;
????
??????RRDtool?可以任意設置(試過1分鐘一次)

H)?MRTG?一張圖只能顯示2個對象;

?????RRDtool?可以顯示多個。

I)?MRTG?的數據類型只有?COUNTER?和?GAUGE?兩種;
?
????RRDtool?有5種,COUNTER、GAUGE、DERIVE、ABSOLUTE、COMPUTE

J)?MRTG?的圖表只能顯示當前值、最大值、平均值;

?????RRDtool?可以顯示當前值(LAST)、初值(FIRST)、最大值(MAX)、最小值(MIN)、平均值(AVG)、總和(TOTAL)等

K)?MRTG?繪圖方式只有?AREA、LINE?方式;

?????RRDtool?則有?AREA、LINE(1|2|3)、STACK?方式;

L)?MRTG?負責搜集、存儲、繪圖、建檔(HTML);

?????RRDtool?只負責存儲、繪圖這兩個階段,所以需要自己建立?HTML?文件

M)?MRTG?的運算功能較差;

??????RRDtool?可以通過?CDEF?對取出來的數據進行算術和邏輯運算;

N)MRTG?只能原原本本的顯示數據;

????RRDtool?可以對數據進行處理,或者有條件的顯示;

看來?RRDtool?的功能是不是比?MRTG?強很多呢?!

[color=red]具體的差異目前就只能想到這些,不知各位還有沒有什么補充呢??!!^_^?!![/color]

相信這么講的話還是比較抽象的,不過不用急,目前只是一個開始而已。

下一節我們開始講如何安裝?RRDtool?。

[?本帖最后由?ailms?于?2006-12-4?09:24?編輯?]



?zhdh1999 回復于:2006-12-03 23:09:06

收藏?中。。。:D
謝謝lz


?platinum 回復于:2006-12-04 07:45:38

希望你能將這些貼子合并,現在這樣太分散了不便于管理和閱讀


?ailms 回復于:2006-12-04 09:21:41

回斑竹大人,之前是考慮到內容太長,放在一個貼子里可能看得太類累了。

我現在已經把全部內容放到一個帖子了,不過有些原來的貼子由于被回復了,所以刪除不了。



RRDtool?的安裝
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內容?:
A)官方文檔?:http://oss.oetiker.ch/rrdtool/doc/index.en.html
B)abel?兄的大作?:http://bbs.chinaunix.net/viewthread.php?tid=552224&highlight=rrdtool
??????????????http://bbs.chinaunix.net/viewthread.php?tid=552220&highlight=rrdtool
作者?:ailms?<ailms{@}263{dot}net>
版本?:v1
最后修改?:2006/11/18?0:06
**********************************************************************************************************************
[/color]

[size=4]?一)?安裝前的準備[/size]

??以?Redhat?9?為例?:

??如果要安裝?source?包,請到?:http://oss.oetiker.ch/rrdtool/pub/?M=D,

??如果要安裝?RPM?包,請到http://dag.wieers.com/packages/rrdtool/?。

??不管采用那種方式,都需要先確認當前系統中是否有安裝如下RPM包?:

?


[root@dns1?bob]#?rpm?-qa?|grep?zlib
zlib-1.1.4-8
zlib-devel-1.1.4-8
[root@dns1?bob]#



[root@dns1?bob]#?rpm?-qa?|grep?libpng
libpng-1.2.2-20
libpng10-devel-1.0.13-11
libpng10-1.0.13-11
libpng-devel-1.2.2-20
[root@dns1?bob]#


?
[root@dns1?bob]#?rpm?-qa?|grep?freetype
freetype-utils-2.1.3-6
freetype-devel-2.1.3-6
freetype-2.1.3-6
freetype-demos-2.1.3-6
[root@dns1?bob]#



[root@dns1?bob]#?rpm?-qa?|grep??libart_lgpl?
libart_lgpl-2.3.11-2
libart_lgpl-devel-2.3.11-2
root@dns1?bob]#


[size=4]?二)RPM?方式安裝[/size]

Redhat?9?上?RRDtool?相關的?rpm?包如下,并非所有都要裝,有些只是同一個rpm包不同版本而已。

perl-rrdtool-1.0.50-3.rh9.rf.i386.rpm
perl-rrdtool-1.2.13-1.rh9.rf.i386.rpm
perl-rrdtool-1.2.15-1.rh9.rf.i386.rpm
php-rrdtool-1.0.50-3.rh9.rf.i386.rpm
rrdtool-1.0.50-3.rh9.rf.i386.rpm
rrdtool-1.2.13-1.rh9.rf.i386.rpm
rrdtool-1.2.15-1.rh9.rf.i386.rpm
rrdtool-devel-1.0.50-3.rh9.rf.i386.rpm
rrdtool-devel-1.2.13-1.rh9.rf.i386.rpm
rrdtool-devel-1.2.15-1.rh9.rf.i386.rpm
tcl-rrdtool-1.2.13-1.rh9.rf.i386.rpm


[size=4]?三)source?方式安裝[/size]

???Source?包就簡單了,就一個??:http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.2.14.tar.gz

???下面就以?Source?包的方式安裝?:

????在開始?build?RRDtool?之前,要先決定兩件事?:

????第一是在那個目錄下執行?build?操作。

????第二是想把?RRDtool?安裝在什么位置。

???例如?:


[root@dns1?bob]#?BUILD_DIR=/tmp/rrdbuild?
[root@dns1?bob]#?INSTALL_DIR=/usr/local/rrdtool-1.2.14
[root@dns1?bob]#?mkdir?-p?$BUILD_DIR
[root@dns1?bob]#?cd?$BUILD_DIR
[root@dns1?rrdbuild]?#?tar?zxf?rrdtool-1.2.14.tar.gz
[root@dns1?rrdbuild]?cd?rrdtool-1.2.14
[root@dns1?rrdbuild]?./configure?--prefix=$INSTALL_DIR?&&?make?&&?make?install


??然后需要的就是耐心的等待,正常情況下應該是沒有問題的,如果還是報錯,注意檢查是否滿足上面的?RPM?需求。
?
??當重新出現?shell?提示符時,表示安裝結束。這時候可以執行?rrdtool?命令看是否安裝成功

[size=4]?四)測試安裝是否成功[/size]

引用:
[root@dns1?rrdtool-1.2.14]#?/usr/local/rrdtool-1.2.14/bin/rrdtool

RRDtool?1.2.14??Copyright?1997-2006?by?Tobias?Oetiker?<tobi@oetiker.ch>
????????????Compiled?Oct?14?2006?10:55:28

Usage:?rrdtool?[options]?command?command_options

Valid?commands:?create,?update,?updatev,?graph,?dump,?restore,
?????????????last,?first,?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

[root@dns1?rrdtool-1.2.14]#



???如果出現上述輸出則表示安裝已經成功。不過每次都要輸入這么長的命令豈不是很麻煩。最好加入到?PATH?中去。


[root@dns1?rrdtool-1.2.14]#?vi?~/.bashrc

把?PATH?一行修改為?:

PATH=$PATH:$HOME/bin:/usr/local/rrdtool-1.2.14/bin


??整個安裝過程到此就結束了,是不是很簡單呢?^_^

??如果你是想安裝到別的地方,只要把上面對應的?/usr/local/rrdtool-1.2.14?替換為你想要的目錄就可以了

好了,下一節我們講MRTG和?RRDtool?實施前的規劃問題。

[?本帖最后由?ailms?于?2006-12-4?09:36?編輯?]


?ailms 回復于:2006-12-04 09:22:13

前期規劃
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內容?:
A)官方文檔?:http://oss.oetiker.ch/rrdtool/doc/index.en.html
B)abel?兄的大作?:http://bbs.chinaunix.net/viewthread.php?tid=552224&highlight=rrdtool
??????????????http://bbs.chinaunix.net/viewthread.php?tid=552220&highlight=rrdtool
作者?:ailms?<ailms{@}263{dot}net>
版本?:v1
最后修改?:2006/11/18?0:06
**********************************************************************************************************************
[/color]
???可能大家會覺得奇怪,做個?RRDtool?還要規劃什么?俗話說:磨刀不誤砍柴工。好的規劃必須具備靈活性、可擴展性,否則會給

將來的使用帶來不少的麻煩。我們先談一下?MRTG?的規劃,再談?RRDtool?的規劃。

[size=4]一)MRTG?的前期規劃[/size]

A)[color=blue]想要監測監測什么對象?[/color]并列出一個清單;

B)[color=blue]想要以什么方法來取得數據?[/color]是通過?SNMP?還是?shell?、perl?。如果使用?SNMP?,監測對象所在主機??

??????的?SNMP?服務安裝了嗎?是否配置完畢;

C)[color=blue]每個對象的監測時間是多長時間一次?[/color]并以此對監測對象進行分類。例如筆者本人共用?MRTG?監測了?80?多個對象,并根據

?????內容分成四類?:

?????重要狀態方面?:?例如?HACMP?的切換動作監控;Oracle?服務的狀態;LVM?中的?vg?是否在線;服務器是否宕機等。這些監

???????????????????????????????測對象對于一個系統的運行來說都是十分重要的,一旦發生故障,需要立即處理的。所以對于這類對象,按最

??????????????????????????????小時間間隔(5分鐘一次)設置

?????I/O性能方面?:主要是?I/O?吞吐量、I/O?服務時間方面的監測。這類對象是7分鐘一次

??????次要狀態方面?:例如?cpu利用率、內存利用率、在線人數、溫度、撥號用戶人數等。20分鐘一次

?????利用率方面?:?由于實際應用的問題,所以對利用率比較關心。單獨拎出來做一塊監測。主要是監控Oracle?的各個表空間的利

????????????????????????????用率,以及LVM磁盤系統各個分區的利用率。每25分鐘一次

?????監控機本身?:負責監控的監控機本身也需要監控。主要監控當前監測的對象數量,以及系統負荷。這類就30分鐘一次。


D)[color=blue]每個對象一個?cfg?文件?還是全部集中在一個?cfg?文件中呢?[/color]我本人還是比較傾向于每個?Target一個?cfg?文件,每個?cfg?中都定

????????義?Workdir、Language???這兩個選項。針對上面的5個分類,建立5個?“大的”cfg?文件,再利用?MRTG?中的??Include?功能導入一個個

?????????“小的”、具體的?cfg?文件。這樣當日后對某個監測對象進行修改時(例如修改數據的獲取腳本,或者修改圖片的外觀),可以單獨測試

?????????該對象。不用連同其他對象也一起跑一次,節省不少時間。如果想取消那個對象的監測,在前面提到的那個“大的”cfg?文件中,把對應

????????的?Include?語句注釋掉就可以了,是不是更方便呢?

E)[color=blue]為個監控對象起一個合適的名稱[/color]。一般用?<host_iterm>?的方式。這一步也滿重要的。一開始不注意,隨便給個名字,等到后來自己都

????搞不清楚了,建議一開始就規劃好。如果要使用?MRTG?的告警功能,就更應該好好規劃了,要不然收到告警郵件都不知道是那個對象,那個機

????器出現問題,白白浪費時間。

F)[color=blue]是否需要用到?MRTG?的告警功能。[/color]MRTG?有告警功能,可以設置輸入/出的最大值,最小值。超過限制就會調用?ThreshProgI?和?ThreshProgO?

???選項指定的程序。我一般用發送郵件和HTML配合的方式。下面是告警部分的截圖?:




??

?差不多也就這些了,就可以開始動手寫?script?了。

[size=4]?二)RRDtool?的前期規劃[/size]

RRDtool?的前期規劃相對多一點,因為?RRDtool?很多東西需要自己設定。除了上述?MRTG?考慮的幾點之外,我一般還考慮以下幾點?:

A)[color=blue]是一個?RRD?文件中包括多個監測對象(DS),還是分成多個?RRD?文件??[/color]RRDtool?提供了?tune?操作,可以增加監測對象或者刪除?RRD?文

????件中的某個對象,而且繪圖時也可以指定要畫的是那個對象,這點看個人喜歡而定。

B)[color=blue]如何統計取得的數據?:[/color]MRTG?是固定的,5分鐘、20分鐘、2小時、1天。RRDtool?則可以自己設置

C)[color=blue]如何保存/統計這些數據?:[/color]這是和?MRTG?不同的地方。MRTG?log?的建立和維護是自動的,RRDtool?的數據存放

?????則需要自己定義。但我們可以參照?MRTG?的方式:
???
????每日統計圖(5分鐘平均)??:?600?個,大約2天的時間

????每周統計圖(20分鐘平均)?:?600?個,大約8天的時間

????每月統計圖?(2小時平均)?:?600?個,50?天的時間

????每年統計圖?(1天平均)?:730?個,?2年的時間

D?[color=blue]要以什么方式繪圖?:[/color]MRTG?只有曲線(LINE)和方塊(AREA)兩種;RRDtool?除了這兩種外,還有一種是?STACK?方式。就是在前一個曲線或者方

????塊的基礎上繪圖圖,而不是直接從?X?軸開始繪圖。這樣繪制出來的圖比較清晰,不會出現交叉的現象,但此時?Y?軸的值等于當前對象的值加上前一

???個繪圖對象的值。例如前一個對象(cpu?的系統進程利用率)的值是10,采用的是?AREA?方式繪圖。當前對象(cpu?的用戶級進程的利用率)是5,

???采用的是?STACK?方式,則“cpu的用戶級進程利用率”對應的Y軸刻度是10+5=15;所以如果不加說明,別人可能會誤解。

[size=4]三)實際例子[/size]

A)[color=blue]搞清楚究竟想要監測什么對象?:[/color]監測本地主機的網絡流量。包括?eth0?和?lo?接口的流量。

B)[color=blue]想要以什么方法來取得數據?:[/color]sar?也可以統計網卡接口的流量。但這里我們用?SNMP?,訪問?ifInOctets?和?ifOutOctets?。

????假設腳本名稱是?get_eth0_traffic.sh?和?get_lo_traffic.sh

C)[color=blue]每個對象的監測時間是多長時間一次?:[/color]5分鐘

D)[color=blue]是采用一個?RRD?文件還是多個?:[/color]2個?RRD?文件,一個是?eth0.rrd,一個是?lo.rrd

E)[color=bl;ue]為每個監測對象起名?:[/color]分別是?eth0_in?,eth0_out?,lo_in?,lo_out

F)[color=blue]統計頻率?:[/color]5分鐘、20分鐘、2小時、1天

G)[color=blue]如何保存統計數據?:[/color]600個、600個、600個、730個

H)[color=blue]要以什么方式繪圖?:[/color]目前暫不考慮該問題。等到實際繪圖時再體驗。

[color=red]注?:實際上我們可以把數據的插入、繪圖一起做到?get_eth0_traffic.sh?和?get_lo_traffic.sh?中,但目前這兩個腳本只是負責取數據并輸出而已,

???????????????到最后我們再把這些功能合并到一起。[/color]

[size=4]?四)下面是腳本的內容[/size]


[root@dns1?bob]#?cat?get_eth0_traffic.sh?
#!/bin/bash

#?首先取得?eth0?接口的?ifIndex?
index=$(snmpwalk?-IR?localhost?RFC1213-MIB::ifDescr?|grep?eth0|cut?-d?'='?-f?1|cut?-d?'.'?-f?2)

#?再通過?snmp?協議取得?ififInOctets?和?ifOutOctets?的值
#?由于在?/etc/snmp.conf?中配置了?defVersion?和?defCommunity?,所以?snmpget?命令不用指定這兩個參數

eth0_in=$(snmpget?-IR?-Os?localhost?ifInOctets.${index}|cut?-d?':'?-f?2|tr?-d?'[:blank:]')
eth0_out=$(snmpget?-IR?-Os?localhost?ifOutOctets.${index}|cut?-d?':'?-f?2?|tr?-d?'[:blank:]')
echo?$eth0_in
echo?$eth0_out

[root@dns1?bob]#



[root@dns1?bob]#?cat?get_lo_traffic.sh??????
#!/bin/bash
#?首先取得?eth0?接口的?ifIndex?

index=$(snmpwalk?-IR?localhost?RFC1213-MIB::ifDescr?|grep?lo|cut?-d?'='?-f?1|cut?-d?'.'?-f?2)
lo_in=$(snmpget?-IR?-Os?localhost?ifInOctets.${index}|cut?-d?':'?-f?2|tr?-d?'[:blank:]')
lo_out=$(snmpget?-IR?-Os?localhost?ifOutOctets.${index}|cut?-d?':'?-f?2?|tr?-d?'[:blank:]')
echo?$lo_in

echo?$lo_out
[root@dns1?bob]#


再把這2個腳本放入?crontab?中,每5分鐘執行一次


*/5?*?*?*?*?/home/bob/get_eth0_traffic.sh
*/5?*?*?*?*?/home/bob/get_lo_traffic.sh


不過這樣會有討厭的郵件產生,也可以在腳本中用?while?true?循環,配合?sleep?300?讓腳本一直運行,而不是重復啟動腳本。具體選擇那樣你自己決定。

當所有的準備工作都完成后,就可以開始考慮建庫了。


?ailms 回復于:2006-12-04 09:22:46

建立?RRD?數據庫
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內容?:
A)官方文檔?:http://oss.oetiker.ch/rrdtool/doc/index.en.html
B)abel?兄的大作?:http://bbs.chinaunix.net/viewthread.php?tid=552224&highlight=rrdtool
http://bbs.chinaunix.net/viewthread.php?tid=552220&highlight=rrdtool
作者?:ailms?<ailms{@}263{dot}net>
版本?:v1
最后修改?:2006/11/17?17:35
**********************************************************************************************************************
[/color]

????準備工作都做完了,腳本也寫完了,就可以開始建庫了。建庫實際上就是建立后綴名為?.rrd?的?RRD?文件。

[size=4]一)語法格式[/size]

rrdtool?create?filename?[--start|-b?start?time]?[--step|-s?step]?
[DS:ds-name:DST:dst?arguments]??
[RRA:CF:cf?arguments]


其中?filename?、DS?部分和?RRA?部分是必須的。其他兩個參數可免。

[size=4]二)參數解釋[/size]

A)<filename>?:默認是以?.rrd?結尾,但也以隨你設定。

B)?--step?:就是?RRDtool?“期望”?每隔多長時間就收到一個值。和?MRTG?的?interval?同樣含義。默認是5分鐘。我們的腳本也應該是

??????????每5分鐘運行一次。

C)?--start?:給出?RRDtool?的第一個記錄的起始時間。RRDtool?不會接受任何采樣時間小于或者等于指定時間的數據。也就是說?–-start

??????指定了數據庫最早的那個記錄是從什么時候開始的。如果?update?操作中給出的時間在?–-start?之前,則?RRDtool拒絕接受。--satrt?選項也是
??????
??????可選的。按照?我們在前一篇中的設定,則默認是當前時間減去?600*300秒,也就是50個小時前。?如果你想指定--start?為1天前,可以用??

?
--start?$(date?-d?'1?days?aog'?+%s)


??????注意,--start?選項的值必須是?timestamp?的格式。

D)?DS?:DS?用于定義?Data?Soure?。也就是用于存放腳本的結果的變量名(DSN)。

??????就是我們前面提到的?eth0_in?,eth0_out,?lo_in?,?lo_out?。DSN?從?1-19?個字符,必須是?0-9,a-z,A-Z?。

E)?DST?:DST?就是?Data?Source?Type?的意思。有?COUNTER、GUAGE、DERIVE、ABSOLUTE、COMPUTE?5種。

??????????????由于網卡流量屬于計數器型,所以這里應該為?COUNTER?。

F)?RRA?:RRA?用于指定數據如何存放。我們可以把一個RRA?看成一個表,各保存不同?interval?的統計結果

G)PDP?:Primary?Data?Point?。正常情況下每個?interval?RRDtool?都會收到一個值;RRDtool?在收到腳本給來的值后?會計算出另外

??????一個值(例如平均值),這個?值就是?PDP?;這個值代表的一般是“xxx/秒”的含義。注意,該值不一定等于RRDtool??收到的那個值。除非是?
??????
???????GAUGE?,可以看下面的例子就知道了??????

H)?CF?:CF?就是?Consolidation?Function?的縮寫。也就是合并(統計)功能。有?AVERAGE、MAX、MIN、LAST?四種

??????分別表示對多個PDP?進行取平均、取最大值、取最小值、取當前值四種類型。具體作用等到?update?操作時?再說。

I)?CDP?:Consolidation?Data?Point?。RRDtool?使用多個?PDP?合并為(計算出)一個?CDP。也就是執行上面?的CF?操作后的結果。這個值就是存入?RRA?

??????的數據,繪圖時使用的也是這些數據。


[size=4]?三)再說?DST?[/size]

????DST?的選擇是十分重要的,如果選錯了?DST?,即使你的腳本取的數據是對的,放入?RRDtool?后也是錯誤的,更不用提畫出來的圖是否有意義了。
????
????如何選擇?DST?看下面的描述?:

???A)COUNTER?:必須是遞增的,除非是計數器溢出(overflows)。在這種情況下,RRDtool?會自動修改收到的值。例如網絡接口流量、收到的
???
????????packets?數量都屬于這一類型。

???B)DERIVE:和?COUNTER?類似。但可以是遞增,也可以遞減,或者一會增加一會兒減少。

???C)ABSOLUTE?:ABSOLUTE?比較特殊,它每次都假定前一個interval的值是0,再計算平均值。

???D)GAUGE?:GAGUE?和上面三種不同,它沒有“平均”的概念,RRDtool?收到值之后字節存入?RRA?中

???E)COMPUTE?:COMPUTE?比較特殊,它并不接受輸入,它的定義是一個表達式,能夠引用其他DS并自動計算出某個值。例如?
???
??????? DS:eth0_bytes:COUNTER:600:0:U?DS:eth0_bits:COMPUTE:bytes,8,*?

???????則?eth0_bytes?每得到一個值,eth0_bits?會自動計算出它的值:將?eth0_bytes?的值乘以?8?。不過?COMPUTE?型的?DS?有個限制,只能應用
???????
???????它所在的?RRD?的?DS?,不能引用其他?RRD?的?DS。?COMPUTE?型?DS?是新版本的?RRDtool?才有的,你也可以用?CDEF?來實現該功能。?
????????
?????????
????F)AVERAGE?類型適合于看“平均”情況,例如一天的平均流量,。所以?AVERAGE?適用于需要知道?‘xxx/秒’?這樣的需求。但采用?AVERAGE?型時,你并不知道

????????在每個?CDP?中(假設30分鐘平均,6個PDP組成)之中,流量具體是如何變化的,什么時候高,什么時候低。這于需要用到別的統計類型了

????G)MAXIMUM?、MINIMUM不適用想知道“xxx/秒”這樣的需求,而是適用于想知道某個對象在各個不同時刻的表現的需求,也就是著重點在于各個時間點。

?????????也就是所謂的“趨勢”了,還是上面的例子,如果采用?MAXIMUM?或者?MINIMUM?的?CF?,可以看出接口在每個?CDP?的周期內最高是達到多少,最低又是多

?????????少,如果是?AVERAGE?的話,有可能前5個?PDP?都很均勻,但最后一個?PDP?的值發生很大的突變。這時候如果用?AVERAGE?可能是看不出來的,因為突變的部

?????????分被平均分配到整個時間段內了,所以看不出突變這一現象;但如果用?MAXIMUM?就可以清楚的知道在該?CDP?的周期內,曾經有達到某個值的時候。所以用?

????????MAXIMUM?或者?MINIMUM?就可以知道某個對象在某個時間段內最大達到多少,最低低到什么程度。

????????例如要看某個接口在一天內有沒有超過50Mb?流量的時候就要用?MAXIMUM

???????例如要看磁盤空間的空閑率在一天內有沒有低于?20%?的時候就要用?MINIMUM

?????H)LAST?類型適用于?“累計”的概念,例如從xxx時候到目前共累計xxxx?這樣的需求。例如郵件數量,可以用?LAST?來表示?30?分鐘內總共收到多少個郵件,同

?????????樣?LAST?也沒有平均的概念,也就是說不適用于?‘xxx/秒’?這樣的需求,例如你不能說平均每秒鐘多少封郵件這樣的說法;同樣也不適用于看每個周期內的變化,

?????????例如30分鐘內共收到100封郵件,分別是?:第一個5分鐘20封,第二個5分鐘30封,第三個5分鐘沒有,第4個5分鐘10封,第5個5分鐘也沒有,第6個5分鐘
?????????
?????????40封。如果用?MAXIMUM?或者?MINIMUM?就不知道在30分鐘內共收到100封郵件,而是得出30和0。所以?LAST?適用于每隔一段時間被觀察?對象就會復位的
?????????
?????????情況。例如每30分鐘就收一次郵件,郵件數量就是?LAST?值,同時現有的新郵件數量就被清零;到下一個30分鐘再收一次郵件,又得到一個?30??分鐘的?LAST?值。
?????????
?????????這樣就可以得得出“距離上一次操作后到目前為止共xxx”的需求。(例如距離上一次收取郵件后又共收到100封新郵件)

[size=4]?四)DST?實例說明[/size]

這樣說可能還是比較模糊,可以看下面的例子,體會一下什么是?DST?和?PDP??:

引用:

Values?=?300,?600,?900,?1200????????#?假設?RRDtool?收到4個值,分別是300,600,900,1200

Step?=?300?seconds????????????????????#?step?為?300

COUNTER?=?1,1,?1,1????????????? ????#?(300-0)/300,(600-300)/300,(900-600)/300,(1200-900)/300?,所以結果為?1,1,1,1

DERIVE?=?1,1,1,1?????????????????????????#?同上

ABSOLUTE?=?1,2,3,4???????????????????#?(300-0)/300,(600-0)/300?,?(900-0)/300,?(1200-0)/300,所以結果為?1,2,3,4

GAUGE?=?300,600,900,1200??????????#?300?,?600?,900?,1200?不做運算,直接存入數據庫





所以第一行的?values?并不是?PDP?,后面4行才是?PDP?

?
[size=4]?五)開始建庫[/size]


[root@dns1?root]#?rrdtool?create?eth0.rrd?\
>?--start?$(date?–d?‘1?days?ago’?+%s)?\
>?--step?300?\
>?DS:eth0_in:COUNTER:600:0:12500000?\ #??600?是?heartbeat;0?是最小值;12500000?表示最大值;?
>?DS:eth0_out:COUNER:600:0:12500000?\ #?如果沒有最小值/最大值,可以用?U?代替,例如?U:U
>?RRA:AVERAGE:0.5:1:600?\ #?1?表示對1個?PDP?取平均。實際上就等于?PDP?的值
>?RRA:AVERAGE:0.5:4:600?\ #?4?表示每4個?PDP?合成為一個?CDP,也就是20分鐘。方法是對4個PDP取平均,?
>?RRA:AVERAGE:0.5:24:600?\??#?同上,但改為24個,也就是24*5=120分鐘=2小時。
>?RRA:AVERAGE:0.5:288:730 #?同上,但改為288個,也就是?288*5=1440分鐘=1天
[root@dns1?root]#??

?
?檢查一下結果


root@dns1?bob]#?ll?-h?eth0.rrd
-rw-r--r--????1?root?????root??????????41K?11月?19?23:16?eth0.rrd
[root@dns1?bob]#


有的人可能會問,上面有兩個?DS,那?RRA?中究竟存的是那個?DS?的數據呢?實際上,這些?RRA?是共用的,你只需建立一個?RRA,它就可以用于全部的?DS?。

所以在定義?RRA?時不需要指定是給那個?DS?用的。


[size=4]六)什么是?CF?[/size]

以第2個RRA?和?4,2,1,3?這4個?PDP?為例

AVERAGE?:則結果為?(4+2+1+3)/4=2.5

MAX?:結果為4個數中的最大值?4

MIN?:結果為4個數中的最小值1

LAST?:結果為4個數中的最后一個?3

同理,第三個RRA和第4個RRA則是每24個?PDP、每288個?PDP?合成為1個?CDP

[size=4]?七)解釋度(Resolution)[/size]

這里要提到一個?Resolution?的概念,在官方文檔中多處提到?resolution?一詞。Resolution?究竟是什么?Resolutino?有什么用?

舉個例子,如果我們要繪制1小時的數據,也就是60分鐘,那么我們可以從第一個RRA?中取出12個?CDP?來繪圖;也可以從第2個?RRA

中取出2個?CDP?來繪圖。到底?RRDtool?會使用那個呢?

讓我們看一下?RRA?的定義?:RRA:AVERAGE:0.5:4:600?。

Resolution?就等于?4?*?step?=?4?*?300?=?1200?,也就是說?,resolution?是每個CDP?所代表的時間范圍,或者說?RRA?中每個?CDP(記錄)

之間的時間間隔。所以第一個?RRA?的?resolution?是?1*?step=300,第2是?1200,第三個是?24*300=7200,第4個?RRA?是?86400?。

默認情況下,RRDtool?會自動挑選合適的?resolution?的那個?RRA?的數據來繪圖。我們大可不必關心它。但如果自己想取特定?RRA?的數據,就需要用到它了。

關于?Resolution?我們還會在?fetch?和?graph?操作中提到它。


[size=4]八)xff?字段[/size]

細心的朋友可能會發現,在?RRA?的定義中有一個數值,固定是?0.5?,這個到底是什么東東呢?

這個稱為?xff?字段,是?xfile?factor??的縮寫。讓我們來看它的定義?:

引用:
The?xfiles?factor?defines?what?part?of?a?consolidation?interval?may?be?made?up?from?*UNKNOWN*?data?while

?the?consolidated?value?is?still?regarded?as?known.?It?is?given?as?the?ratio?of?allowed?*UNKNOWN*?PDPs?to?
?
?the?number?of?PDPs?in?the?interval.?Thus,?it?ranges?from?0?to?1?(exclusive)
?



這個看起來有點頭暈,我們舉個簡單的例子?:例如
RRA:AVERAGE:0.5:24:600?

這個?RRA?中,每24個?PDP?(共兩小時)就合成為一個?CDP,如果這?24?個?PDP?中有部分值是?UNKNOWN?(原因可以很多),例如1個,那么這個?CDP?

合成的結果如何呢?是否就為?UNKNOWN?呢?

不是的,這要看?xff?字段而定。Xff?字段實際就是一個比例值。0.5?表示一個?CDP?中的所有?PDP?如果超過一半的值為?UNKNOWN?,則該?CDP?的值就被標為

UNKNOWN。也就是說,如果24個?PDP中有12個或者超過12個?PDP?的值是?UNKNOWN?,則該?CPD?就無法合成,或者合成的結果為?UNKNOWN;

如果是11個?PDP?的值為?UNKNOWN?,則該?CDP?的值等于剩下?13??個?PDP?的平均值。

如果一個?CDP?是有2個?PDP?組成,xff?為?0.5?,那么只要有一個?PDP?為?UNKNOWN?,則該?PDP?所對應的?CDP?的值就是?UNKNOWN?了


?ailms 回復于:2006-12-04 09:23:47

RRDtool簡體中文教程_5:如何獲取RRD文件的信息
獲取?RRD?文件的信息
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內容?:
A)官方文檔?:http://oss.oetiker.ch/rrdtool/doc/index.en.html
B)abel?兄的大作?:http://bbs.chinaunix.net/viewthread.php?tid=552224&highlight=rrdtool
http://bbs.chinaunix.net/viewthread.php?tid=552220&highlight=rrdtool
作者?:ailms?<ailms{@}263{dot}net>
版本?:v1
最后修改?:2006/11/17?17:35
**********************************************************************************************************************
[/color]

[size=4]?一)前言[/size]

???可能你已經頗不亟待的想知道如何往?RRD?文件插入數據、如何繪圖了吧?hoho,先別急,在你做這些事情之前,最好先思考以下幾個問題?:

???A)如果給你一個?RRD?文件,你能知道它的第一次/最后一次?update?的時間是在什么時候嗎?

???B)如果你很久之前建立了一個?RRD?文件,現在因為工作原因需要對該?RRD?文件進行一些修改。不過遺憾的是,
???
???????你已經不記得得當初設置的具體選項和參數了,??這時候該怎么辦呢?
???????
???這兩個問題就對應今天要講的兩個操作?:first/last?、info?。
???
???first?就是用于查看該?RRD?文件中某個?RRA?的第一個數據是在什么時候插入的(或者說第一次更新);
???
???last?就是查看該?RRD?文件的最近一次更新;
???
???info就是查看?rrd?文件的結構信息。
???
???下面就以實際例子來看一下該怎么用這三個命令?:
???
???
[size=4]二)如何查詢一個?RRD?文件的結構信息[/size]
???
????

[root@dns1?bob]#?rrdtool?info?eth0.rrd (由于輸出信息較多,截取了一部分)
filename?=?"eth0.rrd"
rrd_version?=?"0003"
step?=?300 #?RRDtool?希望每5分鐘收到一個數據
last_update?=?1163862985 #?這是最近一次更新的?timestamp?。可以用?date?轉換為具體的時間
ds[eth0_in].type?=?"COUNTER" #?有一個名為?eth0_in?的?DS,DST是?COUNTER
ds[eth0_in].minimal_heartbeat?=?600 #?hearbeat?時間是600?秒
ds[eth0_in].min?=?0.0000000000e+00 #?eth0_in?的最小值是?0?(bytes)
ds[eth0_in].max?=?1.2500000000e+07 #?eth0_in?的最大值是?1250000000?(bytes)
ds[eth0_in].last_ds?=?"UNKN"
ds[eth0_in].value?=?0.0000000000e+00
ds[eth0_in].unknown_sec?=?85
ds[eth0_out].type?=?"COUNTER"
ds[eth0_out].minimal_heartbeat?=?600
ds[eth0_out].min?=?0.0000000000e+00
ds[eth0_out].max?=?1.2500000000e+07
ds[eth0_out].last_ds?=?"UNKN"
ds[eth0_out].value?=?0.0000000000e+00
ds[eth0_out].unknown_sec?=?85
rra[0].cf?=?"AVERAGE" #?第一個?RRA?的編號是0,不是1。
rra[0].rows?=?600 #?共保存?600?個記錄
rra[0].pdp_per_row?=?1 #?每個?CDP?由一個?PDP?統計得出
rra[0].xff?=?5.0000000000e-01 #?只要當前interval?的?PDP?為?unknown?,則該?CDP?的值也是unknown
rra[0].cdp_prep[0].value?=?NaN
rra[0].cdp_prep[0].unknown_datapoints?=?0
rra[0].cdp_prep[1].value?=?NaN
rra[0].cdp_prep[1].unknown_datapoints?=?0
rra[1].cf?=?"AVERAGE" #?第二個?RRA?的編號是?1。同樣也是?AVERAGE?型。
rra[1].rows?=?600 #?也是保存?600?個記錄
rra[1].pdp_per_row?=?4 #?每個?CDP?由4個?PDP?的求平均值得出
rra[1].xff?=?5.0000000000e-01 #?每個?CDP?最多允許2個?PDP?為?unknown?,超過則該?CDP?為unknown
rra[1].cdp_prep[0].value?=?NaN
rra[1].cdp_prep[0].unknown_datapoints?=?3
rra[1].cdp_prep[1].value?=?NaN
rra[1].cdp_prep[1].unknown_datapoints?=?3
[root@dns1?bob]#



[color=red]由于信息太長,這里截取了后面2個?RRA?的信息。[/color]


[size=4]三)第一次更新/最近一次更新[/size]

如果想知道最近一次更新發生在什么時候,除了可以用上面的?info?操作,還可以用?last?操作


[root@dns1?bob]#?rrdtool?last?eth0.rrd
1163862985
[root@dns1?bob]#


如果轉換成具體的時間就是?:


[root@dns1?bob]#?rrdtool?last?eth0.rrd?|xargs?-i?date?-d?'1970-01-01?{}?sec?utc'
六?11月?18?23:16:25?CST?2006
[root@dns1?bob]#



[root@dns1?bob]#?rrdtool?first?eth0.rrd
1163683200
[root@dns1?bob]#


如果換成具體的時間就是?:


[root@dns1?bob]#?[root@dns1?bob]#?rrdtool?first?eth0.rrd?|xargs?-i?date?-d?'1970-01-01?{}?sec?utc'?
四?11月?16?21:20:00?CST?2006
[root@dns1?bob]#


這三個命令的語法都非常簡單,但并不可以因此小看它們的功能,尤其是?info?操作。日后如果需要對?RRD?文件進行調整,是經常需要用到的。


?ailms 回復于:2006-12-04 09:24:20

更新?RRD?文件
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內容?:
A)官方文檔?:http://oss.oetiker.ch/rrdtool/doc/index.en.html
B)abel?兄的大作?:http://bbs.chinaunix.net/viewthread.php?tid=552224&highlight=rrdtool
http://bbs.chinaunix.net/viewthread.php?tid=552220&highlight=rrdtool
作者?:ailms?<ailms{@}263{dot}net>
版本?:v1
最后修改?:2006/11/17?17:35
**********************************************************************************************************************
[/color]

[size=4]一)前言[/size]

寫了N多東東,總算到了?update?部分了。這里有必要比較一下?RRDtool?和?MRTG?在?update?方面的差別。

?A)MRTG?可以通過?SNMP?協議直接訪問?SNMP?對象,你只需要在?cfg?文件中的?Target?指定?OID?,MRTG?就可以自動替你取回數據。
???
???????例如Target[as1_eth0]:?2:n7css@172.17.64.11:::::1?,表示使用?SNMP?v1?協議訪問?172.17.64.11?主機上?index?為?2?的那個接口,
???
???????默認是取?ifInOctets?和?ifOutOctets?這兩個對象的值。RRDtool?則沒有這個功能,只能你自己寫腳本取數據。
???????
B)MRTG?只支持?COUNTER?和?GAUGE?類型的?Target?;RRDtool?則還可以使用?DERIVE、ABSOLUTE、COMPUTE
??
C)由于上面的原因,MRTG?無法識別小數,負數。例如你給?MRTG?一個?-1?的值,它會解釋為?1?;這點可以通過?LOG?看出來。
??
???????小數也不行。例如?.72?(bc?的輸出)會被識別為?72?,而不是?0.72。
???????
D)MRTG?每次?update?每次運行只更新一次,或者說只插入一行記錄。但?RRDtool?可以在一個?updat操作中插入多個記錄。

E)MRTG?一次要求2個值,RRDtool?則沒有該方面的限制。

F)最大的一個區別是,?MRTG?在收到一個值后會自動得出?timestamp?,并記錄在?log?的第一個字段;而?RRDtool?是需要你給出一個?timestamp?,
??
???????表示該數據是什么時間采集的。
???
[size=4]二)update?操作的語法格式[/size]



rrdtool?{update?|?updatev}?filename?
[--template|-t?ds-name[:ds-name]...]
N|timestamp:value[:value...]?
at-timestamp@value[:value...]
[timestamp:value[:value...]?...]



N?表示?now?的意思,會被?RRDtool?替換為當前的?timestamp?,也就是?date?+%s?的結果。Timestamp?部分比較靈活,可以是數字形式,也可以是

AT-風格的時間(參考?at?命令的?manual),有點類似于自然語言的風格。


[size=4]三)手工方式?update?數據庫[/size]

我們先學習一下如何手工?update?數據庫。Update?命令分成兩部分?:

A)時間戳?(timestamp):表示該數據是在那個時間點采集的。Timestamp?的格式可以非常靈活?:

數字形式?:例如1164419418?,表示?“六?11月?25?09:50:18?CST?2006”。通常用于手工插入的方式。

快捷方式?:N?。字母N?表示當前時間(Now)。如果是通過?crontab?的方式來運行?update?操作,這是最實用的方式。

AT-風格?:所謂的?AT?風格的時間,可以參考?at?命令的?manual。例如?now、yesterday、now-1hour、now+5min?都是?AT風格的時間。
?
??? ????????????????????要注意的是,如果使用?AT風格的時間,則時間和第一個value之間使用?@?分隔,而不是?“:”

B)數值部分?:一個?RRD?文件可以有多個?DS?,所以一次?update?可以給出多個?value?。多個?value?之間用?“:”?分隔。不過是不是所有的?DS?都必須

?????給出值呢?不一定。有時候你只想給出一部分?DS?的值,甚至有時候某些類型的?DS?是不允許賦值的,例如?COMPUTE?型的?DS?就是這樣一個例子。
?????

[size=4]四)實際操作[/size]

實例一?:一個錯誤的例子

[root@dns1?bob]#?rrdtool?update?eth0.rrd?1163862980:1:2
ERROR:?illegal?attempt?to?update?using?time?0?when?last?update?time?is?1163862985?(minimum?one?second?step)
[root@dns1?bob]#


咦?為什么出錯了呢?是語法錯誤嗎?不是的,RRDtool?提示最近一次更新是在1163862985?這個時候。也就是說,update?給出的時間戳必須大于該值。

不能等于或者小于該時刻。因為數據一旦插入到?RRA?中,就不允許再次修改。所以?update?會檢查給出的時間戳是否大于最后一次更新的時間戳,如果不是

則報錯,不予執行。那如何才能知道最近一次更新的時間戳呢?還記得前一篇“如何獲取RRD文件的信息”中介紹的?last?和?info?命令嗎?對了!就是它們。

執行一下看看是什么結果??


[root@dns1?bob]#?rrdtool?last?eth0.rrd
1163862985
[root@dns1?bob]#


last?操作顯示的時間戳和上面的報錯信息給出的值一樣。這個時間是


[root@dns1?bob]#?date?-d?'1970-01-01?1163862985?sec?utc'
六?11月?18?23:16:25?CST?2006
[root@dns1?bob]#


總之如果要?update?數據庫,則?update?操作給出的時間戳必須晚于最后一次?update?的時間。


實例二?:還是一個錯誤的例子

我們挑?23:16的下一個5分鐘23:20作為時間戳吧。


[root@dns1?bob]#?date?-d?'2006-11-18?23:20'?+%s
1163863200
[root@dns1?bob]#


所以?update?命令為?:


[root@dns1?bob]#?rrdtool?update?eth0.rrd?1163863200:1
ERROR:?expected?2?data?source?readings?(got?1)?from?1163863200:1:...
[root@dns1?bob]#


還是不行?!!

仔細看錯誤信息,原來是我們給少了一個值。還記得?info?命令嗎?這會兒它派上用場了。


[root@dns1?bob]#?rrdtool?info?eth0.rrd
filename?=?"eth0.rrd"
…..(省略)
last_update?=?1163862985
ds[eth0_in].type?=?"COUNTER"
ds[eth0_out].type?=?"COUNTER"


原來是2個?DS?,怪不得?RRDtool?會報錯了

實例三?:這次應該成功了吧?


[root@dns1?bob]#?rrdtool?update?eth0.rrd?1163863200:1:2
[root@dns1?bob]#


這會倒是沒有錯誤信息,那究竟數據是否別插入到?RRA?中了呢?

對于該問題,有兩個方法,一個是通過?fetch?操作,從?RRA?中提取數據;但這個我們下一篇再講。

還有一種方法就是用?updatev?操作來代替?update?。updatev?的?v?表示?verbose?的意思,現在就來看?updatev?的作用?:
?

實例四?:updatev?的好處?

我們執行多個?update?操作


[root@dns1?bob]#?rrdtool?last?eth0.rrd
1163864400
[root@dns1?bob]#
[root@dns1?bob]#?rrdtool?update?eth0.rrd?1163864700:3000:4000
[root@dns1?bob]#?rrdtool?updatev?eth0.rrd?1163865000:3300:4600
return_value?=?0
[1163865000]RRA[AVERAGE][1]DS[eth0_in]?=?1.0000000000e+00
[1163865000]RRA[AVERAGE][1]DS[eth0_out]?=?2.0000000000e+00


可以看到?return?value?是?0,這個?return?value?你可以理解為?shell?編程中的?exit?status?。updatev用?0?表示成功,-1?表示失敗。

不過我們插入的值明明是?3300?和?4600?,為什么出來的結果是?1和2?呢?

這是因為?eth0_in?和?eth0_out?都是?COUNTER?型的?DS,所以?RRDtool?在收到?3300?和?4600?后,會作一個運算,就是

(3300-3000)/?step?(300)=?1,(4600-4000)/step(300)=2?,這就是?1和?2?這兩個值的來源了。還記得前面提到的?PDP?嗎?

這兩個值?(1?和2)就是?PDP?了,而不是?3300?和?4600??。這點要搞清楚。


實例五?:另外一個?updatev?的例子

[root@dns1?bob]#
[root@dns1?bob]#?rrdtool?updatev?eth0.rrd?1163865300:3300:4600
return_value?=?0
[1163865300]RRA[AVERAGE][1]DS[eth0_in]?=?0.0000000000e+00
[1163865300]RRA[AVERAGE][1]DS[eth0_out]?=?0.0000000000e+00
[root@dns1?bob]#


在1163865300?這個時刻我們給出的值和上次一樣,所以?eth0_in?和?eth0_out?的?PDP?都為?0

搞清楚了?PDP?的概念,現在我們來看什么是?CDP?,以及?CDP?是如何計算的


實例六?:通過?updatev?掌握?CF?的概念


[root@dns1?bob]#?rrdtool?updatev?eth0.rrd?1163865600:4000:5000
return_value?=?0
[1163865600]RRA[AVERAGE][1]DS[eth0_in]?=?2.3333333333e+00
[1163865600]RRA[AVERAGE][1]DS[eth0_out]?=?1.3333333333e+00
[1163865600]RRA[AVERAGE][4]DS[eth0_in]?=?1.6666666667e+00
[1163865600]RRA[AVERAGE][4]DS[eth0_out]?=?1.6666666667e+00
[1163865600]RRA[AVERAGE][24]DS[eth0_in]?=?NaN
[1163865600]RRA[AVERAGE][24]DS[eth0_out]?=?NaN
[root@dns1?bob]#


這次的輸出和上次又不一樣了。這次?update?操作影響到幾個?RRA?,看到?[]?中的?1,4,24?了嗎?它們就是代表不同的?RRA?中每個?CDP?所包含的?PDP?數量。

1?就是?1個?CDP?包含1?個?PDP,4?就是?一個?CDP?包含4個?PDP(20分鐘)、24?就是?一個?CDP?包含24個?PDP(2小時)。

不過為什么沒有?288?呢?eth0.rrd?的第4個?RRA?不是規定每288個?PDP?合并為一個?CDP?嗎?

因為這個時候還輪不到它出場。1163865600?/?7200?=?161648?,?也就是說剛好1163865600?是在?7200?的某個周期上(161648)。

但1163865600?/?86400?≈?13470.66?,說明1163865600?還不到?86400?的周期。

必須等到13471*?86400=1163894400?才會出現?[288]?的?CDP,那這個時間戳代表的時間是什么時候呢?看下面的?date?命令就知道了?:


[root@dns1?bob]#?date?-d?'1970-01-01?1163894400?sec?utc'
日?11月?19?08:00:00?CST?2006
[root@dns1?bob]#
[root@dns1?root]#?date?-d?'1970-01-01?1163865600?sec?utc'?
日?11月?19?00:00:00?CST?2006
[root@dns1?root]#


這樣不就是剛好相差1天的時間了嗎?你可能會覺得很奇怪,為什么不是00:00?而是?08:00呢?

還記得create?操作的語法嗎?其中有一個?–-start?參數嗎?不記得了?沒關系,那就得用?first?操作來重新找出來,


[root@dns1?bob]#?rrdtool?first?eth0.rrd?--rraindex?3
1100822400
[root@dns1?bob]#
[root@dns1?bob]#?date?-d?'1970-01-01?1100822400?sec?utc'
五?11月?19?08:00:00?CST?2004
[root@dns1?bob]#

?
看到了嗎?是?2004?年的?11?月19日早上8點正,距離?2006-11-19?剛好是2年,也就是?730?天,因為?eth0.rrd?的第4個RRA?

只保存730個記錄。每個記錄時間上相差1天。也就是第一個記錄是?2004/11/19?8:00?,第二個記錄是?2004/11/20?8:00?,

第三個記錄代表?2004/11/21?8:00?,依次類推。所以離1163865600?最近的下一個記錄是發生在?2006/11/19?8:00?。

所以嚴格意義上來說,RRDtool?中的一天并不一定是從?0:00?開始的,但可以保證的就是兩個記錄之間肯定相差86400秒(1天)。


[size=4]四)自動更新數據庫[/size]

其實這些都只不過是手工?update?時需要注意的一些地方,如果是自動更新數據庫,時間戳方面就交給?RRDtool?去處理吧,我們不用操心了。

前面我們已經寫好了一個腳本,現在就用它來更新


[root@dns1?bob]#?cat?get_eth0_traffic.sh?
#!/bin/bash

#?首先取得?eth0?接口的?ifIndex?

index=$(snmpwalk?-IR?localhost?RFC1213-MIB::ifDescr?|grep?eth0|cut?-d?'='?-f?1|cut?-d?'.'?-f?2)

#?再通過?snmp?協議取得?ififInOctets?和?ifOutOctets?的值

#?由于在?/etc/snmp.conf?中配置了?defVersion?和?defCommunity?,所以?snmpget?命令不用指定這兩個參數

eth0_in=$(snmpget?-IR?-Os?localhost?ifInOctets.${index}|cut?-d?':'?-f?2|tr?-d?'[:blank:]')

eth0_out=$(snmpget?-IR?-Os?localhost?ifOutOctets.${index}|cut?-d?':'?-f?2?|tr?-d?'[:blank:]')

echo?${eth0_in}

echo?${eth0_out}

#?需要我要用這些數據來更新?eth0.rrd?,注意?update?時的?timestamp?我們用的是?N?

/usr/local/rrdtool-1.2.14/bin/rrdtool?updatev?/home/bob/eth0.rrd?N:${eth0_in}:${eth0_out}

[root@dns1?bob]#


[size=4]五)接下來是什么呢?[/size]

有了數據,下面該學什么了呢?是繪圖嗎?

不是!^_^!!?(估計有人快瘋了吧)

在繪圖之前,你有沒有想過?RRDtool?在繪圖時如何取數據的呢?

例如我想畫2小時內的數據,那么我們有4個?RRA?,其?resolution?分別是?300,1200,7200,86400?

(還記得什么是?resolution?嗎?就是每個?RRA?中兩個?CDP?相隔的時間)。是從第一個?RRA?取出?7200/300=24?個記錄,

還是從第二個?RRA?取出?7200/1200=6?個記錄呢?或者是從第三個?RRA?中取出1個記錄就可以呢?

這些問題我們就留待下一篇再學習吧。這里給大家留幾個問題?:

[color=red]

引用:

A) 如果?eth0.rrd?在5分鐘內收到不止1個更新,結果會怎樣?提示:用?updatev?就可以看出來了

B) 如果過了?eth0.rrd?在5分鐘內沒有收到腳本返回的值,是否立即就用?UNKNOWN?作為?PDP?的值?

C) 參考上面的例子,搞清楚?heartbeat?的含義

D) 在搞清楚?heartbeat?后,再想一下?heartbeat?和?step?之間的關系。
?????



[/color]


?ailms 回復于:2006-12-04 09:25:08

從?RRD?文件中提取數據
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內容?:
A)官方文檔?:http://oss.oetiker.ch/rrdtool/doc/index.en.html
B)abel?兄的大作?:http://bbs.chinaunix.net/viewthread.php?tid=552224&highlight=rrdtool
http://bbs.chinaunix.net/viewthread.php?tid=552220&highlight=rrdtool
作者?:ailms?<ailms{@}263{dot}net>
版本?:v1
最后修改?:2006/11/17?17:35
**********************************************************************************************************************
[/color]

[size=4]一)前言[/size]
RRD?是?Round?Robin?Database?的意思,那么是否可以象普通的數據庫進行查詢操作呢?

答案是可以的。fetch?就是用來做這種事情的工具。當然?fetch?不能和?select?語句相比,它只是根據用戶指定的時間,

從合適的?RRA?中取出數據,并加以格式化。不過和?MRTG?相比,已經好很多了,至少你不用取看該死的?log?文件。

實際上,fetch?操作其實可以不學,因為?RRDtool?會自動幫你選好數據。但你如何確定?RRDtool?取的數據就是你想要的呢?

或者說你如何證明?RRDtool?繪制出來的圖是正確的呢?

廢話少說,下面開始正文

[size=4]二)fetch?操作的語法[/size]


rrdtool?fetch?filename?CF?[--resolution|-r?resolution]?[--start|-s?start]?[--end|-e?end]


其中?--start、--end、-r?都是可選的?。RRDtool?默認的?--end?是?now?,--start?是?end-1day?,也就是1天前。

CF?可以是?AVERAGE、MAX、MIN、LAST?,當然必須建庫時有該?CF?類型的?RRA?才可以查,否則會報錯。


[size=4]三)fetch?如何取數據[/size]

在確定了時間范圍后,RRDtool?會從多個?RRA?中挑選最佳的那個?RRA?的數據。至于什么是“最佳”,則從兩個方面考慮?:

A)[color=blue]第一是該?RRA?的數據要盡可能的覆蓋所請求的時間范圍。[/color]如何計算一個?RRA?的覆蓋時間呢?以?eth0.rrd?的第一個RRA?為例,

?????有?600?個記錄,每個記錄相隔300秒,則總的時間覆蓋范圍是180000?秒≈2天,所以如果?–-start?和?-–end?規定的時間范圍
?????
?????大于2天,則?RRDtool?不會從該?RRA?中取數據。

B)[color=blue]第二是?resolution?的要求。[/color]還是上面的例子,如果是要畫3天的數據,從時間覆蓋范圍上來講,第2、3、4?個?RRA?都符合要求。

?????那究竟挑選那個?RRA?的數據呢?如果?fetch?中有指定?–r?選項,則挑選?resolution?等于?–r?指定的值那個?RRA?的數據。如果沒有?
?????
?????–r?選項,則從第一個合適的?RRA?中取數據。

C)fetch?如果不加?–-start、--end、-r?,則默認輸出?resolution?最小的那個?RRA?的數據。就像下面的例子1一樣。

?[size=4]四)實際例子[/size]

實例一?:默認情況


[root@dns1?bob]#?rrdtool?fetch?eth0.rrd?AVERAGE?|more
eth0_in????????????eth0_out

1164467700:?1.1337243905e+01?9.6323712631e-02
1164468000:?1.7896453039e+01?0.0000000000e+00
1164468300:?1.8469136234e+01?1.2215723119e+00
。。。。(中間省略)
1164553800:?6.9634610564e+01?4.9644415243e+01
1164554100:?nan?nan




[root@dns1?bob]#?date (當前時間)
日?11月?26?23:11:12?CST?2006

[root@dns1?bob]#?date?-d?'1970-1-1?1164554100?sec?utc' (最后一個記錄的時間)
日?11月?26?23:15:00?CST?2006
[root@dns1?bob]#

[root@dns1?bob]#?date?-d?'1970-1-1?1164467700?sec?utc' (第一個記錄的時間)
六?11月?25?23:15:00?CST?2006
[root@dns1?bob]#



fetch?輸出的第一列是?timestamp?,表示后面的數據是在什么時間收到的。”:”?后面就是DS的值。fetch?不能指定只取那個?DS?的數據,

只能一次性取出全部?DS?的值。可以看到,eth0.rrd?有兩個?DS?:eth0_in?和?eth0_out?,每個?DS?的值用?空格進行分隔,一律采用科學記數法的格式。

如果?fetch?不指定?–-start?和?-–end?,則默認取從當前時刻算起,往前1天的數據(289個記錄)。因為現在是?23:11?,還不到?23:15,所以最后一個記

錄的值是?NaN?(Not?a?Number),也就是?UNKNOWN?的意思。可以看到,兩個記錄之間的時間間隔是300。

?
?實例二:使用?--start?和?--end?指定時間范圍


[root@dns1?bob]#?rrdtool?fetch?eth0.rrd?AVERAGE?--start?1164467700?--end?1164553800?|more
eth0_in????????????eth0_out

1164468000:?1.7896453039e+01?0.0000000000e+00
1164468300:?1.8469136234e+01?1.2215723119e+00
1164468600:?1.5988336199e+01?1.4417769382e-01
。。。。。(中間省略很多)
1164553800:?6.9634610564e+01?4.9644415243e+01
1164554100:?1.7481962958e+02?2.3086574912e+02
[root@dns1?bob]#


可以看到第一個記錄和最后一個記錄都比?–-start??和?–-end?晚了300秒。


實例三?:使用?AT風格的時間
?

[root@dns1?bob]#?rrdtool?fetch?eth0.rrd?AVERAGE?--start?end-1day?--end?1164553800?|more
eth0_in????????????eth0_out

1164467700:?1.1337243905e+01?9.6323712631e-02
1164468000:?1.7896453039e+01?0.0000000000e+00
。。。。。。。(中間省略很多)
1164554100:?1.7481962958e+02?2.3086574912e+02
[root@dns1?bob]#


注意?--start?的值是?end-1day?,這就是?AT風格的時間。end?就是?--end?中給出的1164553800?。具體的時間范圍是表示起始時間從1164553800?往前1天?。

可以看到,現在第一個記錄和實例二相比,提前了300秒。和例2中的?–start?一致了。所以能夠用?AT風格的時間的時候還是用?AT?風格的時間比較方便。

可以省去計算的麻煩,別人也比較容易看。


實例四?:提取指定?resolution?的數據


[root@dns1?bob]#?rrdtool?fetch?eth0.rrd?AVERAGE?--start?1164467700?--end?start+1day?-r?1200?|more
eth0_in????????????eth0_out

1164468000:?1.7899370295e+01?3.8782610300e+00
1164469200:?2.0828335735e+01?3.4166666667e-01
1164470400:?1.4581351504e+01?3.5000000000e-02
。。。。。。(中間省略很多)
1164554400:?9.4367707174e+01?9.4866775629e+01
[root@dns1?bob]


可以看到,現在記錄兩兩之間的時間間隔變成了1200?了。輸出的行數為?(86400/1200)+1=73?(72+1)。


實例五:如果指定一個不存在的?resolution?呢?


[root@dns1?bob]#?rrdtool?fetch?eth0.rrd?AVERAGE?--start?1164467700?--end?start+1day?-r?1000?|more?
eth0_in????????????eth0_out

1164468000:?1.7899370295e+01?3.8782610300e+00
1164469200:?2.0828335735e+01?3.4166666667e-01
。。。。。。(中間省略很多)
1164554400:?9.4367707174e+01?9.4866775629e+01
[root@dns1?bob]#


我們指定的?resolution?是?1000?,但并沒有那個?RRA?的?resolution?為?1000,所以?RRDtool?挑選了第一個合適的?resolution?,

也就是?1200?的那個?RRA?的數據作為結果輸出。注意,RRDtool?只會挑選?resolution?比?–r?指定的值相等或者更高的?RRA?,不會挑

選比?–r?指定的值小的?RRA?。
例如在該例子中,RRDtool?就不會挑選?resolution=300?的第一個?RRA?。為什么呢?

各位可以自己根據第三部分“fetch?如何提取數據”的兩個準則考慮一下


實例六?:再來看一個?–r?的例子

如果我不想指定?–-start?或者?–end?,就想看?resolution?為?1200?呢?


[root@dns1?bob]#?rrdtool?fetch?eth0.rrd?AVERAGE?-r?1200
eth0_in????????????eth0_out

1164470400:?1.4581351504e+01?3.5000000000e-02
1164471600:?1.9312781373e+01?3.5000000000e-02
。。。。。(中間省略很多)
1164555600:?8.5249300043e+01?7.0171152327e+01
1164556800:?nan?nan
[root@dns1?bob]#


咦?為什么還是使用記錄的時間間隔還是?300?秒呢?我們不是指定了?–r?1200?嗎?

老實說,這種方法?90%?以上的機率是不會成功嗎?那應該怎么辦呢?

實例七?:正確使用?–r?的方式


[root@dns1?bob]#?rrdtool?fetch?eth0.rrd?AVERAGE?-r?1200?--end?$((($(date?+%s)/1200)*1200))?|more
eth0_in????????????eth0_out

1164470400:?1.4581351504e+01?3.5000000000e-02
1164471600:?1.9312781373e+01?3.5000000000e-02
1164472800:?1.7383358822e+01?3.5000000000e-02
1164474000:?1.4781054841e+01?3.3225406191e-01
。。。。。。(中間省略很多)
1164555600:?8.5249300043e+01?7.0171152327e+01
1164556800:?nan?nan
[root@dns1?bob]#


現在?resolution?已經變成?1200?的了。同理,如果想看?7200,86400?resolution的?RRA,只要把?end?部分的?(?)中的數字替換為相應的值就可以了。



[root@dns1?bob]#?rrdtool?fetch?eth0.rrd?AVERAGE?-r?7200?--end?$((($(date?+%s)/7200)*7200))???

[root@dns1?bob]#?rrdtool?fetch?eth0.rrd?AVERAGE?-r?86400?--end?$((($(date?+%s)/86400)*86400))


?
實例八?:關于?fetch?提取數據準則1的測試


[root@dns1?bob]#?rrdtool?fetch?eth0.rrd?--start?now-3day?AVERAGE?|more
eth0_in????????????eth0_out

1164298800:?nan?nan
1164300000:?nan?nan
。。。。。。(中間省略很多)
1164556800:?6.4118014239e+01?1.8871145267e+01
1164558000:?nan?nan
[root@dns1?bob]#


和第一個例子不同,這次的?resolution?是?1200?了?為什么呢?因為我們指定的時間范圍是3天,而第一個?RRA只保存2天的數據多一點,所以?RRDtool?不會從

該?RRA?取數據,那么會從那個?RRA?取數據呢?由于我們沒有指定?–r?選項,所以?RRDtool?選擇1200?的那個?RRA?

實例九?:關于?fetch?提取數據準則2的測試


[root@dns1?bob]#?rrdtool?fetch?eth0.rrd?--start?now-3day?AVERAGE?-r?7200?|more
eth0_in????????????eth0_out

1164304800:?nan?nan
1164312000:?nan?nan
1164319200:?nan?nan
。。。。。。(中間省略很多)
1164549600:?5.1899602485e+01?4.3073128067e-01
1164556800:?7.9766222122e+01?4.0644151093e+01
1164564000:?nan?nan
[root@dns1?bob]#



現在?resolution?不再是?1200?,而是指定的?7200?了。

因為雖然?resolution=1200?的?RRA?就可以滿足?--start?和?--end?的需求,

但因為?-r?指定?resolution=7200?,所以從第3個?RRA?中取數據

[size=4]五)總結[/size]

從上面我們可以看出,fetch?實際上是非常復雜的一個命令,如果想要輸出你所要的數據,就必須考慮好幾個因素?:

A)[color=blue]第一是具體想輸出的時間范圍?[/color]

B)[color=blue]第二是計算好?–-start?和?–end。建議至少給出一個,最好2個都給出[/color]

C)[color=blue]第三是如果有多個RRA符合條件,則使用?–r?指定具體的?resolution[/color]


?ailms 回復于:2006-12-04 09:25:49

使用RRDtool?進行繪圖(一)
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內容?:
A)官方文檔?:http://oss.oetiker.ch/rrdtool/doc/index.en.html
B)abel?兄的大作?:http://bbs.chinaunix.net/viewthread.php?tid=552224&highlight=rrdtool
http://bbs.chinaunix.net/viewthread.php?tid=552220&highlight=rrdtool
作者?:ailms?<ailms{@}263{dot}net>
版本?:v1
最后修改?:2006/11/17?17:35
**********************************************************************************************************************
[/color]

[size=4]一)前言[/size]

使用RRDtool?我們最關心什么?當然是如何把數據畫出來了。雖然前面談了很多,但這些都是基礎來的。掌握好了,可以讓你在繪圖時更加得心應手。

本來還有?RPN?(反向波蘭表達式)一節的,但考慮一下,覺得還是放到后面,先從基本的繪圖講起。

這一節的內容雖然很多,但基本都是實驗性的內容,只要多試幾次就可以了。

[size=4]二、graph?操作的語法[/size]


rrdtool?graph?filename?[option?...]?
[data?definition?...]
[data?calculation?...]
[variable?definition?...]
[graph?element?...]
[print?element?...]


其中的?data?definiton、variable?definition?、data?calculation、分別是下面的格式


DEF:<vname>=<rrdfile>:<ds-name>:<CF>[:step=<step>][:start=<time>][:end=<time>][:reduce=<CF>]
VDEF:vname=RPN?expression
CDEF:vname=RPN?expression


其中?filename?就是你想要生成的圖片文件的名稱,默認是?png?。你可以通過選項修改圖片的類型,可以有?PNG、SVG、EPS、PDF四種。

A)DEF?是?Definition?(定義)的意思。定義什么呢?你要繪圖,總要有數據源吧?DEF?就是告訴?RRDtool?從那個?RRD?中取出指定

????DS(eth0_in、eth0_out)的某個類型的統計值(還可以指定?resolution、start、end),并把這一切放入到一個變量?<vname>中?。
????
????你可能會感到奇怪,為什么還有一個?CF?字段?因為?RRA?有多種??CF?類型,有些?RRA?可能用來保存平均值、有些?RRA?可能用于統計最大值、
????
????最小值等等。所以你必須同時指定使用什么?CF?類型的?RRA的數據。至于?:start?和?:end?、:reduce?則用得比較少,最常用的就是?:step?了,
????
????它可以讓你控制?RRDtool?從那個?RRA?中取數據。

B)VDEF?是?Variable?Definition?(變量定義)的意思。定義什么呢?記得?MRTG?在圖表的下面有一個稱之為?Legend?的部分嗎?

????那里顯示了1個或者2個?DS?(MRTG?沒有?DS?一說,這里是借用?RRDtool?的)的?“最大值”、“平均值”、“當前值”。這些值是如何
????
????計算的呢?
????
????RRDtool?中用?VDEF?來定義。這個變量專門存放某個?DS?某種類型的值,例如?eth0_in?的最大值、eht0_out?的當前值等。當你需要象
????
?????MRTG??一樣輸出數字報表(Legend)?時,就可以在?GPRINT?子句(sub?clause)中調用它。
???
???同樣它也需要用一個變量來存放數值。要注意的是,舊版?的?RRDtool?中是用另外一種格式來達到相同的目的。新版的?RRDtool?則推薦使用
???
????VDEF???語句。但在使用過程中,卻發現?VDEF?的使用反而造成了困擾。?例如你有5個?DS?要畫,每個?DS?你都想輸出最大值、最小值、平均值
????
????、當前值。??如果使用?VDEF?,則需要?4?*?5?=?20?個?VDEF?語句,這會造成極大的困擾。具體例子可以看第十一節“數字報表”部分。
???
C)CDEF?是?Calculation?Define?的意思。使用過MRTG?的都會體會到一點,MRTG?的計算能力實在太差了。例如你有兩個?Target?,

??????一個是?eth0_in?,?一個是?eth0_out,如果要把它們相加起來,再除以8,得出?bytes?為單位的值,如何計算呢?或者說你只想看
??????
??????eth0_in?中超過?10Mb/s?的那部分,?其余的不關心,又如何實現呢?因為?MRTG?不能對它從?log?取出來的數據進行修改,只能原
??????
??????原本本的表現,所以很難滿足我們的要求。而使用?CDEF?,?這一切都可以很容易的實現。CDEF?支持很多數學運算,甚至還支持簡
??????
??????單的邏輯運算?if-then-else?,可以解決前面提到的第2個問題:如何只繪制你所關?心的數據。不過這一切都需要熟悉?RPN?的語法,
??????
??????所以我們放到下一節介紹,這一節就介紹如何把?RRDtool?中的數據以圖表的方式顯示出來。
??????
??????
[size=4]三)選項分類[/size]

本部分我們按照官方文檔的方式,把選項分成幾大類,分為??:

A)Time?range?:?用于控制圖表的X軸顯示的起始/結束時間,也包括從RRA中提取指定時間的數據。

B)Labels?:用于控制?X/Y?軸的說明文字。

C)Size?:用于控制圖片的大小。

D)Limits?:用于控制?Y?軸的上下限。

E)Grid?:用于控制?X/Y?軸的刻度如何顯示。

F)Miscellaneous?:其他選項。例如顯示中文、水印效果等等。

G)Report?:數字報表

需要說明的是,本篇當中并不是列出了所有選項的用法,只是列出較為常用的選項,如果想查看所有選項的的用法,可以到官方站點下載文檔,

這里就不一一列出了,望各位見諒。


[size=4]四)時間范圍控制(Time?Range)[/size]


[-s|--start?time]?[-e|--end?time]?[-S|--step?seconds]


既然要繪圖,就應該有一個起始/結束的時間。Graph?操作中有?–s?,-e?選項。這兩個選項即可以用于控制圖表的?X?軸顯示的時間范圍,也可以用

于控制?RRDtool?從?RRA?中提取對應時間的數據。如果沒有指定?–-end?,默認為?now;如果沒有指定?–-start,則默認為1天前。如果兩者都沒有

指定,則圖表默認顯示從當前算起1天內的。數
回頭看一下?DEF?中,也有?:start?,:end?,?:step?,這些和?–-start、--end、--step?之間有什么關系呢?

讓我們先看?:step?和?–step之間的關系是如何的。

下面以?eth0.rrrd?為例,假設要繪制的時間范圍?range?等于?end?-start[

A)如果?0?<??ragne?<?180000?(第一個?RRA?的時間覆蓋范圍)?,則默認從第1個RRA中取數據?:

?????如果?DEF?中給出的?:step?>?300?,例如?1000?,則從?resolution=?1000?的或者第一個高于?1000?的RRA?中挑選數據,由于?eth0.rrd?中沒有
????
?????????????????????????????????????????????????????resolution?=?1000?的?RRA,則?RRDtool?會從?resolution?=?1200?的第2?RRA?中取數據。

?????如果?DEF?中給出的?:step?<=?300?,例如?200?,則?RRDtool?會忽略該設定,還是從第一個?RRA?中取數據。

B)如果?180000?<?range?<?720000??,由于第一個RRA只能保存2天的數據,所以默認從第2個RRA中取數據?:

?????如果?DEF?中給出的?:step?>?1200?,例如?1800,則?RRDtool?會從?resolution?=?7200?的第3?RRA?中取數據

?????如果?DEF?中給出?:step<=?1200,例如?300?,則?RRDtool?會忽略,還是從第2個?RRA?中取數據

C)如果?720000?<?range?<??4320000?,則默認從第三個?RRA?中取數據?:

?????如果?DEF?中給出的?:step?>?7200?,例如?10000?,則從第4個?RRA中取數據

?????如果?DEF?中給出的?:step?<=?7200?,?例如?1200?,則忽略該值,并還是從第3?個?RRA?中取數據

D)如果?4320000?<?range?<?63072000?,則默認從第4個?RRA?中取數據?:

?????如果?DEF?中給出的?:step?>?86400?,則行為未知

?????如果?DEF?中給出的?:step?<=86400?,則從第4個?RRA?中取數據

E)-S?選項可以直接控制?RRDtool?如何挑選?RRA?。

????例如?-S?1200?,即使DEF?中不加?:setp?,則?RRDtool?會從第2個?RRA?中取數據,即使?rang?<?180000?

????如果?-S?和?:step?同時出現,則?:step?優先。

F)DEF?中的?:start?和?:end?可以覆蓋?–-start?和?–-end?的值。

?????默認情況下,如果?DEF?中不加?:start?和?:end?,則等于?–-start?和?–end

????如果?DEF?中定義了?:start?和?:end?,則以?:start?和?:end?為準。

實例1?:使用?–-start?指定?X?軸的起始時間


[root@dns1?bob]#?rrdtool?graph?1.png?\
>?--start?now-120000?\ #?表示起始時間是當前時間往前?120000?秒,也就是?33?個小時左右
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE?\ ?#?從eth0.rrd?中取出?eth0_in?的數據,CF?類型為?AVERAGE
>?AREA:value1#ff0000 #?用“方塊”的形式來繪制?value1?,注意這里是用?value1?,不是用?eth0_in
481x154 #?如果?RRDtool?有繪圖方面的語句,則這里顯示圖片大小,否則為?0x0。
[root@dns1?bob]#




可以看到?X?軸的文字有些是亂碼,不過不要緊,你可以臨時已用?env?LANG=C?rrdtool?xxxx?來解決該問題,或者在后面用

?–n?來設定?RRDtool?使用中文字體,就不會出現這樣的情況了


實例2?:使用?:step?從第2個RRA中取數據



[root@dns1?bob]#?rrdtool?graph?2.png?\
>?--start?now-120000?\
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE:step=1000?\ #?:step?指定?resolution=1000?
>?AREA:value1#ff0000
481x154
[root@dns1?bob]#?


這里是?:step=1000,但?RRDtool?會取?:step=1200?的?第2個?RRA?的數據來繪圖,可以和上面的?1.png?比較,發現比較平滑。




實例3?:使用?–S?從第2個RRA中取數據


[root@dns1?bob]#?rrdtool?graph?4.png?
>?-S?1200?\ #?使用?–S?控制?RRDtool?從?resolution=1200?的?RRA?中取數據
>?--start?now-120000?\
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
>?AREA:value1#ff0000????????
481x154
[root@dns1?bob]#?

?
?

可以看到和上面的圖一樣,說明?RRDtool?的確按照?-S?的設置從第2個RRA?中取數據了

使用?–S?可以對?DEF?中所有的?DS?都使用相同的?resolution,等于在每個?DEF后都加上?:step=<value>?,value?是?–S?的值

實例4?:同時使用?–S?和?:step?


[root@dns1?bob]#?rrdtool?graph?5.png?
>?-S?1200?\ #?-S?指定?resolution=1200
>?--start?now-120000?\
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE:step=300?\ #?:step?指定?resolution=300
>?AREA:value1#ff0000?????
481x154
[root@dns1?bob]#





可以看到?5.png?和?1.png?是一樣的,也就是說?–S?1200?并沒有起作用,而是?:step=300?起作用了

實例5?:使用?:start?和?:end?只顯示指定時間內的數據


[root@dns1?bob]#?rrdtool?graph?1.png?\
>?--start?now-1h?\ #?X?軸顯示1個小時的長度
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE:start=now-600:end=now-300?\ #?但只取10分鐘前到5分鐘前的這部分
>?AREA:value1#00ff00:in??
475x168
[root@dns1?bob]#




?如果我們不加?:start?和?:end?,則效果如下?:
?
?

我們甚至可以讓兩個對象顯示不同的時間,例如?

實例6?:讓兩個對象顯示不同時間段的數據


[root@dns1?bob]#?rrdtool?graph?1.png?\
>?--start?now-2h?\ #?規定時間為2小時內
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE:end=now:start=end-1h?\ #?規定時間為1小時內
>?DEF:value2=eth0.rrd:eth0_out:AVERAGE?\ #?沒有指定?:start?和?:end,默認和?–-start?一樣也是2小時
>?AREA:value1#00ff00:in?\
>?LINE2:value2#ff0000:out:STACK?
475x168
[root@dns1?bob]#





實例7?:把一段時間分為幾段分別顯示?:


[root@dns1?bob]#?rrdtool?graph?1.png?\
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE:end=now:start=end-1h?\ #?當前1小時內
>?DEF:value2=eth0.rrd:eth0_in:AVERAGE:end=now-1h:start=now-2h?\ #?2小時前
>?DEF:value3=eth0.rrd:eth0_in:AVERAGE:end=now-2h:start=now-3h?\ #?3小時前
>?LINE1:value1#00ff00:"1?hours?ago"?\
>?LINE2:value2#ff0000:"2?hours?ago"?\
>?LINE3:value3#000000:"3?hours?ago"??
475x168
[root@dns1?bob]





我們把3個小時內的數據用三種不同粗細、不同顏色的曲線畫了出來。

看到了嗎,out部分(紅色)顯示了2個小時內的流量,而in部分(綠色)則只顯示了1個小時內的部分

在這里要提一點,雖然我們指定了?–-start?或者?–-end?,或者?:start?,?:end,但并不意味著曲線就一定會從指定的時間點開始和結束。

例如我們上面指定了?:start=now-600:end=now-300?,也就是只顯示5分鐘的數據。但圖表出來的效果卻是10(10:05-10:15)分鐘

的數據,這是因為我們挑選的時間當中“不慎”橫垮了兩個周期(10:05-10:10,10:10-10:15),所以?RRDtool?會把它們全部畫出來,而

不是只畫其中的5分鐘。

[?本帖最后由?ailms?于?2006-12-4?09:44?編輯?]


?ailms 回復于:2006-12-04 09:27:24

使用RRDtool?進行繪圖_(二)
?[color=blue]
**********************************************************************************************************************
?注?:該教程參考了如下內容?:
A)官方文檔?:http://oss.oetiker.ch/rrdtool/doc/index.en.html
B)abel?兄的大作?:http://bbs.chinaunix.net/viewthread.php?tid=552224&highlight=rrdtool
http://bbs.chinaunix.net/viewthread.php?tid=552220&highlight=rrdtool
作者?:ailms?<ailms{@}263{dot}net>
版本?:v1
最后修改?:2006/11/17?17:35
**********************************************************************************************************************
[/color]

[size=4]五)說明文字(Label)[/size]


[-t|--title?string]?[-v|--vertical-label?string]


-t?是用于圖表上方的標題,-v?是用于?Y?軸的說明文字

實例1?:給圖表增加標題


[root@dns1?bob]#?rrdtool?graph?1.png?\
>?--start?now-183600?\ #?從當前開始往前51個小時
>?-t?"51?hours?ago"?-v?"Traffic"?\ #?標題是?“51?hours?ago”,Y?軸的說明文字是?“Traffic”
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
>?DEF:value2=eth0.rrd:eth0_out:AVERAGE?\
>?LINE1:value1#0000ff:in?\ #?注釋?:以1個像素寬的曲線畫出?value1,顏色是藍色,圖例的說明文字是“in”
>?LINE2:value2#ff0000:out #?注釋?:以2個像素寬的曲線畫出?value2,顏色是紅色,圖例的說明文字是?“out”
497x179
[root@dns1?bob]#




現在我們用的是?LINE?的方式來繪圖。LINE?可以有3種,分別是?LINE1|2|3,也就是線條的粗細。還有一種是?STACK?方式下面再介紹。

可以看到流入的流量比流出的流量稍大,這樣看的話,out?流量比較難看,是否可以有別的方式呢?RRDtool?還提供了

另外一種格式,就是?STACK?。意思就是在前一個對象的基礎(把前一個對象的值當成?X?軸)上繪圖,而不是從?X?軸開始。

實例2?:使用?STACK?方式繪圖


[root@dns1?bob]#?rrdtool?graph?3.png?\
>?--start?now-120000?\
>?-t?"33?hours?ago"?\
>?-v?"Traffic"?\
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
>?DEF:value2=eth0.rrd:eth0_out:AVERAGE?\
>?AREA:value1#00ff00:in?\
>?LINE:value2#ff0000:out:STACK #?注意最后的?“STACK”?,表示在?value1?的基礎上繪圖
497x179
[root@dns1?bob]#





這是沒有采用?STACK?方式繪圖的效果?:



可以看得出上面采用?STACK?方式的比較清晰,但要注意,采用?STACK?方式后,在讀取?out?流量時,Y?軸的刻度不再是?out?的值,

應該用刻度值減去?in?的值,才是?out?真正的值。這點比較麻煩。需要配合?GPRINT?語句才能達到一定的效果。

[size=4]六)圖表大小(Size)[/size]


[-w|--width?pixels]?[-h|--height?pixels]


這里說圖表大小而不是圖片大小,是因為?–w?,-h?控制的是?X/Y?軸共同圍起來的那部分大小,而不是整個圖片的大小,這點在前面就可以看出了。

默認的圖表大小是?400?(長)x?100?(高),但一般會返回497x179?這樣的數字,這個才是圖片的大小。

RRDtool?比?MRTG?好的一個地方就是?MRTG?一放大圖片,就會變得模糊。RRDtool?則不會。

在官方文檔中,-w?似乎是一個比較敏感的參數,我們看下面的描述?:

引用:
First?it?makes?sure?that?the?RRA?covers?as?much?of?the?graphing?time?frame?as?possible.?Second?it?looks?at?the?resolution?of?the

?RRA?compared?to?the?resolution?of?the?graph.?It?tries?to?find?one?which?has?the?same?or?higher?better?resolution.?With?the?``-r''?
?
?option?you?can?force?RRDtool?to?assume?a?different?resolution?than?the?one?calculated?from?the?pixel?width?of?the?graph.



引用:
By?default,?rrdtool?graph?calculates?the?width?of?one?pixel?in?the?time?domain?and?tries?to?get?data?from?an?RRA?with?that?resolution.?

With?the?step?option?you?can?alter?this?behaviour.?If?you?want?rrdtool?graph?to?get?data?at?a?one-hour?resolution?from?the?RRD,?set?

step?to?3'600.?Note:?a?step?smaller?than?one?pixel?will?silently?be?ignored



這兩段話分別是從rrd-beginners??和?rrd_graph?文檔中摘出來的。似乎看起來?–w?會影響到圖表的?resolution?,進一步影響到?RRDtool?如何選擇?RRA?,

但經過實驗卻發現并非如此。

[color=red]我對這兩段話中的圖表的?resolution?一詞不知如何理解和計算,希望好心的朋友能夠指點一下?^_^?.[/color]


實例1?:使用?–w?設定圖表大小為?300?像素


[root@dns1?bob]#?rrdtool?graph?3.png?
>?-w?300?\ #?設定?size?為?300?pixel
>?--start?now-120000?\
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
>?AREA:value1#ff0000???????????
381x154
[root@dns1?bob]#




可以看到圖表是不是變小了呢?而且整個圖片的大小也變小了。

如果用前面的話來推理,由于?120000/300(-w的值)=?400?>?300?(step),由于沒有?resolution=400?的?RRA,

所以應該采用?resolution=7200?的第2個?RRA?的數據來繪圖,但實際上不是。



上面這個才是?300?pixel?寬,resolution=7200?的效果

所以我覺得?–w?和?–h?并不能影響?RRDtool?如何選擇?RRA?,只能起到縮小放大的作用。

BTW:當你繪制的時間范圍較大時,可以使用?–w?增大圖表大小,這樣看起來比較“舒服“




[size=4]七)?Y?軸上下限(Limits)[/size]

?
[-u|--upper-limit?value]?[-l|--lower-limit?value]?[-r|--rigid]

?
?默認情況下,RRDtool?會和?MRTG?一樣自動調整?Y?軸的數字,來配合當前的數值大小。如果想禁止該特性,可以通過?–upper-limit?和
?
-–lower-limit?來做限制,表示Y軸顯示的值從多少到多少。如果沒有指定?–rigid?,則在圖表的上下邊界處還是會有一些延伸,但如果指定了
??
-–rigid?,則嚴格按照?–-upper-limit?和?–-lower-limit?繪制。

在使用?–lower-limit?時要注意,如果數據中有負數,如果?-–lower-limit?為?0,則負數部分是顯示不出來的。

實例1?:使用?–-upper-limit?和?–-lower-limit?限制?Y?軸的上下限


[root@dns1?bob]#?rrdtool?graph?1.png?\
>?--start?now-120000?\
>?-v?"Traffic"?-t?"33?Hours?ago"?\
>?--lower-limit?-5000?\ #?限制Y軸下限為?-5000?
>?--upper-limit?10000?\ #?上限為?10000
>?--rigid?\ ? #?嚴格按照上面的規定來畫
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
>?DEF:value2=eth0.rrd:eth0_out:AVERAGE?\
>?AREA:value1#00ff00:in?\
>?LINE1:value2#ff0000:out:STACK
497x179
[root@dns1?bob]#





[size=4]八)?X/Y?軸刻度(Grid)[/size]


[-x|--x-grid?GTM:GST:MTM:MST:LTM:LST:LPR:LFM]?
[-x|--x-grid?none]
[-y|--y-grid?grid?step:label?factor]?
[-y|--y-grid?none]
[-Y|--alt-y-grid]
[-X|--units-exponent?value]


RRDtool?中設置?X?軸的刻度比較復雜,如果沒有必要,可以交給?RRDtool?自動去處理。

例如上面的圖,33?小時的情況下,X?軸只有2個值,顯得很不足。這時候有兩種方法?:

A)一是使用?–w?增大圖表的寬度,這樣?RRDtool?會自動加多一些刻度上去。



不過需要增加多大才會有上面的這種效果不得而知,所以這種方法不是很方便。

B)二是通過上面的選項自己設置?X/Y?軸的刻度如何顯示。首先看上圖,在垂直的線中,紅色的線稱為?Major?Grid(主要網格線),

????灰色的線稱為?Base?Grid?(次要網格線)(這里是借用?EXCEL?中的概念?^_^?)。?X?軸下面的時間文字成為?Label?。了解這
????
????三樣東西后,就可以動手調整刻度了。
????
C)有兩種方法可以快速去掉?X/Y?軸的刻度,就是?–-x-grid?none?和?–-y-grid?none

D)GTM:GST?:控制次要格網線的位置。GTM?是一個時間單位,可以是?SECOND、MINUTE、HOUR、DAY?、WEEK、MONTH、YEAR?。

?????GST?則是一個數字,控制每隔多長時間放置一根次要格線。例如我們要畫一個1天的圖表,決定每15分鐘一根次要網格線,則格式為?MINUTE:15
?????
E)MTM:MST?:控制主要網格線的位置。MTM?同樣是時間單位,MST?是一個數字。接上面的例子,決定一個小時1根主要網格線。則格式為?HOUR:1?

?????LTM:LST?:控制每隔多長時間輸出一個label?。決定為1小時1個?label?。則格式為?HOUR:1

G)LPR:LFM?:LTM:LST?只是決定了?label?的顯示位置了,沒有指定要顯示什么內容。LPR?指的是如何放置?label?。如果LPR?為0,則數字對齊格線

????(適用于顯示時間)。如果不為0,則會做一些偏移(適用于顯示星期幾、月份等)。至于LFM?則需要熟悉一下?date?命令的參數,常用的有?%a(星期幾)、
????
????%b(月份)、%d(天)、%H(小時)、%M(分)、%Y(年)。我們決定顯示小時和分,所以用?%H%M

H)綜合起來,X?軸的刻度定義就是?–-x-grid?MINUTE:15:HOUR:1:HOUR:1:0:’%H:%M’。最好把?%H:%M?括起來

?????建議?MST是?GST?的2-6倍,MST?和?LST?相同。這樣畫出來的圖比較美觀一些


????

這明顯就是圖片太小了,不夠顯示。把上面的?:%M?去掉就可以了,只顯示小時,不顯示分鐘

????

如果把圖片放大一點就更好了?(-w?800)

????

所以在設置?X?軸的刻度時,要記得不要顯示太多東西,否則需要增大圖片的大小

????

I)Y?軸刻度的設置又不一樣了

???grid?step?:用于控制Y軸每隔多少顯示一根水平線

???label?factor?:默認為1,也就是在每根水平線的高度那里顯示一個值。

???例如下面就是一個例子?(每隔800顯示一根水平線)

????

J)Y?軸還有一個很方便的選項就是?–Y?,它可以最大限度的優化?Y?軸的刻度,建議每次繪圖都加上去。

K)Y?軸另外一個有用的選項就是?–X?(雖然選項名是?-X?,但確實是用來設置?Y?軸刻度值的)。在上面的圖我們看到?RRDtool?自動對?Y?軸的值進行調整,

?????以?k?為單位顯示。但如果你不想以?k?顯示,而是想固定以某個單位來顯示(M,b)該怎么辦呢?這就要用到?–X?選項了。-X?后面跟一個參數,參數值
?????
?????范圍是?-18、-15、-12、-9、-6?、-3、0、3、6、9、12、15、18?。0?表示以原值顯示,3?表示數值除以1000,也就是以?k?為單位顯示,6?就是以
?????
?????M?顯示,9?就是以?G?顯示。如果你給出1或者2,則?RRDtool?也可以接受,但會被“靜悄悄”的改為0。下面就是一個以原值(-X?0)顯示的例子



[?本帖最后由?ailms?于?2006-12-4?09:44?編輯?]


?ailms 回復于:2006-12-04 09:28:00

使用RRDtool?進行繪圖_(三)
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內容?:
A)官方文檔?:http://oss.oetiker.ch/rrdtool/doc/index.en.html
B)abel?兄的大作?:http://bbs.chinaunix.net/viewthread.php?tid=552224&highlight=rrdtool
http://bbs.chinaunix.net/viewthread.php?tid=552220&highlight=rrdtool
作者?:ailms?<ailms{@}263{dot}net>
版本?:v1
最后修改?:2006/11/17?17:35
**********************************************************************************************************************
[/color]


[size=4]九、?其他(Miscellaneous)[/size]


[-n|--font?FONTTAG:size:[font]]
[-g|--no-legend]
[-b|--base?value]


A)-n?|?--font?是一個有意思的選項。CU?的?abel?兄曾提供了一個中文?patch?可以實現顯示中文的效果。但對于我這等對?C?一竅不通的家伙,就不知道怎么用了。

????不過幸好?–n?選項可以實現這個目的,只需要中文字體的文件就可以搞定了。

?????[color=blue]首先你要找出一個中文的字體文件[/color]。例如/usr/share/fonts/zh_CN/TrueType/gkai00mp.ttf?。你也可以把?Windows?上的?C:\Windows\Fonts?下面的中
?????
?????文字體拷貝到?Linux?上,例如home/bob/Fonts/simhei.ttf?(黑體)效果不錯,其他的則不太行,會出現模糊或者重疊的情況。建議就使用黑體算了。

?????[color=blue]其次是確定字體大小。[/color]中文字體不宜小于?7?,否則看不清楚

?????[color=blue]確定你要修改的是圖表的那個部分[/color]。有?DEFAULT(全部),TITLE?(標題)、AXIS(坐標軸字體)、UNIT(Y軸單位字體)、LEGEND(圖例字體)幾種。

下面就以實際的例子來說明如何顯示中文?:

實例1?:使用?–n?讓?RRDtool?顯示中文


[root@dns1?bob]#?rrdtool?graph?4.png?\
>?-n?TITLE:10:'/home/bob/Fonts/simhei.ttf'?\ #?修改標題的字體為黑體
>?-n?AXIS:10:'/home/bob/Fonts/simhei.ttf'?\ #?修改?X?軸的字體為黑體
>?--start?now-240000?\ #?大于3天的數據
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
>?AREA:value1#00ff00:in?-t?"33小時前的?eth0?接口流量"?-v?"traffic"
>?-Y?–w?600 #?圖表寬度為?600?pixel
503x190
[root@dns1?bob]#


這就是最終的效果了,可以看到標題和?X?軸都是中文的,但?Y?軸的字體還是默認的字體。



B)-g?|--no-legend?用于取消圖表下方的圖例,不過不建議這么做。

C)-b|--base?value?在?MRTG?和?RRDtool?中,默認?1k=1000?,使用?–b?可以進行調整,例如?–b?1024

[size=4]十)數字報表[/size]

看看上面的圖表,是不是覺得還少了些什么呢?對了,就是只有圖,沒有文字說明。如何象?MRTG?那樣能夠顯示“最大值”、“平均值”、“當前值”呢?

這就需要用到?GRPINT?和?COMMENT?語句了。
GPRINT?就是在圖表的下方(仍然屬于圖片的內部)輸出最大值、最小值、平均值這些東東;COMMENT?就是用來輸出一些字符串,例如報表的表頭。

A)GPRINT的格式是GPRINT:vname:CF:format?。由于?format?部分太多參數了,我這里就用最常用的那個?:?%x.ylf?。

B)COMMENT?的格式是COMMENT:text?。要注意?COMMENT?默認是不輸出換行的,如果要輸出換行,必須用?“\n”?。

下面就以一個實例來說明如何打印報表?:?繪制1小時前的流量圖,并打印數字報表(參照?abel?兄給出的例子)


[root@dns1?bob]#?rrdtool?graph?1.png?\
>?--start?now-1h?-w?600?-n?DEFAULT:8?\
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
>?DEF:value2=eth0.rrd:eth0_out:AVERAGE?\
>?COMMENT:"?\n"?\
>?COMMENT:"?????????當前值--------------平均值--------------最大值--------------最小值--------------\n"? ???>?COMMENT:"?\n"?
>?AREA:value1#00FF00:"流入"?\
>?GPRINT:value1:LAST:'%13.2lf'??\
>?GPRINT:value1:AVERAGE:%13.2lf??\
>?GPRINT:value1:MAX:%13.2lf??\
>?GPRINT:value1:MIN:%13.2lf??\
>?COMMENT:"?\n"?\
>?LINE2:value2#ff0000:"流出":STACK?\ #?注意這里是?STACK?方式
>?GPRINT:value2:LAST:%13.2lf??\
>?GPRINT:value2:AVERAGE:%13.2lf??\
>?GPRINT:value2:MAX:%13.2lf??\
>?GPRINT:value2:MIN:%13.2lf??\
>?COMMENT:"?\n"?\
>?COMMENT:”?\n”?\
>?COMMENT:"LAST?UPDATED?\:$(date?'+%Y-%m-%d?%H\:%M')\n"?-Y
687x270
[root@dns1?bob]#




[color=red]注意比較?Y?軸刻度值和“流出”部分的值的關系,?Y?軸刻度值?—“流入”?=“流出”[/color]

由于時間精力有限,關于對齊方面的工作就大家自己試驗吧.如果繪制的對象數量不是很多,可以用橫向報表,不要用這種垂直的格式,

[color=red]這種格式的好處是便于比較各個對象的值。不過我可以肯定,如何讓這些數字和上面的表頭對齊是一個會令你極度抓狂的工作的!!![/color]

上面的??COMMENT?一是輸出表頭,二是輸出空行。注意,要用?COMMENT?輸出空行,必須用?COMMENT:’?\n’?。

注意到?‘\’?前面的空格嗎?這個是不可以漏的,否則就不會有空行的效果了。

[size=4]十一)特殊功能[/size]


VRULE:time#color[:legend]
HRULE:value#color[:legend]
SHIFT:vname:offset


A)VRULE/HRULE?可以用于在圖表上面繪制垂直線/水平線。例如我們想要在圖表上面標出最大值,可以用?HRULE?在?Y?軸的指定刻度值

????那里繪制一根水平線,例如?HRUE:100000#ff0000:”最大值”?在?100k?處畫一根水平線,并指出這是最大值。



SHIFT?可以用來移動數據,例如?abel?兄曾經在?“[教學]中的教學(二)?RRDTOOL?1.2?更新項目”中提到過一個問題,

就是“xx同期相比”如何畫?下面就以如何比較3天的數據。

實例1?:繪制連續3天的數據


[root@dns1?bob]#?rrdtool?graph?1.png?\
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE:end=now:start=now-1d?\ #?1天前
>?DEF:value2=eth0.rrd:eth0_in:AVERAGE:end=now-1d:start=now-2d?\ #?2天前
>?DEF:value3=eth0.rrd:eth0_in:AVERAGE:end=now-2d:start=now-3d?\ #?3天前
>?LINE1:value1#00ff00:"1?day?ago"?\
>?LINE1:value2#ff0000:"2?days?ago"?\
>?LINE1:value3#000000:"3?days?aog"?\
>?-Y
475x168
You?have?new?mail?in?/var/spool/mail/root
[root@dns1?bob]#





為什么只有1天前的數據呢?因為我們沒有指定?–-start?,RRDtool?默認只繪制1天前的數據。由于這里覆蓋了3天,

所以我們可以把?–-start?定義為?–-start?now-3d?就可以了。



現在是不是3天的數據都畫出來了呢?不過由于它們是橫向排列的,所以要比較同個時間段的并不容易,能否把它們

按“垂直”的方式排列呢?這就要用到?SHIFT?了!


[root@dns1?bob]#?rrdtool?graph?3.png?\
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE:end=now:start=now-1d?\ #?1天前
>?DEF:value2=eth0.rrd:eth0_in:AVERAGE:end=now-1d:start=now-2d?\ #?2天前
>?DEF:value3=eth0.rrd:eth0_in:AVERAGE:end=now-2d:start=now-3d?\ #?3天前
>?LINE1:value1#00ff00:"1?day?ago"??\
>?SHIFT:value2:86400?LINE1:value2#ff0000:"2?days?ago"?\ #?把曲線向右移動1天
>?SHIFT:value3:172800?LINE1:value3#000000:"3?days?ago"?\ #?把曲線向右移動2天
>?-Y?–w?600
475x168




[root@dns1?bob]#




和上面的圖表比較,是否可以發現?X?軸不同了,不再是3天,而是1天多1點了。而且3根曲線重疊在一起了,可以看出在這三天中,

只有1天前的23點左右有一點流量之外,其余絕大部分都沒有流量。

這就是?SHIFT?的功能了,可以把曲線/方塊沿著?X?軸移動(左右都可以),我們達到比較同期數據的目的。是不是很好用呢?

[size=4]十二)總結[/size]

這次的內容可真夠多的,足足寫了19頁。不過工具性的東西就是這樣?:別看內容?N多,你只要動手畫出1個圖之后,就會覺得一

切都很簡單了。以后只要套用就可以了。關鍵是如何更好的把你想要的數據以合適的發給你是呈現出來。

上面這些內容都是我通過實驗得出的,由于具體的環境不同,可能會跟大家的不同,或者出現錯誤。我希望大家不要客氣,有錯誤

的地方就指正,有什么好的發現也提出來,一起完善?RRDtool?的文檔。這樣就可以讓越來越多的人了解、掌握?RRDtool?了?。???

?(^_^)!

[?本帖最后由?ailms?于?2006-12-4?09:45?編輯?]


?ailms 回復于:2006-12-04 09:45:55

RRDtool簡體中文教程_9:如何使用RPN
如何使用RPN
?[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內容?:
A)官方文檔?:http://oss.oetiker.ch/rrdtool/doc/index.en.html
B)abel?兄的大作?:http://bbs.chinaunix.net/viewthread.php?tid=552224&highlight=rrdtool
http://bbs.chinaunix.net/viewthread.php?tid=552220&highlight=rrdtool
作者?:ailms?<ailms{@}263{dot}net>
版本?:v1
最后修改?:2006/11/17?17:35
**********************************************************************************************************************
[/color]

[size=4]一)前言[/size]

RPN?代表逆波蘭式(Reverse?Polish?Notation)。逆波蘭式最早于1920年由Jan?Lukasiewicz?發明,最神奇的地方是用它來表示數學表達式,

完全不需要括號。而且?RPN?不像普通的數學表達式那樣,操作符在操作數的中間,而是在操作數的右邊。例如?3+2?用?RPN?表示就是?3,2,+?;

3+(2X5)?用?RPN?表示就是?3,2,5,x,+?最后運算的部分(加法部分)的操作符放在最后,乘號放在前面,表示先執行?2?x?5?,在把結果和3相加。

在?RRDtool?中,RPN?還可以用來表示?if-then-else?關系。這點在繪圖中很有用。例如你要看?eth0?接口在一天當中流量?≥?10Mb/s?的部分,“隱藏”

其他低于?10Mb/s?的部分,則可以用到這個功能。

[size=4]二)操作符[/size]

什么是?RPN

A)RPN?是?Reverse?Polish?Notation?的縮寫,是用于表示算術運算和邏輯運算的一種語法格式。

B)RRDtool?的?CDEF?語句中就經常使用?RPN?來對?DEF?取出來的數據進行運算。

C)RPN?的特點是操作數和操作符出現的順序和運算的順序一致,這樣就不需要使用括號了

D)RPN?的格式是?<value1>,<value2>,<operator>?,[<value1>,<value2>,<operator>]…?可以看出是操作數在前,操作符在后的格式

E)RPN?需要提到堆棧的概念(stack)。堆棧是用來存儲操作數和操作符的。

F)當堆棧中壓入(push)一個操作符時,就從堆棧中取出(pop)所需要的操作數進行計算(根據操作的不同pop出不同數量的操作數)。
??
?????結果再返回(push)堆棧,最終整個?RPN?應該只返回一個值,或者說堆棧中只有一個元素

G)在?CDEF?中書寫?RPN?操作符,要一律以大寫的格式出現

H)?RPN?中,如果某個部分的運算結果非?0,則被認為是?true?,只有?0?才被認為是?false?

[size=4]三)RPN?操作符的分類[/size]

A)布爾操作符?:GT、GE、LT、LE、EQ、NE、

B)特殊值比較符?:UN、ISINF、

C)條件操作符?:IF

D)比較操作符?:MIN、MAX、LIMIT

E)算術操作符?:+?、-、*、/、%、SIN,?COS,?LOG,?EXP,?SQRT、FLOOR,?CEIL、ATAN、ATAN2、DEG2RAD,?RAD2DEG

F)數據集操作符?:所謂數據集(sets),就是指多個數據。SORT、REV、AVG、TREND

G)特殊值?:UNKN、INF、NEINF、PREV、COUNT

H)時間操作符?:NOW、TIME、LTIME

I)堆棧操作符?:POP、DUP、EXC

四)RPN?操作的結果

A)布爾操作符?:從堆棧中?pop?出兩個元素,并根據比較結果返回?0?(false)?或者?1?。任何同?UNKNOWN?或者?INF?、NEINF?比較的都為?0

B)特殊值比較符?:從堆棧中?pop?出1個元素,并同?UNKNOWN?或者?INF、NEINF?比較。結果為?0?或者?1

C)條件操作符?:從堆棧中pop出3個元素,如果最后pop出的那個元素不為0(條件部分為?true),則第2次?pop?出的那個元素被重新入棧(then部分);

?????否則第一次pop出的元素重新入棧(else部分)。結果為?then?部分或者?else?部分返回的值,不一定為0或者1

D)比較操作符?:

?????對于?MIN/MAX?操作符來說,從堆棧中?pop?出兩個操作符,并把較大/小的那個重新入棧。如果其中有一個?unknown?,則結果為?unknonw

?????對于?LIMIT?操作符來說,先從堆棧中?pop?出2個操作數,作為邊界的定義;再?pop?出1個操作數,比較該操作數是否落在前面定義的范圍內。
?????
?????如果是則把最后?pop?出的那個元素重新入棧;否則把?UNKN?值入棧;注意,是?UNKN?,不是?0

E)算術操作符?:根據操作符?pop?出所需數量的操作數,并把算術運算的結果重新入棧

F)數據集操作符?:

????對于?SORT、REV?來說,先從堆棧中?POP?出一個元素,該元素的值就是下面要?pop?出的元素的數量。然后對堆棧從上到下的若干個元素
????
???由第一次?pop?的出的那個元素的值決定)進行排序/反向排序。結果再重新入棧。

???注意?:由于堆棧的特點是后進先出,所以要操作的元素是從SORT操作符往左方向計數。例如v1,v2,v3,v4,3,SORT是對?v2~v4?排序,
???
????????????不是對?v1~v3?排序。??這點在書寫?RPN?時要特別注意。

???注意?:SORT?操作是最小值在堆棧的最頂部;REV?則相反,最小值是在堆棧的最頂部。

???對于?AVG?操作來說,同樣是先?pop?出1個元素,并按照指定的數量對后續的若干個操作數進行操作,但結果只有一個數值,并入棧。


G)特殊值?:

????UNKN?表示壓入一個?UNKN?值;INF、NEINF?分別表示把?INF、NEINF?值壓入堆棧

H)時間操作符?:

???TIME?返回當前所提取的記錄的?timestamp?,注意?TIME?直接返回當前記錄的?timestamp?,不用任何參數

???NOW?返回當前時間,同樣?NOW?不用任何參數

I)堆棧操作符?:

???POP?:彈出堆棧的最頂部的那個元素

??EXC?:交換堆棧頂部的第一個和第二個元素的值

[size=4]五)如何閱讀?RPN[/size]

A)首先按照從左到右的順序,找出第一個?RPN?操作符,并根據上一節的內容,對相應的操作數進行操作

B)操作結果分成兩種?:

如果是一個值,直接替換掉該部分?RPN?

如果是多個值(數據集操作,但?AVG?操作只返回一個值),則結果可能為多個數值。則把這若干個數值用?‘,’?隔開,替換原來那部分?RPN?

C)如此循環,一直到整個?RPN?只返回一個值為止

[size=4]六、RPN?實例[/size]

A)布爾型操作符?:2,1,GE?表示?2>=1?;

B)特殊值比較符?:mydata,UN?表示?mydata?==?UNKNOWN?

C)條件操作符?:mydata,UN,0,mydata,IF?表示如果?mydata?等于?UNKNOWN?,則返回?0;否則還是返回?mydata?本身

D)比較操作符?:mydata,20,MAX?表示返回?mydata,20?這兩個數值中較大的一個;alpha,0,100,LIMIT?表示測試?alpha?的值是否小于等于0,大于等于100;

E)算術操作符?:1,2,-?表示?1-2=-1

F)數據集操作符?:

????v1,v2,v3,v4,v5,4,SORT?表示對?v1~v4?進行正向排序,結果堆棧中還是有5個元素;

????v1,v2,v3,v4,3,AVG,+,2,/?表示對?v4,v3,v2?進行求平均值,并把結果入棧。假設v2~v4的結果為?k?,則為?v1,k,+,2,/?也就是返回?(v1+k)/2

G)特殊值?:mydata,0,GT,UNKN,mydata,IF?表示如果?mydata?大于?0則返回?UNKNOWN?,否則還是?mydata?

H)時間操作符?:?TIME,`date?–d?“2006-10-01?10:00”?+%s`,GT,0,1,IF?表示如果當前記錄的采集時間是在?2006-10-01?10:00?之后就返回1,否則返回?0

I)堆棧操作符?:POP?就立即彈出第一個元素
?

[size=4]七)如何表示?AND、OR?關系[/size]

A)我們知道?RPN?表達式的值除非0,否則都認為是?true

B)我們可以利用?加法操作和乘法操作來實現?OR?和?AND?的邏輯關系;如果兩個?RPN?表達式的值相加不等于0,就一定為?true?;

?????如果兩個?RPN?表達式的值相乘不等于0,就一定為?true

C)AND?關系的例子?:例如要比較某個值(15,9)是否在特定范圍內可以用?:

????15,10,GT,15,20,LT,*?,結果就是(15>10)*(15?<?20)=?1?*?1?=1?,所以為?true

?????9,10,GT,9,20,LT,*?,結果就是?(9?>10)*?(?9?<?20)=?0?*?1?=0?,所以為?false

D)OR?關系的例子:同上例如要比較某個值(7,15)小于10,或者大于20:

?????7,10,LT,7,20,GT,+?,結果為?(7?<?10)+?(7?>?20)?=?1+0?=?1,所以為?true

?????15,10,LT,15,20,GT,+?,結果為?(?15?<?10)?+?(?15?>?20)?=?0?+?0?=0?,所以為?false

E)不過使用?+?需要注意一個地方?:相加的雙方都必須是正數,否則可能出現問題,例如一個正數(-5,true)和另外一個正數(5,true)相加為?0(false)

如果是按照?OR?的關系,應該是?true?的,但結果變成0(false),所以在使用?+?來表示?OR?的關系時,要注意該問題

F)使用?*?則沒有該問題了,正數?*?負數?=?負數?(true)。所以如果遇到?OR?關系的時候,可以轉換為?AND?關系來計算。

?????例如要表達?(x?<?a)?OR?(?x?>?b)?的關系,可以改為?(x?>a)?AND?(?x?<?b?)?,訣竅就是把比較操作符調反方向,把?+?改為?*

[size=4]八)實例[/size]

實例1:例如要看?eth0的總流量,可以用如下的定義


DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
DEF:value2=eth0.rrd:eth0_out:AVERAGE?\
CDEF:value3=value1,value2,+?\
AREA:value3#ff0000:”total”


實例2?:假設我們要把?eth0?和?lo?的流入流量相加,得出總的流入流量


DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
DEF:value2=lo.rrd:lo_out:AVERAGE?\
CDEF:value3=value2,UN,0,value2,IF?\
CDEF:value4=value1,value3,+?\
AREA:value4#00ff00:”total?in”

由于?lo.rrd?一直沒有數據插入,所以一直都是?NaN?,如果直接把?value1?和?value2?相加,由于?value2?是?UNKNOWN,

所以相加的結果也是?UNKNOWN?。圖表上將什么都不顯示,所以需要對?value2?進行判斷,如果?value2?的值?UNKNOWN (value2,UN),

則返回0,否則返回?value2?本身。然后把這個值賦予變量?value3?,最后把?value1?和?value3?相加,才得出真正入流量
?
實例3?:只看?eth0?中流量大于?10Mb/s?的部分,其余不看


DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
DEF:value2=eth0.rrd:eth0-_out:AVERAGE?\
CDEF:value3=value1,1000000,GT,value1,UNKN,IF?\
CDEF:value4=value2,1000000,GT,value2,UNKN,IF?\
AREA:value3#00ff00:”traffic_in?\>?10M\/s”?\
AREA:value4#ff0000:”traffic_out?\>?10Mb\/s”:STACK



實例4?:只繪制特定時間段(在?2006/11/29?10:30?~?2006/11/29?12:30)的數據


DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
DEF:value2=eth0.rrd:eth0_out:AVERAGE?\
CDEF:value3=TIME,$(date?–d?‘2006-11-29?10:30’?+%s),GT,TIME,$(date?–d?'2006-11-29?12:30'?+%s),LT,*,value1,UNKN,IF?\
CDEF:value4=TIME,$(date?–d?‘2006-11-29?12:30’?+%s),GT,TIME,$(date?–d?'2006-11-29?13:30'?+%s),LT,*,value2,UNKN,IF?\
AREA:value3#00ff00:”traffic_in”?\
AREA:value4#ff0000:”traffic_out”:STACK



[size=4]九、完結[/size]

?相信到目前為止,大家對?RRDtool?的認識應該更深了吧。一定要多做實驗,這樣才能做到熟能生巧,靈活應用。
?
?其實剩下的還有?xport、dump、restore、resize、tune、rrdcgi?幾個操作沒講,而且有一些應用經驗方面的東西也沒有提到,
?
?不過想要全部寫出來,可能太耗時間和精力了,這些東西足足寫了我2個星期才寫完。中間還要不斷的做實驗以驗證正確性,怕誤導了大家。
?
?如果需要的話,可以自己下載官方文檔學習,或者能有熱心的朋友補充就更好了,^_^?。
?
[size=4]十、?本人的一點學習體會[/size]

??本人從開始看?RRDtool?官方文檔到開始寫這篇教程,差不多用了2個月。?RRDtool?比學習?MRTG?難多了,資料少,RRDtool?的中文資料目前就只有?abel?

兄寫的那一篇教程,如果沒有實際的上機操作,是不可能看懂的,所以?abel?兄也特別交代這點。如果只一心想速成,到頭來反而吃虧的是自己。

???象sendmail、bind?這些服務器的配置,隨便在?google?上都可以搜到一大把所謂的“快速入門”,很多人也都照著做了。但明明別人可以的,為什么輪到自己
???
卻失敗呢?相信這是很多人心中曾有的郁悶經歷。其實歸根到底就是基礎的問題,再深入一些就是學習心態的問題。“不積跬步,無以至千里;不積小流,無以成江海”。

配置一個服務器并不是照抄配置就可以的。環境的不同,需求的不同這些因素都要考慮在內。怎么可能做到完全一樣呢?同一個語句換個環境可能就不行了。所以我很

少看那些所謂的快速入門,要么看?manual?,要么看書(說到這里,感覺?O’Reilly?的書真是不錯!^_^),如果是象?RRDtool這種的,就只好看官方文檔了。
???
??學習的同時也要注意選擇好的教材。有時候一本好書能帶給無窮的好處。這點在我第一次看?O’Reilly?的?《dns?&?bind?4th》就有感覺,老外的書很注重循序漸進,
??
通常他們都是從某個實際工作環境的一個小例子說起,逐步引入各個命令、配置語句。然后隨著需求的壯大,不斷引入新的內容,最后形成一個總體。這樣看完后會心中會

有一個整體的框架和概念。不象國內一些書,毫不顧及條理,一上來就講語法、命令,搞得讀者很快都沒有興趣。這樣的書可謂害人不淺。

???同時也建議大家讀英文原版的書。為什么呢?雖然中文的看起來快一些,但學習不是競走比賽。不是比誰看的快,而是比誰學的牢。英文書的詞匯其實都是專業詞匯,

只要看多了,自然記住了。實在記不住,可以用金山詞霸等工具輔助。俺的英文水平只有二級,但并不妨礙我看書。況且看英文書,有一個“英文→中文”的轉換的過程。就

是揣摩作者這句話的含義,或者說這句話應該如何翻譯好。有些人覺得這個沒有什么,但我覺得這個過程是你弄清作者思想的重要步驟。在你不斷的揣摩中,可能會有不同

的理解,直到你認為這是最正確的那一種解釋為止。如果是看中文書,可能會由于惰性,比較容易就接受作者的想法,而失去這個主動我思考的過程。

??一時有感而發,胡亂寫了一通,請各位朋友見諒了。

??書山有路勤為徑,學海無涯苦做舟!

???愿以該座右銘和各位有志于Linux的朋友一起共勉!

??2006/12/2?22:23
?

轉載于:https://www.cnblogs.com/xalex/archive/2008/12/05/1348050.html

總結

以上是生活随笔為你收集整理的RRDTool学习资料备忘的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。