RRDTool学习资料备忘
RRDtool?簡(jiǎn)介
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內(nèi)容?:
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。相信只要做網(wǎng)管工作的朋友,對(duì)?MRTG?這個(gè)軟件一定不會(huì)陌生,
至少也可能聽過。MRTG?可以通過?SNMP?協(xié)議直接訪問?SNMP?Object?,例如?ifInOctect?和?ifOutOctect?;也可以通過外部?
script?的方式,來監(jiān)測(cè)cpu、內(nèi)存、磁盤利用率、數(shù)據(jù)庫的表空間利用率等信息。只要把?MRTG?放入?crontab?中讓其自動(dòng)運(yùn)行,
MRTG?就可以自動(dòng)為你繪制出每天、每周、每月、每年的統(tǒng)計(jì)圖表。?MRTG?甚至還為你提供了自動(dòng)生成配置文件的?cfgmaker?和
自動(dòng)生成?HTML?頁面的?indexmaker?這兩個(gè)工具,讓你省去逐個(gè)編寫?cfg?文件的痛苦。到目前為止,還有很多人在使用它。它現(xiàn)在
有?Unix、Windows?各種平臺(tái),windows?平臺(tái)上甚至出現(xiàn)了?PRTG?這樣和?MRTG?很象的東東,輕點(diǎn)鼠標(biāo)就可以漂亮的完成工作。
既然如此,我們?yōu)槭裁催€要介紹?RRDtool?呢?先讓我們看幾個(gè)問題,幾個(gè)在?MRTG?使用中常見的問題?:
[size=4]?一)MRTG?不能作什么?[/size]
A)[color=blue]MRTG?一張圖表只能顯示2個(gè)對(duì)象,一個(gè)輸入,一個(gè)輸出。[/color]如果你想同時(shí)顯示多個(gè)對(duì)象呢?例如筆者的單位有12臺(tái)服務(wù)器。如果想
???把它們的負(fù)載情況都顯示在一個(gè)圖表上,MRTG?至少需要6張圖。
B)[color=blue]MRTG無法回放數(shù)據(jù)。[/color]MRTG?的圖是自動(dòng)生成的,所采用的數(shù)據(jù)也是由?MRTG?自己提取的,例如5分鐘平均的記錄有288條,??MRTG每20分鐘合并一次,
????每次合并4個(gè)記錄。在50個(gè)小時(shí)后,288條記錄將全部變成20分鐘平均的數(shù)據(jù)。如果你想回放這些數(shù)據(jù)怎么辦呢?對(duì)不起,只能去
????看第2個(gè)圖了(每周)。
C)[color=blue]MRTG?只有?COUNTER?和?GAUGE?這兩種計(jì)算類新。[/color]如果我要監(jiān)測(cè)兩個(gè)數(shù)值型的對(duì)象之間的大小,它們之間的差值可以是正數(shù),也可以
???是負(fù)數(shù)。MRTG?能實(shí)現(xiàn)嗎?筆者在多次試驗(yàn)中發(fā)現(xiàn),MRTG?對(duì)于負(fù)數(shù)的和?‘.15’??這樣格式的小數(shù)(通常都是bc的輸出)的識(shí)別會(huì)出錯(cuò)。
???例如把?‘.72’?識(shí)別為?72,把?-1?識(shí)別為?1。
D)[color=blue]MRTG?無法實(shí)現(xiàn)有條件的繪圖。[/color]有時(shí)候我們只想看某個(gè)服務(wù)器在一年之中的宕機(jī)時(shí)間,正常時(shí)間我們不關(guān)心;或者我們想看當(dāng)前值和去年同期相比究竟如何??這些都是
?????MRTG無法做到的
[size=4]二)?MRTG?的優(yōu)點(diǎn)[/size]
那?MRTG?和?RRDtool?相比就沒有優(yōu)點(diǎn)了嗎?也不是。簡(jiǎn)單、方便就是它的最大優(yōu)點(diǎn)。
(MRTG?中還有一個(gè)好東西就是自動(dòng)告警功能,相比之下,RRDtool?在這方面的配置比較復(fù)雜,
?還不如直接作到?shell?script中)
前面提到?MRTG?能夠通過?cfgmaker?和?indexmaker?快速建立配置文件和HTML頁面。而?RRDtool?在這兩方面都需要自己動(dòng)手。
數(shù)據(jù)的采集→插入數(shù)據(jù)→提取數(shù)據(jù)→繪圖→建立?HTML?,這些步驟都是需要你自己動(dòng)手的。RRDtool?給了使用它的人最大程度的自由。但這種
自由對(duì)于新手或者沒有耐心的人來說可能是一種考驗(yàn)。相比之下,MRTG?就容易上手多了。
[size=4]?三)?RRDtool?的定義[/size]
???RRDtool?代表?“Round?Robin?Database?tool”?,作者同時(shí)也是?MRTG?軟件的發(fā)明人。官方站點(diǎn)位于http://oss.oetiker.ch/rrdtool/?。
???所謂的“Round?Robin”?其實(shí)是一種存儲(chǔ)數(shù)據(jù)的方式,使用固定大小的空間來存儲(chǔ)數(shù)據(jù),并有一個(gè)指針指向最新的數(shù)據(jù)的位置。我們可以把用于存儲(chǔ)
???
??數(shù)據(jù)的數(shù)據(jù)庫的空間看成一個(gè)圓,上面有很多刻度。這些刻度所在的位置就代表用于存儲(chǔ)數(shù)據(jù)的地方。所謂指針,可以認(rèn)為是從圓心指向這些刻度的
??一條直線。指針會(huì)隨著數(shù)據(jù)的讀寫操作自動(dòng)移動(dòng)。要注意的是,這個(gè)圓沒有起點(diǎn)和終點(diǎn),所以指針可以一直移動(dòng),而不用擔(dān)心到達(dá)終點(diǎn)后就無法前進(jìn)
??的問題。在一段時(shí)間后,當(dāng)所有的空間都存滿了數(shù)據(jù),就又從頭開始存放。這樣整個(gè)存儲(chǔ)空間的大小就是一個(gè)固定的數(shù)值。所以RRDtool?就是使用類似
??的方式來存放數(shù)據(jù)的工具,RRDtool?所使用的數(shù)據(jù)庫文件的后綴名是?‘.rrd’。
[size=4]?四)RRDtool?的特殊之處[/size]
A)?首先?RRDtool?存儲(chǔ)數(shù)據(jù),扮演了一個(gè)后臺(tái)工具的角色。但同時(shí)?RRDtool?又允許創(chuàng)建圖表,這使得?RRDtoo??看起來又像是前端工具。其他的數(shù)據(jù)庫
?????????只能存儲(chǔ)數(shù)據(jù),不能創(chuàng)建圖表。
B)?RDtool?的每個(gè)?rrd?文件的大小是固定的,而普通的數(shù)據(jù)庫文件的大小是隨著時(shí)間而增加的
C)?其他數(shù)據(jù)庫只是被動(dòng)的接受數(shù)據(jù),?RRDtool?可以對(duì)收到的數(shù)據(jù)進(jìn)行計(jì)算,例如前后兩個(gè)數(shù)據(jù)的變化程度(rate?of??change),并存儲(chǔ)該結(jié)果。
D)?RRDtool?要求定時(shí)獲取數(shù)據(jù),其他數(shù)據(jù)庫則沒有該要求。如果在一個(gè)時(shí)間間隔內(nèi)(heartbeat)沒有收到值,則會(huì)用?UNKN?代替,其他數(shù)據(jù)庫則不會(huì)這樣做
[size=4]?五)總結(jié)RRDtool?和?MRTG?的不同之處[/size]
A)?MRTG?是采用配置文件的方式來監(jiān)控的;
??????RRDtool?則沒有配置文件一說。所有操作都是通過命令(也可以寫成script方式)執(zhí)行
B)?MRTG?有自動(dòng)采集數(shù)據(jù)的功能(通過?snmp);
?????RRDtool?沒有,需要手工或者通過?shell/perl?腳本來獲取數(shù)據(jù)
C)?MRTG?每次運(yùn)行都會(huì)更新圖片和日志;
?????RRDtool?默認(rèn)知識(shí)接收數(shù)據(jù),并不會(huì)繪圖,除非手工執(zhí)行?graph?命令
D)?MRTG?采用明文的?log?方式存放歷史數(shù)據(jù);
????
?????RRDtool?采用數(shù)據(jù)庫的方式來存放數(shù)據(jù);
E)?MRTG?無法回放日志數(shù)據(jù),因?yàn)?MRTG?會(huì)對(duì)日志進(jìn)行合并;
?????RRDtool?采用?RRA?的概念,把不同統(tǒng)計(jì)周期的數(shù)據(jù)單獨(dú)存放,所以可以做到歷史數(shù)據(jù)的回放功能
F)?MRTG?的?log?中每種周期的記錄的數(shù)量是自動(dòng)維護(hù)的;
???
?????RRDtool?的?RRA?中的記錄數(shù)是可以自定義的。
G)?MRTG?中數(shù)據(jù)的統(tǒng)計(jì)時(shí)間間隔是固定的,例如?5分鐘平均,30分鐘平均,2小時(shí)平均,1天平均;
????
??????RRDtool?可以任意設(shè)置(試過1分鐘一次)
H)?MRTG?一張圖只能顯示2個(gè)對(duì)象;
?????RRDtool?可以顯示多個(gè)。
I)?MRTG?的數(shù)據(jù)類型只有?COUNTER?和?GAUGE?兩種;
?
????RRDtool?有5種,COUNTER、GAUGE、DERIVE、ABSOLUTE、COMPUTE
J)?MRTG?的圖表只能顯示當(dāng)前值、最大值、平均值;
?????RRDtool?可以顯示當(dāng)前值(LAST)、初值(FIRST)、最大值(MAX)、最小值(MIN)、平均值(AVG)、總和(TOTAL)等
K)?MRTG?繪圖方式只有?AREA、LINE?方式;
?????RRDtool?則有?AREA、LINE(1|2|3)、STACK?方式;
L)?MRTG?負(fù)責(zé)搜集、存儲(chǔ)、繪圖、建檔(HTML);
?????RRDtool?只負(fù)責(zé)存儲(chǔ)、繪圖這兩個(gè)階段,所以需要自己建立?HTML?文件
M)?MRTG?的運(yùn)算功能較差;
??????RRDtool?可以通過?CDEF?對(duì)取出來的數(shù)據(jù)進(jìn)行算術(shù)和邏輯運(yùn)算;
N)MRTG?只能原原本本的顯示數(shù)據(jù);
????RRDtool?可以對(duì)數(shù)據(jù)進(jìn)行處理,或者有條件的顯示;
看來?RRDtool?的功能是不是比?MRTG?強(qiáng)很多呢?!
[color=red]具體的差異目前就只能想到這些,不知各位還有沒有什么補(bǔ)充呢??!!^_^?!![/color]
相信這么講的話還是比較抽象的,不過不用急,目前只是一個(gè)開始而已。
下一節(jié)我們開始講如何安裝?RRDtool?。
[?本帖最后由?ailms?于?2006-12-4?09:24?編輯?]
?zhdh1999 回復(fù)于:2006-12-03 23:09:06
收藏?中。。。:D
謝謝lz
?platinum 回復(fù)于:2006-12-04 07:45:38
希望你能將這些貼子合并,現(xiàn)在這樣太分散了不便于管理和閱讀
?ailms 回復(fù)于:2006-12-04 09:21:41
回斑竹大人,之前是考慮到內(nèi)容太長(zhǎng),放在一個(gè)貼子里可能看得太類累了。
我現(xiàn)在已經(jīng)把全部?jī)?nèi)容放到一個(gè)帖子了,不過有些原來的貼子由于被回復(fù)了,所以刪除不了。
RRDtool?的安裝
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內(nèi)容?:
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]?一)?安裝前的準(zhǔn)備[/size]
??以?Redhat?9?為例?:
??如果要安裝?source?包,請(qǐng)到?:http://oss.oetiker.ch/rrdtool/pub/?M=D,
??如果要安裝?RPM?包,請(qǐng)到http://dag.wieers.com/packages/rrdtool/?。
??不管采用那種方式,都需要先確認(rèn)當(dāng)前系統(tǒng)中是否有安裝如下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?相關(guān)的?rpm?包如下,并非所有都要裝,有些只是同一個(gè)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?包就簡(jiǎn)單了,就一個(gè)??:http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.2.14.tar.gz
???下面就以?Source?包的方式安裝?:
????在開始?build?RRDtool?之前,要先決定兩件事?:
????第一是在那個(gè)目錄下執(zhí)行?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
??然后需要的就是耐心的等待,正常情況下應(yīng)該是沒有問題的,如果還是報(bào)錯(cuò),注意檢查是否滿足上面的?RPM?需求。
?
??當(dāng)重新出現(xiàn)?shell?提示符時(shí),表示安裝結(jié)束。這時(shí)候可以執(zhí)行?rrdtool?命令看是否安裝成功
[size=4]?四)測(cè)試安裝是否成功[/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]#
???如果出現(xiàn)上述輸出則表示安裝已經(jīng)成功。不過每次都要輸入這么長(zhǎng)的命令豈不是很麻煩。最好加入到?PATH?中去。
[root@dns1?rrdtool-1.2.14]#?vi?~/.bashrc
把?PATH?一行修改為?:
PATH=$PATH:$HOME/bin:/usr/local/rrdtool-1.2.14/bin
??整個(gè)安裝過程到此就結(jié)束了,是不是很簡(jiǎn)單呢?^_^
??如果你是想安裝到別的地方,只要把上面對(duì)應(yīng)的?/usr/local/rrdtool-1.2.14?替換為你想要的目錄就可以了
好了,下一節(jié)我們講MRTG和?RRDtool?實(shí)施前的規(guī)劃問題。
[?本帖最后由?ailms?于?2006-12-4?09:36?編輯?]
?ailms 回復(fù)于:2006-12-04 09:22:13
前期規(guī)劃
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內(nèi)容?:
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]
???可能大家會(huì)覺得奇怪,做個(gè)?RRDtool?還要規(guī)劃什么?俗話說:磨刀不誤砍柴工。好的規(guī)劃必須具備靈活性、可擴(kuò)展性,否則會(huì)給
將來的使用帶來不少的麻煩。我們先談一下?MRTG?的規(guī)劃,再談?RRDtool?的規(guī)劃。
[size=4]一)MRTG?的前期規(guī)劃[/size]
A)[color=blue]想要監(jiān)測(cè)監(jiān)測(cè)什么對(duì)象?[/color]并列出一個(gè)清單;
B)[color=blue]想要以什么方法來取得數(shù)據(jù)?[/color]是通過?SNMP?還是?shell?、perl?。如果使用?SNMP?,監(jiān)測(cè)對(duì)象所在主機(jī)??
??????的?SNMP?服務(wù)安裝了嗎?是否配置完畢;
C)[color=blue]每個(gè)對(duì)象的監(jiān)測(cè)時(shí)間是多長(zhǎng)時(shí)間一次?[/color]并以此對(duì)監(jiān)測(cè)對(duì)象進(jìn)行分類。例如筆者本人共用?MRTG?監(jiān)測(cè)了?80?多個(gè)對(duì)象,并根據(jù)
?????內(nèi)容分成四類?:
?????重要狀態(tài)方面?:?例如?HACMP?的切換動(dòng)作監(jiān)控;Oracle?服務(wù)的狀態(tài);LVM?中的?vg?是否在線;服務(wù)器是否宕機(jī)等。這些監(jiān)
???????????????????????????????測(cè)對(duì)象對(duì)于一個(gè)系統(tǒng)的運(yùn)行來說都是十分重要的,一旦發(fā)生故障,需要立即處理的。所以對(duì)于這類對(duì)象,按最
??????????????????????????????小時(shí)間間隔(5分鐘一次)設(shè)置
?????I/O性能方面?:主要是?I/O?吞吐量、I/O?服務(wù)時(shí)間方面的監(jiān)測(cè)。這類對(duì)象是7分鐘一次
??????次要狀態(tài)方面?:例如?cpu利用率、內(nèi)存利用率、在線人數(shù)、溫度、撥號(hào)用戶人數(shù)等。20分鐘一次
?????利用率方面?:?由于實(shí)際應(yīng)用的問題,所以對(duì)利用率比較關(guān)心。單獨(dú)拎出來做一塊監(jiān)測(cè)。主要是監(jiān)控Oracle?的各個(gè)表空間的利
????????????????????????????用率,以及LVM磁盤系統(tǒng)各個(gè)分區(qū)的利用率。每25分鐘一次
?????監(jiān)控機(jī)本身?:負(fù)責(zé)監(jiān)控的監(jiān)控機(jī)本身也需要監(jiān)控。主要監(jiān)控當(dāng)前監(jiān)測(cè)的對(duì)象數(shù)量,以及系統(tǒng)負(fù)荷。這類就30分鐘一次。
D)[color=blue]每個(gè)對(duì)象一個(gè)?cfg?文件?還是全部集中在一個(gè)?cfg?文件中呢?[/color]我本人還是比較傾向于每個(gè)?Target一個(gè)?cfg?文件,每個(gè)?cfg?中都定
????????義?Workdir、Language???這兩個(gè)選項(xiàng)。針對(duì)上面的5個(gè)分類,建立5個(gè)?“大的”cfg?文件,再利用?MRTG?中的??Include?功能導(dǎo)入一個(gè)個(gè)
?????????“小的”、具體的?cfg?文件。這樣當(dāng)日后對(duì)某個(gè)監(jiān)測(cè)對(duì)象進(jìn)行修改時(shí)(例如修改數(shù)據(jù)的獲取腳本,或者修改圖片的外觀),可以單獨(dú)測(cè)試
?????????該對(duì)象。不用連同其他對(duì)象也一起跑一次,節(jié)省不少時(shí)間。如果想取消那個(gè)對(duì)象的監(jiān)測(cè),在前面提到的那個(gè)“大的”cfg?文件中,把對(duì)應(yīng)
????????的?Include?語句注釋掉就可以了,是不是更方便呢?
E)[color=blue]為個(gè)監(jiān)控對(duì)象起一個(gè)合適的名稱[/color]。一般用?<host_iterm>?的方式。這一步也滿重要的。一開始不注意,隨便給個(gè)名字,等到后來自己都
????搞不清楚了,建議一開始就規(guī)劃好。如果要使用?MRTG?的告警功能,就更應(yīng)該好好規(guī)劃了,要不然收到告警郵件都不知道是那個(gè)對(duì)象,那個(gè)機(jī)
????器出現(xiàn)問題,白白浪費(fèi)時(shí)間。
F)[color=blue]是否需要用到?MRTG?的告警功能。[/color]MRTG?有告警功能,可以設(shè)置輸入/出的最大值,最小值。超過限制就會(huì)調(diào)用?ThreshProgI?和?ThreshProgO?
???選項(xiàng)指定的程序。我一般用發(fā)送郵件和HTML配合的方式。下面是告警部分的截圖?:
??
?差不多也就這些了,就可以開始動(dòng)手寫?script?了。
[size=4]?二)RRDtool?的前期規(guī)劃[/size]
RRDtool?的前期規(guī)劃相對(duì)多一點(diǎn),因?yàn)?RRDtool?很多東西需要自己設(shè)定。除了上述?MRTG?考慮的幾點(diǎn)之外,我一般還考慮以下幾點(diǎn)?:
A)[color=blue]是一個(gè)?RRD?文件中包括多個(gè)監(jiān)測(cè)對(duì)象(DS),還是分成多個(gè)?RRD?文件??[/color]RRDtool?提供了?tune?操作,可以增加監(jiān)測(cè)對(duì)象或者刪除?RRD?文
????件中的某個(gè)對(duì)象,而且繪圖時(shí)也可以指定要畫的是那個(gè)對(duì)象,這點(diǎn)看個(gè)人喜歡而定。
B)[color=blue]如何統(tǒng)計(jì)取得的數(shù)據(jù)?:[/color]MRTG?是固定的,5分鐘、20分鐘、2小時(shí)、1天。RRDtool?則可以自己設(shè)置
C)[color=blue]如何保存/統(tǒng)計(jì)這些數(shù)據(jù)?:[/color]這是和?MRTG?不同的地方。MRTG?log?的建立和維護(hù)是自動(dòng)的,RRDtool?的數(shù)據(jù)存放
?????則需要自己定義。但我們可以參照?MRTG?的方式:
???
????每日統(tǒng)計(jì)圖(5分鐘平均)??:?600?個(gè),大約2天的時(shí)間
????每周統(tǒng)計(jì)圖(20分鐘平均)?:?600?個(gè),大約8天的時(shí)間
????每月統(tǒng)計(jì)圖?(2小時(shí)平均)?:?600?個(gè),50?天的時(shí)間
????每年統(tǒng)計(jì)圖?(1天平均)?:730?個(gè),?2年的時(shí)間
D?[color=blue]要以什么方式繪圖?:[/color]MRTG?只有曲線(LINE)和方塊(AREA)兩種;RRDtool?除了這兩種外,還有一種是?STACK?方式。就是在前一個(gè)曲線或者方
????塊的基礎(chǔ)上繪圖圖,而不是直接從?X?軸開始繪圖。這樣繪制出來的圖比較清晰,不會(huì)出現(xiàn)交叉的現(xiàn)象,但此時(shí)?Y?軸的值等于當(dāng)前對(duì)象的值加上前一
???個(gè)繪圖對(duì)象的值。例如前一個(gè)對(duì)象(cpu?的系統(tǒng)進(jìn)程利用率)的值是10,采用的是?AREA?方式繪圖。當(dāng)前對(duì)象(cpu?的用戶級(jí)進(jìn)程的利用率)是5,
???采用的是?STACK?方式,則“cpu的用戶級(jí)進(jìn)程利用率”對(duì)應(yīng)的Y軸刻度是10+5=15;所以如果不加說明,別人可能會(huì)誤解。
[size=4]三)實(shí)際例子[/size]
A)[color=blue]搞清楚究竟想要監(jiān)測(cè)什么對(duì)象?:[/color]監(jiān)測(cè)本地主機(jī)的網(wǎng)絡(luò)流量。包括?eth0?和?lo?接口的流量。
B)[color=blue]想要以什么方法來取得數(shù)據(jù)?:[/color]sar?也可以統(tǒng)計(jì)網(wǎng)卡接口的流量。但這里我們用?SNMP?,訪問?ifInOctets?和?ifOutOctets?。
????假設(shè)腳本名稱是?get_eth0_traffic.sh?和?get_lo_traffic.sh
C)[color=blue]每個(gè)對(duì)象的監(jiān)測(cè)時(shí)間是多長(zhǎng)時(shí)間一次?:[/color]5分鐘
D)[color=blue]是采用一個(gè)?RRD?文件還是多個(gè)?:[/color]2個(gè)?RRD?文件,一個(gè)是?eth0.rrd,一個(gè)是?lo.rrd
E)[color=bl;ue]為每個(gè)監(jiān)測(cè)對(duì)象起名?:[/color]分別是?eth0_in?,eth0_out?,lo_in?,lo_out
F)[color=blue]統(tǒng)計(jì)頻率?:[/color]5分鐘、20分鐘、2小時(shí)、1天
G)[color=blue]如何保存統(tǒng)計(jì)數(shù)據(jù)?:[/color]600個(gè)、600個(gè)、600個(gè)、730個(gè)
H)[color=blue]要以什么方式繪圖?:[/color]目前暫不考慮該問題。等到實(shí)際繪圖時(shí)再體驗(yàn)。
[color=red]注?:實(shí)際上我們可以把數(shù)據(jù)的插入、繪圖一起做到?get_eth0_traffic.sh?和?get_lo_traffic.sh?中,但目前這兩個(gè)腳本只是負(fù)責(zé)取數(shù)據(jù)并輸出而已,
???????????????到最后我們?cè)侔堰@些功能合并到一起。[/color]
[size=4]?四)下面是腳本的內(nèi)容[/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?協(xié)議取得?ififInOctets?和?ifOutOctets?的值
#?由于在?/etc/snmp.conf?中配置了?defVersion?和?defCommunity?,所以?snmpget?命令不用指定這兩個(gè)參數(shù)
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個(gè)腳本放入?crontab?中,每5分鐘執(zhí)行一次
*/5?*?*?*?*?/home/bob/get_eth0_traffic.sh
*/5?*?*?*?*?/home/bob/get_lo_traffic.sh
不過這樣會(huì)有討厭的郵件產(chǎn)生,也可以在腳本中用?while?true?循環(huán),配合?sleep?300?讓腳本一直運(yùn)行,而不是重復(fù)啟動(dòng)腳本。具體選擇那樣你自己決定。
當(dāng)所有的準(zhǔn)備工作都完成后,就可以開始考慮建庫了。
?ailms 回復(fù)于:2006-12-04 09:22:46
建立?RRD?數(shù)據(jù)庫
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內(nèi)容?:
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]
????準(zhǔn)備工作都做完了,腳本也寫完了,就可以開始建庫了。建庫實(shí)際上就是建立后綴名為?.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?部分是必須的。其他兩個(gè)參數(shù)可免。
[size=4]二)參數(shù)解釋[/size]
A)<filename>?:默認(rèn)是以?.rrd?結(jié)尾,但也以隨你設(shè)定。
B)?--step?:就是?RRDtool?“期望”?每隔多長(zhǎng)時(shí)間就收到一個(gè)值。和?MRTG?的?interval?同樣含義。默認(rèn)是5分鐘。我們的腳本也應(yīng)該是
??????????每5分鐘運(yùn)行一次。
C)?--start?:給出?RRDtool?的第一個(gè)記錄的起始時(shí)間。RRDtool?不會(huì)接受任何采樣時(shí)間小于或者等于指定時(shí)間的數(shù)據(jù)。也就是說?–-start
??????指定了數(shù)據(jù)庫最早的那個(gè)記錄是從什么時(shí)候開始的。如果?update?操作中給出的時(shí)間在?–-start?之前,則?RRDtool拒絕接受。--satrt?選項(xiàng)也是
??????
??????可選的。按照?我們?cè)谇耙黄械脑O(shè)定,則默認(rèn)是當(dāng)前時(shí)間減去?600*300秒,也就是50個(gè)小時(shí)前。?如果你想指定--start?為1天前,可以用??
?
--start?$(date?-d?'1?days?aog'?+%s)
??????注意,--start?選項(xiàng)的值必須是?timestamp?的格式。
D)?DS?:DS?用于定義?Data?Soure?。也就是用于存放腳本的結(jié)果的變量名(DSN)。
??????就是我們前面提到的?eth0_in?,eth0_out,?lo_in?,?lo_out?。DSN?從?1-19?個(gè)字符,必須是?0-9,a-z,A-Z?。
E)?DST?:DST?就是?Data?Source?Type?的意思。有?COUNTER、GUAGE、DERIVE、ABSOLUTE、COMPUTE?5種。
??????????????由于網(wǎng)卡流量屬于計(jì)數(shù)器型,所以這里應(yīng)該為?COUNTER?。
F)?RRA?:RRA?用于指定數(shù)據(jù)如何存放。我們可以把一個(gè)RRA?看成一個(gè)表,各保存不同?interval?的統(tǒng)計(jì)結(jié)果
G)PDP?:Primary?Data?Point?。正常情況下每個(gè)?interval?RRDtool?都會(huì)收到一個(gè)值;RRDtool?在收到腳本給來的值后?會(huì)計(jì)算出另外
??????一個(gè)值(例如平均值),這個(gè)?值就是?PDP?;這個(gè)值代表的一般是“xxx/秒”的含義。注意,該值不一定等于RRDtool??收到的那個(gè)值。除非是?
??????
???????GAUGE?,可以看下面的例子就知道了??????
H)?CF?:CF?就是?Consolidation?Function?的縮寫。也就是合并(統(tǒng)計(jì))功能。有?AVERAGE、MAX、MIN、LAST?四種
??????分別表示對(duì)多個(gè)PDP?進(jìn)行取平均、取最大值、取最小值、取當(dāng)前值四種類型。具體作用等到?update?操作時(shí)?再說。
I)?CDP?:Consolidation?Data?Point?。RRDtool?使用多個(gè)?PDP?合并為(計(jì)算出)一個(gè)?CDP。也就是執(zhí)行上面?的CF?操作后的結(jié)果。這個(gè)值就是存入?RRA?
??????的數(shù)據(jù),繪圖時(shí)使用的也是這些數(shù)據(jù)。
[size=4]?三)再說?DST?[/size]
????DST?的選擇是十分重要的,如果選錯(cuò)了?DST?,即使你的腳本取的數(shù)據(jù)是對(duì)的,放入?RRDtool?后也是錯(cuò)誤的,更不用提畫出來的圖是否有意義了。
????
????如何選擇?DST?看下面的描述?:
???A)COUNTER?:必須是遞增的,除非是計(jì)數(shù)器溢出(overflows)。在這種情況下,RRDtool?會(huì)自動(dòng)修改收到的值。例如網(wǎng)絡(luò)接口流量、收到的
???
????????packets?數(shù)量都屬于這一類型。
???B)DERIVE:和?COUNTER?類似。但可以是遞增,也可以遞減,或者一會(huì)增加一會(huì)兒減少。
???C)ABSOLUTE?:ABSOLUTE?比較特殊,它每次都假定前一個(gè)interval的值是0,再計(jì)算平均值。
???D)GAUGE?:GAGUE?和上面三種不同,它沒有“平均”的概念,RRDtool?收到值之后字節(jié)存入?RRA?中
???E)COMPUTE?:COMPUTE?比較特殊,它并不接受輸入,它的定義是一個(gè)表達(dá)式,能夠引用其他DS并自動(dòng)計(jì)算出某個(gè)值。例如?
???
??????? DS:eth0_bytes:COUNTER:600:0:U?DS:eth0_bits:COMPUTE:bytes,8,*?
???????則?eth0_bytes?每得到一個(gè)值,eth0_bits?會(huì)自動(dòng)計(jì)算出它的值:將?eth0_bytes?的值乘以?8?。不過?COMPUTE?型的?DS?有個(gè)限制,只能應(yīng)用
???????
???????它所在的?RRD?的?DS?,不能引用其他?RRD?的?DS。?COMPUTE?型?DS?是新版本的?RRDtool?才有的,你也可以用?CDEF?來實(shí)現(xiàn)該功能。?
????????
?????????
????F)AVERAGE?類型適合于看“平均”情況,例如一天的平均流量,。所以?AVERAGE?適用于需要知道?‘xxx/秒’?這樣的需求。但采用?AVERAGE?型時(shí),你并不知道
????????在每個(gè)?CDP?中(假設(shè)30分鐘平均,6個(gè)PDP組成)之中,流量具體是如何變化的,什么時(shí)候高,什么時(shí)候低。這于需要用到別的統(tǒng)計(jì)類型了
????G)MAXIMUM?、MINIMUM不適用想知道“xxx/秒”這樣的需求,而是適用于想知道某個(gè)對(duì)象在各個(gè)不同時(shí)刻的表現(xiàn)的需求,也就是著重點(diǎn)在于各個(gè)時(shí)間點(diǎn)。
?????????也就是所謂的“趨勢(shì)”了,還是上面的例子,如果采用?MAXIMUM?或者?MINIMUM?的?CF?,可以看出接口在每個(gè)?CDP?的周期內(nèi)最高是達(dá)到多少,最低又是多
?????????少,如果是?AVERAGE?的話,有可能前5個(gè)?PDP?都很均勻,但最后一個(gè)?PDP?的值發(fā)生很大的突變。這時(shí)候如果用?AVERAGE?可能是看不出來的,因?yàn)橥蛔兊牟?
?????????分被平均分配到整個(gè)時(shí)間段內(nèi)了,所以看不出突變這一現(xiàn)象;但如果用?MAXIMUM?就可以清楚的知道在該?CDP?的周期內(nèi),曾經(jīng)有達(dá)到某個(gè)值的時(shí)候。所以用?
????????MAXIMUM?或者?MINIMUM?就可以知道某個(gè)對(duì)象在某個(gè)時(shí)間段內(nèi)最大達(dá)到多少,最低低到什么程度。
????????例如要看某個(gè)接口在一天內(nèi)有沒有超過50Mb?流量的時(shí)候就要用?MAXIMUM
???????例如要看磁盤空間的空閑率在一天內(nèi)有沒有低于?20%?的時(shí)候就要用?MINIMUM
?????H)LAST?類型適用于?“累計(jì)”的概念,例如從xxx時(shí)候到目前共累計(jì)xxxx?這樣的需求。例如郵件數(shù)量,可以用?LAST?來表示?30?分鐘內(nèi)總共收到多少個(gè)郵件,同
?????????樣?LAST?也沒有平均的概念,也就是說不適用于?‘xxx/秒’?這樣的需求,例如你不能說平均每秒鐘多少封郵件這樣的說法;同樣也不適用于看每個(gè)周期內(nèi)的變化,
?????????例如30分鐘內(nèi)共收到100封郵件,分別是?:第一個(gè)5分鐘20封,第二個(gè)5分鐘30封,第三個(gè)5分鐘沒有,第4個(gè)5分鐘10封,第5個(gè)5分鐘也沒有,第6個(gè)5分鐘
?????????
?????????40封。如果用?MAXIMUM?或者?MINIMUM?就不知道在30分鐘內(nèi)共收到100封郵件,而是得出30和0。所以?LAST?適用于每隔一段時(shí)間被觀察?對(duì)象就會(huì)復(fù)位的
?????????
?????????情況。例如每30分鐘就收一次郵件,郵件數(shù)量就是?LAST?值,同時(shí)現(xiàn)有的新郵件數(shù)量就被清零;到下一個(gè)30分鐘再收一次郵件,又得到一個(gè)?30??分鐘的?LAST?值。
?????????
?????????這樣就可以得得出“距離上一次操作后到目前為止共xxx”的需求。(例如距離上一次收取郵件后又共收到100封新郵件)
[size=4]?四)DST?實(shí)例說明[/size]
這樣說可能還是比較模糊,可以看下面的例子,體會(huì)一下什么是?DST?和?PDP??:
引用:
Values?=?300,?600,?900,?1200????????#?假設(shè)?RRDtool?收到4個(gè)值,分別是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?,所以結(jié)果為?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,所以結(jié)果為?1,2,3,4
GAUGE?=?300,600,900,1200??????????#?300?,?600?,900?,1200?不做運(yùn)算,直接存入數(shù)據(jù)庫
所以第一行的?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?表示對(duì)1個(gè)?PDP?取平均。實(shí)際上就等于?PDP?的值
>?RRA:AVERAGE:0.5:4:600?\ #?4?表示每4個(gè)?PDP?合成為一個(gè)?CDP,也就是20分鐘。方法是對(duì)4個(gè)PDP取平均,?
>?RRA:AVERAGE:0.5:24:600?\??#?同上,但改為24個(gè),也就是24*5=120分鐘=2小時(shí)。
>?RRA:AVERAGE:0.5:288:730 #?同上,但改為288個(gè),也就是?288*5=1440分鐘=1天
[root@dns1?root]#??
?
?檢查一下結(jié)果
root@dns1?bob]#?ll?-h?eth0.rrd
-rw-r--r--????1?root?????root??????????41K?11月?19?23:16?eth0.rrd
[root@dns1?bob]#
有的人可能會(huì)問,上面有兩個(gè)?DS,那?RRA?中究竟存的是那個(gè)?DS?的數(shù)據(jù)呢?實(shí)際上,這些?RRA?是共用的,你只需建立一個(gè)?RRA,它就可以用于全部的?DS?。
所以在定義?RRA?時(shí)不需要指定是給那個(gè)?DS?用的。
[size=4]六)什么是?CF?[/size]
以第2個(gè)RRA?和?4,2,1,3?這4個(gè)?PDP?為例
AVERAGE?:則結(jié)果為?(4+2+1+3)/4=2.5
MAX?:結(jié)果為4個(gè)數(shù)中的最大值?4
MIN?:結(jié)果為4個(gè)數(shù)中的最小值1
LAST?:結(jié)果為4個(gè)數(shù)中的最后一個(gè)?3
同理,第三個(gè)RRA和第4個(gè)RRA則是每24個(gè)?PDP、每288個(gè)?PDP?合成為1個(gè)?CDP
[size=4]?七)解釋度(Resolution)[/size]
這里要提到一個(gè)?Resolution?的概念,在官方文檔中多處提到?resolution?一詞。Resolution?究竟是什么?Resolutino?有什么用?
舉個(gè)例子,如果我們要繪制1小時(shí)的數(shù)據(jù),也就是60分鐘,那么我們可以從第一個(gè)RRA?中取出12個(gè)?CDP?來繪圖;也可以從第2個(gè)?RRA
中取出2個(gè)?CDP?來繪圖。到底?RRDtool?會(huì)使用那個(gè)呢?
讓我們看一下?RRA?的定義?:RRA:AVERAGE:0.5:4:600?。
Resolution?就等于?4?*?step?=?4?*?300?=?1200?,也就是說?,resolution?是每個(gè)CDP?所代表的時(shí)間范圍,或者說?RRA?中每個(gè)?CDP(記錄)
之間的時(shí)間間隔。所以第一個(gè)?RRA?的?resolution?是?1*?step=300,第2是?1200,第三個(gè)是?24*300=7200,第4個(gè)?RRA?是?86400?。
默認(rèn)情況下,RRDtool?會(huì)自動(dòng)挑選合適的?resolution?的那個(gè)?RRA?的數(shù)據(jù)來繪圖。我們大可不必關(guān)心它。但如果自己想取特定?RRA?的數(shù)據(jù),就需要用到它了。
關(guān)于?Resolution?我們還會(huì)在?fetch?和?graph?操作中提到它。
[size=4]八)xff?字段[/size]
細(xì)心的朋友可能會(huì)發(fā)現(xiàn),在?RRA?的定義中有一個(gè)數(shù)值,固定是?0.5?,這個(gè)到底是什么東東呢?
這個(gè)稱為?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)
?
這個(gè)看起來有點(diǎn)頭暈,我們舉個(gè)簡(jiǎn)單的例子?:例如
RRA:AVERAGE:0.5:24:600?
這個(gè)?RRA?中,每24個(gè)?PDP?(共兩小時(shí))就合成為一個(gè)?CDP,如果這?24?個(gè)?PDP?中有部分值是?UNKNOWN?(原因可以很多),例如1個(gè),那么這個(gè)?CDP?
合成的結(jié)果如何呢?是否就為?UNKNOWN?呢?
不是的,這要看?xff?字段而定。Xff?字段實(shí)際就是一個(gè)比例值。0.5?表示一個(gè)?CDP?中的所有?PDP?如果超過一半的值為?UNKNOWN?,則該?CDP?的值就被標(biāo)為
UNKNOWN。也就是說,如果24個(gè)?PDP中有12個(gè)或者超過12個(gè)?PDP?的值是?UNKNOWN?,則該?CPD?就無法合成,或者合成的結(jié)果為?UNKNOWN;
如果是11個(gè)?PDP?的值為?UNKNOWN?,則該?CDP?的值等于剩下?13??個(gè)?PDP?的平均值。
如果一個(gè)?CDP?是有2個(gè)?PDP?組成,xff?為?0.5?,那么只要有一個(gè)?PDP?為?UNKNOWN?,則該?PDP?所對(duì)應(yīng)的?CDP?的值就是?UNKNOWN?了
?ailms 回復(fù)于:2006-12-04 09:23:47
RRDtool簡(jiǎn)體中文教程_5:如何獲取RRD文件的信息
獲取?RRD?文件的信息
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內(nèi)容?:
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]
???可能你已經(jīng)頗不亟待的想知道如何往?RRD?文件插入數(shù)據(jù)、如何繪圖了吧?hoho,先別急,在你做這些事情之前,最好先思考以下幾個(gè)問題?:
???A)如果給你一個(gè)?RRD?文件,你能知道它的第一次/最后一次?update?的時(shí)間是在什么時(shí)候嗎?
???B)如果你很久之前建立了一個(gè)?RRD?文件,現(xiàn)在因?yàn)楣ぷ髟蛐枰獙?duì)該?RRD?文件進(jìn)行一些修改。不過遺憾的是,
???
???????你已經(jīng)不記得得當(dāng)初設(shè)置的具體選項(xiàng)和參數(shù)了,??這時(shí)候該怎么辦呢?
???????
???這兩個(gè)問題就對(duì)應(yīng)今天要講的兩個(gè)操作?:first/last?、info?。
???
???first?就是用于查看該?RRD?文件中某個(gè)?RRA?的第一個(gè)數(shù)據(jù)是在什么時(shí)候插入的(或者說第一次更新);
???
???last?就是查看該?RRD?文件的最近一次更新;
???
???info就是查看?rrd?文件的結(jié)構(gòu)信息。
???
???下面就以實(shí)際例子來看一下該怎么用這三個(gè)命令?:
???
???
[size=4]二)如何查詢一個(gè)?RRD?文件的結(jié)構(gòu)信息[/size]
???
????
[root@dns1?bob]#?rrdtool?info?eth0.rrd (由于輸出信息較多,截取了一部分)
filename?=?"eth0.rrd"
rrd_version?=?"0003"
step?=?300 #?RRDtool?希望每5分鐘收到一個(gè)數(shù)據(jù)
last_update?=?1163862985 #?這是最近一次更新的?timestamp?。可以用?date?轉(zhuǎn)換為具體的時(shí)間
ds[eth0_in].type?=?"COUNTER" #?有一個(gè)名為?eth0_in?的?DS,DST是?COUNTER
ds[eth0_in].minimal_heartbeat?=?600 #?hearbeat?時(shí)間是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" #?第一個(gè)?RRA?的編號(hào)是0,不是1。
rra[0].rows?=?600 #?共保存?600?個(gè)記錄
rra[0].pdp_per_row?=?1 #?每個(gè)?CDP?由一個(gè)?PDP?統(tǒng)計(jì)得出
rra[0].xff?=?5.0000000000e-01 #?只要當(dāng)前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" #?第二個(gè)?RRA?的編號(hào)是?1。同樣也是?AVERAGE?型。
rra[1].rows?=?600 #?也是保存?600?個(gè)記錄
rra[1].pdp_per_row?=?4 #?每個(gè)?CDP?由4個(gè)?PDP?的求平均值得出
rra[1].xff?=?5.0000000000e-01 #?每個(gè)?CDP?最多允許2個(gè)?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]由于信息太長(zhǎng),這里截取了后面2個(gè)?RRA?的信息。[/color]
[size=4]三)第一次更新/最近一次更新[/size]
如果想知道最近一次更新發(fā)生在什么時(shí)候,除了可以用上面的?info?操作,還可以用?last?操作
[root@dns1?bob]#?rrdtool?last?eth0.rrd
1163862985
[root@dns1?bob]#
如果轉(zhuǎn)換成具體的時(shí)間就是?:
[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]#
如果換成具體的時(shí)間就是?:
[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]#
這三個(gè)命令的語法都非常簡(jiǎn)單,但并不可以因此小看它們的功能,尤其是?info?操作。日后如果需要對(duì)?RRD?文件進(jìn)行調(diào)整,是經(jīng)常需要用到的。
?ailms 回復(fù)于:2006-12-04 09:24:20
更新?RRD?文件
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內(nèi)容?:
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?協(xié)議直接訪問?SNMP?對(duì)象,你只需要在?cfg?文件中的?Target?指定?OID?,MRTG?就可以自動(dòng)替你取回?cái)?shù)據(jù)。
???
???????例如Target[as1_eth0]:?2:n7css@172.17.64.11:::::1?,表示使用?SNMP?v1?協(xié)議訪問?172.17.64.11?主機(jī)上?index?為?2?的那個(gè)接口,
???
???????默認(rèn)是取?ifInOctets?和?ifOutOctets?這兩個(gè)對(duì)象的值。RRDtool?則沒有這個(gè)功能,只能你自己寫腳本取數(shù)據(jù)。
???????
B)MRTG?只支持?COUNTER?和?GAUGE?類型的?Target?;RRDtool?則還可以使用?DERIVE、ABSOLUTE、COMPUTE
??
C)由于上面的原因,MRTG?無法識(shí)別小數(shù),負(fù)數(shù)。例如你給?MRTG?一個(gè)?-1?的值,它會(huì)解釋為?1?;這點(diǎn)可以通過?LOG?看出來。
??
???????小數(shù)也不行。例如?.72?(bc?的輸出)會(huì)被識(shí)別為?72?,而不是?0.72。
???????
D)MRTG?每次?update?每次運(yùn)行只更新一次,或者說只插入一行記錄。但?RRDtool?可以在一個(gè)?updat操作中插入多個(gè)記錄。
E)MRTG?一次要求2個(gè)值,RRDtool?則沒有該方面的限制。
F)最大的一個(gè)區(qū)別是,?MRTG?在收到一個(gè)值后會(huì)自動(dòng)得出?timestamp?,并記錄在?log?的第一個(gè)字段;而?RRDtool?是需要你給出一個(gè)?timestamp?,
??
???????表示該數(shù)據(jù)是什么時(shí)間采集的。
???
[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?的意思,會(huì)被?RRDtool?替換為當(dāng)前的?timestamp?,也就是?date?+%s?的結(jié)果。Timestamp?部分比較靈活,可以是數(shù)字形式,也可以是
AT-風(fēng)格的時(shí)間(參考?at?命令的?manual),有點(diǎn)類似于自然語言的風(fēng)格。
[size=4]三)手工方式?update?數(shù)據(jù)庫[/size]
我們先學(xué)習(xí)一下如何手工?update?數(shù)據(jù)庫。Update?命令分成兩部分?:
A)時(shí)間戳?(timestamp):表示該數(shù)據(jù)是在那個(gè)時(shí)間點(diǎn)采集的。Timestamp?的格式可以非常靈活?:
數(shù)字形式?:例如1164419418?,表示?“六?11月?25?09:50:18?CST?2006”。通常用于手工插入的方式。
快捷方式?:N?。字母N?表示當(dāng)前時(shí)間(Now)。如果是通過?crontab?的方式來運(yùn)行?update?操作,這是最實(shí)用的方式。
AT-風(fēng)格?:所謂的?AT?風(fēng)格的時(shí)間,可以參考?at?命令的?manual。例如?now、yesterday、now-1hour、now+5min?都是?AT風(fēng)格的時(shí)間。
?
??? ????????????????????要注意的是,如果使用?AT風(fēng)格的時(shí)間,則時(shí)間和第一個(gè)value之間使用?@?分隔,而不是?“:”
B)數(shù)值部分?:一個(gè)?RRD?文件可以有多個(gè)?DS?,所以一次?update?可以給出多個(gè)?value?。多個(gè)?value?之間用?“:”?分隔。不過是不是所有的?DS?都必須
?????給出值呢?不一定。有時(shí)候你只想給出一部分?DS?的值,甚至有時(shí)候某些類型的?DS?是不允許賦值的,例如?COMPUTE?型的?DS?就是這樣一個(gè)例子。
?????
[size=4]四)實(shí)際操作[/size]
實(shí)例一?:一個(gè)錯(cuò)誤的例子
[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]#
咦?為什么出錯(cuò)了呢?是語法錯(cuò)誤嗎?不是的,RRDtool?提示最近一次更新是在1163862985?這個(gè)時(shí)候。也就是說,update?給出的時(shí)間戳必須大于該值。
不能等于或者小于該時(shí)刻。因?yàn)閿?shù)據(jù)一旦插入到?RRA?中,就不允許再次修改。所以?update?會(huì)檢查給出的時(shí)間戳是否大于最后一次更新的時(shí)間戳,如果不是
則報(bào)錯(cuò),不予執(zhí)行。那如何才能知道最近一次更新的時(shí)間戳呢?還記得前一篇“如何獲取RRD文件的信息”中介紹的?last?和?info?命令嗎?對(duì)了!就是它們。
執(zhí)行一下看看是什么結(jié)果??
[root@dns1?bob]#?rrdtool?last?eth0.rrd
1163862985
[root@dns1?bob]#
last?操作顯示的時(shí)間戳和上面的報(bào)錯(cuò)信息給出的值一樣。這個(gè)時(shí)間是
[root@dns1?bob]#?date?-d?'1970-01-01?1163862985?sec?utc'
六?11月?18?23:16:25?CST?2006
[root@dns1?bob]#
總之如果要?update?數(shù)據(jù)庫,則?update?操作給出的時(shí)間戳必須晚于最后一次?update?的時(shí)間。
實(shí)例二?:還是一個(gè)錯(cuò)誤的例子
我們挑?23:16的下一個(gè)5分鐘23:20作為時(shí)間戳吧。
[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]#
還是不行?!!
仔細(xì)看錯(cuò)誤信息,原來是我們給少了一個(gè)值。還記得?info?命令嗎?這會(huì)兒它派上用場(chǎng)了。
[root@dns1?bob]#?rrdtool?info?eth0.rrd
filename?=?"eth0.rrd"
…..(省略)
last_update?=?1163862985
ds[eth0_in].type?=?"COUNTER"
ds[eth0_out].type?=?"COUNTER"
原來是2個(gè)?DS?,怪不得?RRDtool?會(huì)報(bào)錯(cuò)了
實(shí)例三?:這次應(yīng)該成功了吧?
[root@dns1?bob]#?rrdtool?update?eth0.rrd?1163863200:1:2
[root@dns1?bob]#
這會(huì)倒是沒有錯(cuò)誤信息,那究竟數(shù)據(jù)是否別插入到?RRA?中了呢?
對(duì)于該問題,有兩個(gè)方法,一個(gè)是通過?fetch?操作,從?RRA?中提取數(shù)據(jù);但這個(gè)我們下一篇再講。
還有一種方法就是用?updatev?操作來代替?update?。updatev?的?v?表示?verbose?的意思,現(xiàn)在就來看?updatev?的作用?:
?
實(shí)例四?:updatev?的好處?
我們執(zhí)行多個(gè)?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,這個(gè)?return?value?你可以理解為?shell?編程中的?exit?status?。updatev用?0?表示成功,-1?表示失敗。
不過我們插入的值明明是?3300?和?4600?,為什么出來的結(jié)果是?1和2?呢?
這是因?yàn)?eth0_in?和?eth0_out?都是?COUNTER?型的?DS,所以?RRDtool?在收到?3300?和?4600?后,會(huì)作一個(gè)運(yùn)算,就是
(3300-3000)/?step?(300)=?1,(4600-4000)/step(300)=2?,這就是?1和?2?這兩個(gè)值的來源了。還記得前面提到的?PDP?嗎?
這兩個(gè)值?(1?和2)就是?PDP?了,而不是?3300?和?4600??。這點(diǎn)要搞清楚。
實(shí)例五?:另外一個(gè)?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?這個(gè)時(shí)刻我們給出的值和上次一樣,所以?eth0_in?和?eth0_out?的?PDP?都為?0
搞清楚了?PDP?的概念,現(xiàn)在我們來看什么是?CDP?,以及?CDP?是如何計(jì)算的
實(shí)例六?:通過?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?操作影響到幾個(gè)?RRA?,看到?[]?中的?1,4,24?了嗎?它們就是代表不同的?RRA?中每個(gè)?CDP?所包含的?PDP?數(shù)量。
1?就是?1個(gè)?CDP?包含1?個(gè)?PDP,4?就是?一個(gè)?CDP?包含4個(gè)?PDP(20分鐘)、24?就是?一個(gè)?CDP?包含24個(gè)?PDP(2小時(shí))。
不過為什么沒有?288?呢?eth0.rrd?的第4個(gè)?RRA?不是規(guī)定每288個(gè)?PDP?合并為一個(gè)?CDP?嗎?
因?yàn)檫@個(gè)時(shí)候還輪不到它出場(chǎng)。1163865600?/?7200?=?161648?,?也就是說剛好1163865600?是在?7200?的某個(gè)周期上(161648)。
但1163865600?/?86400?≈?13470.66?,說明1163865600?還不到?86400?的周期。
必須等到13471*?86400=1163894400?才會(huì)出現(xiàn)?[288]?的?CDP,那這個(gè)時(shí)間戳代表的時(shí)間是什么時(shí)候呢?看下面的?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天的時(shí)間了嗎?你可能會(huì)覺得很奇怪,為什么不是00:00?而是?08:00呢?
還記得create?操作的語法嗎?其中有一個(gè)?–-start?參數(shù)嗎?不記得了?沒關(guān)系,那就得用?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點(diǎn)正,距離?2006-11-19?剛好是2年,也就是?730?天,因?yàn)?eth0.rrd?的第4個(gè)RRA?
只保存730個(gè)記錄。每個(gè)記錄時(shí)間上相差1天。也就是第一個(gè)記錄是?2004/11/19?8:00?,第二個(gè)記錄是?2004/11/20?8:00?,
第三個(gè)記錄代表?2004/11/21?8:00?,依次類推。所以離1163865600?最近的下一個(gè)記錄是發(fā)生在?2006/11/19?8:00?。
所以嚴(yán)格意義上來說,RRDtool?中的一天并不一定是從?0:00?開始的,但可以保證的就是兩個(gè)記錄之間肯定相差86400秒(1天)。
[size=4]四)自動(dòng)更新數(shù)據(jù)庫[/size]
其實(shí)這些都只不過是手工?update?時(shí)需要注意的一些地方,如果是自動(dòng)更新數(shù)據(jù)庫,時(shí)間戳方面就交給?RRDtool?去處理吧,我們不用操心了。
前面我們已經(jīng)寫好了一個(gè)腳本,現(xiàn)在就用它來更新
[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?協(xié)議取得?ififInOctets?和?ifOutOctets?的值
#?由于在?/etc/snmp.conf?中配置了?defVersion?和?defCommunity?,所以?snmpget?命令不用指定這兩個(gè)參數(shù)
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}
#?需要我要用這些數(shù)據(jù)來更新?eth0.rrd?,注意?update?時(shí)的?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]
有了數(shù)據(jù),下面該學(xué)什么了呢?是繪圖嗎?
不是!^_^!!?(估計(jì)有人快瘋了吧)
在繪圖之前,你有沒有想過?RRDtool?在繪圖時(shí)如何取數(shù)據(jù)的呢?
例如我想畫2小時(shí)內(nèi)的數(shù)據(jù),那么我們有4個(gè)?RRA?,其?resolution?分別是?300,1200,7200,86400?
(還記得什么是?resolution?嗎?就是每個(gè)?RRA?中兩個(gè)?CDP?相隔的時(shí)間)。是從第一個(gè)?RRA?取出?7200/300=24?個(gè)記錄,
還是從第二個(gè)?RRA?取出?7200/1200=6?個(gè)記錄呢?或者是從第三個(gè)?RRA?中取出1個(gè)記錄就可以呢?
這些問題我們就留待下一篇再學(xué)習(xí)吧。這里給大家留幾個(gè)問題?:
[color=red]
引用:
A) 如果?eth0.rrd?在5分鐘內(nèi)收到不止1個(gè)更新,結(jié)果會(huì)怎樣?提示:用?updatev?就可以看出來了
B) 如果過了?eth0.rrd?在5分鐘內(nèi)沒有收到腳本返回的值,是否立即就用?UNKNOWN?作為?PDP?的值?
C) 參考上面的例子,搞清楚?heartbeat?的含義
D) 在搞清楚?heartbeat?后,再想一下?heartbeat?和?step?之間的關(guān)系。
?????
[/color]
?ailms 回復(fù)于:2006-12-04 09:25:08
從?RRD?文件中提取數(shù)據(jù)
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內(nèi)容?:
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?的意思,那么是否可以象普通的數(shù)據(jù)庫進(jìn)行查詢操作呢?
答案是可以的。fetch?就是用來做這種事情的工具。當(dāng)然?fetch?不能和?select?語句相比,它只是根據(jù)用戶指定的時(shí)間,
從合適的?RRA?中取出數(shù)據(jù),并加以格式化。不過和?MRTG?相比,已經(jīng)好很多了,至少你不用取看該死的?log?文件。
實(shí)際上,fetch?操作其實(shí)可以不學(xué),因?yàn)?RRDtool?會(huì)自動(dòng)幫你選好數(shù)據(jù)。但你如何確定?RRDtool?取的數(shù)據(jù)就是你想要的呢?
或者說你如何證明?RRDtool?繪制出來的圖是正確的呢?
廢話少說,下面開始正文
[size=4]二)fetch?操作的語法[/size]
rrdtool?fetch?filename?CF?[--resolution|-r?resolution]?[--start|-s?start]?[--end|-e?end]
其中?--start、--end、-r?都是可選的?。RRDtool?默認(rèn)的?--end?是?now?,--start?是?end-1day?,也就是1天前。
CF?可以是?AVERAGE、MAX、MIN、LAST?,當(dāng)然必須建庫時(shí)有該?CF?類型的?RRA?才可以查,否則會(huì)報(bào)錯(cuò)。
[size=4]三)fetch?如何取數(shù)據(jù)[/size]
在確定了時(shí)間范圍后,RRDtool?會(huì)從多個(gè)?RRA?中挑選最佳的那個(gè)?RRA?的數(shù)據(jù)。至于什么是“最佳”,則從兩個(gè)方面考慮?:
A)[color=blue]第一是該?RRA?的數(shù)據(jù)要盡可能的覆蓋所請(qǐng)求的時(shí)間范圍。[/color]如何計(jì)算一個(gè)?RRA?的覆蓋時(shí)間呢?以?eth0.rrd?的第一個(gè)RRA?為例,
?????有?600?個(gè)記錄,每個(gè)記錄相隔300秒,則總的時(shí)間覆蓋范圍是180000?秒≈2天,所以如果?–-start?和?-–end?規(guī)定的時(shí)間范圍
?????
?????大于2天,則?RRDtool?不會(huì)從該?RRA?中取數(shù)據(jù)。
B)[color=blue]第二是?resolution?的要求。[/color]還是上面的例子,如果是要畫3天的數(shù)據(jù),從時(shí)間覆蓋范圍上來講,第2、3、4?個(gè)?RRA?都符合要求。
?????那究竟挑選那個(gè)?RRA?的數(shù)據(jù)呢?如果?fetch?中有指定?–r?選項(xiàng),則挑選?resolution?等于?–r?指定的值那個(gè)?RRA?的數(shù)據(jù)。如果沒有?
?????
?????–r?選項(xiàng),則從第一個(gè)合適的?RRA?中取數(shù)據(jù)。
C)fetch?如果不加?–-start、--end、-r?,則默認(rèn)輸出?resolution?最小的那個(gè)?RRA?的數(shù)據(jù)。就像下面的例子1一樣。
?[size=4]四)實(shí)際例子[/size]
實(shí)例一?:默認(rèn)情況
[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 (當(dāng)前時(shí)間)
日?11月?26?23:11:12?CST?2006
[root@dns1?bob]#?date?-d?'1970-1-1?1164554100?sec?utc' (最后一個(gè)記錄的時(shí)間)
日?11月?26?23:15:00?CST?2006
[root@dns1?bob]#
[root@dns1?bob]#?date?-d?'1970-1-1?1164467700?sec?utc' (第一個(gè)記錄的時(shí)間)
六?11月?25?23:15:00?CST?2006
[root@dns1?bob]#
fetch?輸出的第一列是?timestamp?,表示后面的數(shù)據(jù)是在什么時(shí)間收到的。”:”?后面就是DS的值。fetch?不能指定只取那個(gè)?DS?的數(shù)據(jù),
只能一次性取出全部?DS?的值。可以看到,eth0.rrd?有兩個(gè)?DS?:eth0_in?和?eth0_out?,每個(gè)?DS?的值用?空格進(jìn)行分隔,一律采用科學(xué)記數(shù)法的格式。
如果?fetch?不指定?–-start?和?-–end?,則默認(rèn)取從當(dāng)前時(shí)刻算起,往前1天的數(shù)據(jù)(289個(gè)記錄)。因?yàn)楝F(xiàn)在是?23:11?,還不到?23:15,所以最后一個(gè)記
錄的值是?NaN?(Not?a?Number),也就是?UNKNOWN?的意思。可以看到,兩個(gè)記錄之間的時(shí)間間隔是300。
?
?實(shí)例二:使用?--start?和?--end?指定時(shí)間范圍
[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]#
可以看到第一個(gè)記錄和最后一個(gè)記錄都比?–-start??和?–-end?晚了300秒。
實(shí)例三?:使用?AT風(fēng)格的時(shí)間
?
[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風(fēng)格的時(shí)間。end?就是?--end?中給出的1164553800?。具體的時(shí)間范圍是表示起始時(shí)間從1164553800?往前1天?。
可以看到,現(xiàn)在第一個(gè)記錄和實(shí)例二相比,提前了300秒。和例2中的?–start?一致了。所以能夠用?AT風(fēng)格的時(shí)間的時(shí)候還是用?AT?風(fēng)格的時(shí)間比較方便。
可以省去計(jì)算的麻煩,別人也比較容易看。
實(shí)例四?:提取指定?resolution?的數(shù)據(jù)
[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]
可以看到,現(xiàn)在記錄兩兩之間的時(shí)間間隔變成了1200?了。輸出的行數(shù)為?(86400/1200)+1=73?(72+1)。
實(shí)例五:如果指定一個(gè)不存在的?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?,但并沒有那個(gè)?RRA?的?resolution?為?1000,所以?RRDtool?挑選了第一個(gè)合適的?resolution?,
也就是?1200?的那個(gè)?RRA?的數(shù)據(jù)作為結(jié)果輸出。注意,RRDtool?只會(huì)挑選?resolution?比?–r?指定的值相等或者更高的?RRA?,不會(huì)挑
選比?–r?指定的值小的?RRA?。例如在該例子中,RRDtool?就不會(huì)挑選?resolution=300?的第一個(gè)?RRA?。為什么呢?
各位可以自己根據(jù)第三部分“fetch?如何提取數(shù)據(jù)”的兩個(gè)準(zhǔn)則考慮一下
實(shí)例六?:再來看一個(gè)?–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]#
咦?為什么還是使用記錄的時(shí)間間隔還是?300?秒呢?我們不是指定了?–r?1200?嗎?
老實(shí)說,這種方法?90%?以上的機(jī)率是不會(huì)成功嗎?那應(yīng)該怎么辦呢?
實(shí)例七?:正確使用?–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]#
現(xiàn)在?resolution?已經(jīng)變成?1200?的了。同理,如果想看?7200,86400?resolution的?RRA,只要把?end?部分的?(?)中的數(shù)字替換為相應(yīng)的值就可以了。
[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))
?
實(shí)例八?:關(guān)于?fetch?提取數(shù)據(jù)準(zhǔn)則1的測(cè)試
[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]#
和第一個(gè)例子不同,這次的?resolution?是?1200?了?為什么呢?因?yàn)槲覀冎付ǖ臅r(shí)間范圍是3天,而第一個(gè)?RRA只保存2天的數(shù)據(jù)多一點(diǎn),所以?RRDtool?不會(huì)從
該?RRA?取數(shù)據(jù),那么會(huì)從那個(gè)?RRA?取數(shù)據(jù)呢?由于我們沒有指定?–r?選項(xiàng),所以?RRDtool?選擇1200?的那個(gè)?RRA?
實(shí)例九?:關(guān)于?fetch?提取數(shù)據(jù)準(zhǔn)則2的測(cè)試
[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]#
現(xiàn)在?resolution?不再是?1200?,而是指定的?7200?了。
因?yàn)殡m然?resolution=1200?的?RRA?就可以滿足?--start?和?--end?的需求,
但因?yàn)?-r?指定?resolution=7200?,所以從第3個(gè)?RRA?中取數(shù)據(jù)
[size=4]五)總結(jié)[/size]
從上面我們可以看出,fetch?實(shí)際上是非常復(fù)雜的一個(gè)命令,如果想要輸出你所要的數(shù)據(jù),就必須考慮好幾個(gè)因素?:
A)[color=blue]第一是具體想輸出的時(shí)間范圍?[/color]
B)[color=blue]第二是計(jì)算好?–-start?和?–end。建議至少給出一個(gè),最好2個(gè)都給出[/color]
C)[color=blue]第三是如果有多個(gè)RRA符合條件,則使用?–r?指定具體的?resolution[/color]
?ailms 回復(fù)于:2006-12-04 09:25:49
使用RRDtool?進(jìn)行繪圖(一)
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內(nèi)容?:
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?我們最關(guān)心什么?當(dāng)然是如何把數(shù)據(jù)畫出來了。雖然前面談了很多,但這些都是基礎(chǔ)來的。掌握好了,可以讓你在繪圖時(shí)更加得心應(yīng)手。
本來還有?RPN?(反向波蘭表達(dá)式)一節(jié)的,但考慮一下,覺得還是放到后面,先從基本的繪圖講起。
這一節(jié)的內(nèi)容雖然很多,但基本都是實(shí)驗(yàn)性的內(nèi)容,只要多試幾次就可以了。
[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?就是你想要生成的圖片文件的名稱,默認(rèn)是?png?。你可以通過選項(xiàng)修改圖片的類型,可以有?PNG、SVG、EPS、PDF四種。
A)DEF?是?Definition?(定義)的意思。定義什么呢?你要繪圖,總要有數(shù)據(jù)源吧?DEF?就是告訴?RRDtool?從那個(gè)?RRD?中取出指定
????DS(eth0_in、eth0_out)的某個(gè)類型的統(tǒng)計(jì)值(還可以指定?resolution、start、end),并把這一切放入到一個(gè)變量?<vname>中?。
????
????你可能會(huì)感到奇怪,為什么還有一個(gè)?CF?字段?因?yàn)?RRA?有多種??CF?類型,有些?RRA?可能用來保存平均值、有些?RRA?可能用于統(tǒng)計(jì)最大值、
????
????最小值等等。所以你必須同時(shí)指定使用什么?CF?類型的?RRA的數(shù)據(jù)。至于?:start?和?:end?、:reduce?則用得比較少,最常用的就是?:step?了,
????
????它可以讓你控制?RRDtool?從那個(gè)?RRA?中取數(shù)據(jù)。
B)VDEF?是?Variable?Definition?(變量定義)的意思。定義什么呢?記得?MRTG?在圖表的下面有一個(gè)稱之為?Legend?的部分嗎?
????那里顯示了1個(gè)或者2個(gè)?DS?(MRTG?沒有?DS?一說,這里是借用?RRDtool?的)的?“最大值”、“平均值”、“當(dāng)前值”。這些值是如何
????
????計(jì)算的呢?
????
????RRDtool?中用?VDEF?來定義。這個(gè)變量專門存放某個(gè)?DS?某種類型的值,例如?eth0_in?的最大值、eht0_out?的當(dāng)前值等。當(dāng)你需要象
????
?????MRTG??一樣輸出數(shù)字報(bào)表(Legend)?時(shí),就可以在?GPRINT?子句(sub?clause)中調(diào)用它。
???
???同樣它也需要用一個(gè)變量來存放數(shù)值。要注意的是,舊版?的?RRDtool?中是用另外一種格式來達(dá)到相同的目的。新版的?RRDtool?則推薦使用
???
????VDEF???語句。但在使用過程中,卻發(fā)現(xiàn)?VDEF?的使用反而造成了困擾。?例如你有5個(gè)?DS?要畫,每個(gè)?DS?你都想輸出最大值、最小值、平均值
????
????、當(dāng)前值。??如果使用?VDEF?,則需要?4?*?5?=?20?個(gè)?VDEF?語句,這會(huì)造成極大的困擾。具體例子可以看第十一節(jié)“數(shù)字報(bào)表”部分。
???
C)CDEF?是?Calculation?Define?的意思。使用過MRTG?的都會(huì)體會(huì)到一點(diǎn),MRTG?的計(jì)算能力實(shí)在太差了。例如你有兩個(gè)?Target?,
??????一個(gè)是?eth0_in?,?一個(gè)是?eth0_out,如果要把它們相加起來,再除以8,得出?bytes?為單位的值,如何計(jì)算呢?或者說你只想看
??????
??????eth0_in?中超過?10Mb/s?的那部分,?其余的不關(guān)心,又如何實(shí)現(xiàn)呢?因?yàn)?MRTG?不能對(duì)它從?log?取出來的數(shù)據(jù)進(jìn)行修改,只能原
??????
??????原本本的表現(xiàn),所以很難滿足我們的要求。而使用?CDEF?,?這一切都可以很容易的實(shí)現(xiàn)。CDEF?支持很多數(shù)學(xué)運(yùn)算,甚至還支持簡(jiǎn)
??????
??????單的邏輯運(yùn)算?if-then-else?,可以解決前面提到的第2個(gè)問題:如何只繪制你所關(guān)?心的數(shù)據(jù)。不過這一切都需要熟悉?RPN?的語法,
??????
??????所以我們放到下一節(jié)介紹,這一節(jié)就介紹如何把?RRDtool?中的數(shù)據(jù)以圖表的方式顯示出來。
??????
??????
[size=4]三)選項(xiàng)分類[/size]
本部分我們按照官方文檔的方式,把選項(xiàng)分成幾大類,分為??:
A)Time?range?:?用于控制圖表的X軸顯示的起始/結(jié)束時(shí)間,也包括從RRA中提取指定時(shí)間的數(shù)據(jù)。
B)Labels?:用于控制?X/Y?軸的說明文字。
C)Size?:用于控制圖片的大小。
D)Limits?:用于控制?Y?軸的上下限。
E)Grid?:用于控制?X/Y?軸的刻度如何顯示。
F)Miscellaneous?:其他選項(xiàng)。例如顯示中文、水印效果等等。
G)Report?:數(shù)字報(bào)表
需要說明的是,本篇當(dāng)中并不是列出了所有選項(xiàng)的用法,只是列出較為常用的選項(xiàng),如果想查看所有選項(xiàng)的的用法,可以到官方站點(diǎn)下載文檔,
這里就不一一列出了,望各位見諒。
[size=4]四)時(shí)間范圍控制(Time?Range)[/size]
[-s|--start?time]?[-e|--end?time]?[-S|--step?seconds]
既然要繪圖,就應(yīng)該有一個(gè)起始/結(jié)束的時(shí)間。Graph?操作中有?–s?,-e?選項(xiàng)。這兩個(gè)選項(xiàng)即可以用于控制圖表的?X?軸顯示的時(shí)間范圍,也可以用
于控制?RRDtool?從?RRA?中提取對(duì)應(yīng)時(shí)間的數(shù)據(jù)。如果沒有指定?–-end?,默認(rèn)為?now;如果沒有指定?–-start,則默認(rèn)為1天前。如果兩者都沒有
指定,則圖表默認(rèn)顯示從當(dāng)前算起1天內(nèi)的。數(shù)
回頭看一下?DEF?中,也有?:start?,:end?,?:step?,這些和?–-start、--end、--step?之間有什么關(guān)系呢?
讓我們先看?:step?和?–step之間的關(guān)系是如何的。
下面以?eth0.rrrd?為例,假設(shè)要繪制的時(shí)間范圍?range?等于?end?-start[
A)如果?0?<??ragne?<?180000?(第一個(gè)?RRA?的時(shí)間覆蓋范圍)?,則默認(rèn)從第1個(gè)RRA中取數(shù)據(jù)?:
?????如果?DEF?中給出的?:step?>?300?,例如?1000?,則從?resolution=?1000?的或者第一個(gè)高于?1000?的RRA?中挑選數(shù)據(jù),由于?eth0.rrd?中沒有
????
?????????????????????????????????????????????????????resolution?=?1000?的?RRA,則?RRDtool?會(huì)從?resolution?=?1200?的第2?RRA?中取數(shù)據(jù)。
?????如果?DEF?中給出的?:step?<=?300?,例如?200?,則?RRDtool?會(huì)忽略該設(shè)定,還是從第一個(gè)?RRA?中取數(shù)據(jù)。
B)如果?180000?<?range?<?720000??,由于第一個(gè)RRA只能保存2天的數(shù)據(jù),所以默認(rèn)從第2個(gè)RRA中取數(shù)據(jù)?:
?????如果?DEF?中給出的?:step?>?1200?,例如?1800,則?RRDtool?會(huì)從?resolution?=?7200?的第3?RRA?中取數(shù)據(jù)
?????如果?DEF?中給出?:step<=?1200,例如?300?,則?RRDtool?會(huì)忽略,還是從第2個(gè)?RRA?中取數(shù)據(jù)
C)如果?720000?<?range?<??4320000?,則默認(rèn)從第三個(gè)?RRA?中取數(shù)據(jù)?:
?????如果?DEF?中給出的?:step?>?7200?,例如?10000?,則從第4個(gè)?RRA中取數(shù)據(jù)
?????如果?DEF?中給出的?:step?<=?7200?,?例如?1200?,則忽略該值,并還是從第3?個(gè)?RRA?中取數(shù)據(jù)
D)如果?4320000?<?range?<?63072000?,則默認(rèn)從第4個(gè)?RRA?中取數(shù)據(jù)?:
?????如果?DEF?中給出的?:step?>?86400?,則行為未知
?????如果?DEF?中給出的?:step?<=86400?,則從第4個(gè)?RRA?中取數(shù)據(jù)
E)-S?選項(xiàng)可以直接控制?RRDtool?如何挑選?RRA?。
????例如?-S?1200?,即使DEF?中不加?:setp?,則?RRDtool?會(huì)從第2個(gè)?RRA?中取數(shù)據(jù),即使?rang?<?180000?
????如果?-S?和?:step?同時(shí)出現(xiàn),則?:step?優(yōu)先。
F)DEF?中的?:start?和?:end?可以覆蓋?–-start?和?–-end?的值。
?????默認(rèn)情況下,如果?DEF?中不加?:start?和?:end?,則等于?–-start?和?–end
????如果?DEF?中定義了?:start?和?:end?,則以?:start?和?:end?為準(zhǔn)。
實(shí)例1?:使用?–-start?指定?X?軸的起始時(shí)間
[root@dns1?bob]#?rrdtool?graph?1.png?\
>?--start?now-120000?\ #?表示起始時(shí)間是當(dāng)前時(shí)間往前?120000?秒,也就是?33?個(gè)小時(shí)左右
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE?\ ?#?從eth0.rrd?中取出?eth0_in?的數(shù)據(jù),CF?類型為?AVERAGE
>?AREA:value1#ff0000 #?用“方塊”的形式來繪制?value1?,注意這里是用?value1?,不是用?eth0_in
481x154 #?如果?RRDtool?有繪圖方面的語句,則這里顯示圖片大小,否則為?0x0。
[root@dns1?bob]#
可以看到?X?軸的文字有些是亂碼,不過不要緊,你可以臨時(shí)已用?env?LANG=C?rrdtool?xxxx?來解決該問題,或者在后面用
?–n?來設(shè)定?RRDtool?使用中文字體,就不會(huì)出現(xiàn)這樣的情況了
實(shí)例2?:使用?:step?從第2個(gè)RRA中取數(shù)據(jù)
[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?會(huì)取?:step=1200?的?第2個(gè)?RRA?的數(shù)據(jù)來繪圖,可以和上面的?1.png?比較,發(fā)現(xiàn)比較平滑。
實(shí)例3?:使用?–S?從第2個(gè)RRA中取數(shù)據(jù)
[root@dns1?bob]#?rrdtool?graph?4.png?
>?-S?1200?\ #?使用?–S?控制?RRDtool?從?resolution=1200?的?RRA?中取數(shù)據(jù)
>?--start?now-120000?\
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
>?AREA:value1#ff0000????????
481x154
[root@dns1?bob]#?
?
?
可以看到和上面的圖一樣,說明?RRDtool?的確按照?-S?的設(shè)置從第2個(gè)RRA?中取數(shù)據(jù)了
使用?–S?可以對(duì)?DEF?中所有的?DS?都使用相同的?resolution,等于在每個(gè)?DEF后都加上?:step=<value>?,value?是?–S?的值
實(shí)例4?:同時(shí)使用?–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?起作用了
實(shí)例5?:使用?:start?和?:end?只顯示指定時(shí)間內(nèi)的數(shù)據(jù)
[root@dns1?bob]#?rrdtool?graph?1.png?\
>?--start?now-1h?\ #?X?軸顯示1個(gè)小時(shí)的長(zhǎng)度
>?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?,則效果如下?:
?
?
我們甚至可以讓兩個(gè)對(duì)象顯示不同的時(shí)間,例如?
實(shí)例6?:讓兩個(gè)對(duì)象顯示不同時(shí)間段的數(shù)據(jù)
[root@dns1?bob]#?rrdtool?graph?1.png?\
>?--start?now-2h?\ #?規(guī)定時(shí)間為2小時(shí)內(nèi)
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE:end=now:start=end-1h?\ #?規(guī)定時(shí)間為1小時(shí)內(nèi)
>?DEF:value2=eth0.rrd:eth0_out:AVERAGE?\ #?沒有指定?:start?和?:end,默認(rèn)和?–-start?一樣也是2小時(shí)
>?AREA:value1#00ff00:in?\
>?LINE2:value2#ff0000:out:STACK?
475x168
[root@dns1?bob]#
實(shí)例7?:把一段時(shí)間分為幾段分別顯示?:
[root@dns1?bob]#?rrdtool?graph?1.png?\
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE:end=now:start=end-1h?\ #?當(dāng)前1小時(shí)內(nèi)
>?DEF:value2=eth0.rrd:eth0_in:AVERAGE:end=now-1h:start=now-2h?\ #?2小時(shí)前
>?DEF:value3=eth0.rrd:eth0_in:AVERAGE:end=now-2h:start=now-3h?\ #?3小時(shí)前
>?LINE1:value1#00ff00:"1?hours?ago"?\
>?LINE2:value2#ff0000:"2?hours?ago"?\
>?LINE3:value3#000000:"3?hours?ago"??
475x168
[root@dns1?bob]
我們把3個(gè)小時(shí)內(nèi)的數(shù)據(jù)用三種不同粗細(xì)、不同顏色的曲線畫了出來。
看到了嗎,out部分(紅色)顯示了2個(gè)小時(shí)內(nèi)的流量,而in部分(綠色)則只顯示了1個(gè)小時(shí)內(nèi)的部分
在這里要提一點(diǎn),雖然我們指定了?–-start?或者?–-end?,或者?:start?,?:end,但并不意味著曲線就一定會(huì)從指定的時(shí)間點(diǎn)開始和結(jié)束。
例如我們上面指定了?:start=now-600:end=now-300?,也就是只顯示5分鐘的數(shù)據(jù)。但圖表出來的效果卻是10(10:05-10:15)分鐘
的數(shù)據(jù),這是因?yàn)槲覀兲暨x的時(shí)間當(dāng)中“不慎”橫垮了兩個(gè)周期(10:05-10:10,10:10-10:15),所以?RRDtool?會(huì)把它們?nèi)慨嫵鰜?#xff0c;而
不是只畫其中的5分鐘。
[?本帖最后由?ailms?于?2006-12-4?09:44?編輯?]
?ailms 回復(fù)于:2006-12-04 09:27:24
使用RRDtool?進(jìn)行繪圖_(二)
?[color=blue]
**********************************************************************************************************************
?注?:該教程參考了如下內(nèi)容?:
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?是用于圖表上方的標(biāo)題,-v?是用于?Y?軸的說明文字
實(shí)例1?:給圖表增加標(biāo)題
[root@dns1?bob]#?rrdtool?graph?1.png?\
>?--start?now-183600?\ #?從當(dāng)前開始往前51個(gè)小時(shí)
>?-t?"51?hours?ago"?-v?"Traffic"?\ #?標(biāo)題是?“51?hours?ago”,Y?軸的說明文字是?“Traffic”
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
>?DEF:value2=eth0.rrd:eth0_out:AVERAGE?\
>?LINE1:value1#0000ff:in?\ #?注釋?:以1個(gè)像素寬的曲線畫出?value1,顏色是藍(lán)色,圖例的說明文字是“in”
>?LINE2:value2#ff0000:out #?注釋?:以2個(gè)像素寬的曲線畫出?value2,顏色是紅色,圖例的說明文字是?“out”
497x179
[root@dns1?bob]#
現(xiàn)在我們用的是?LINE?的方式來繪圖。LINE?可以有3種,分別是?LINE1|2|3,也就是線條的粗細(xì)。還有一種是?STACK?方式下面再介紹。
可以看到流入的流量比流出的流量稍大,這樣看的話,out?流量比較難看,是否可以有別的方式呢?RRDtool?還提供了
另外一種格式,就是?STACK?。意思就是在前一個(gè)對(duì)象的基礎(chǔ)(把前一個(gè)對(duì)象的值當(dāng)成?X?軸)上繪圖,而不是從?X?軸開始。
實(shí)例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?的基礎(chǔ)上繪圖
497x179
[root@dns1?bob]#
這是沒有采用?STACK?方式繪圖的效果?:
可以看得出上面采用?STACK?方式的比較清晰,但要注意,采用?STACK?方式后,在讀取?out?流量時(shí),Y?軸的刻度不再是?out?的值,
應(yīng)該用刻度值減去?in?的值,才是?out?真正的值。這點(diǎn)比較麻煩。需要配合?GPRINT?語句才能達(dá)到一定的效果。
[size=4]六)圖表大小(Size)[/size]
[-w|--width?pixels]?[-h|--height?pixels]
這里說圖表大小而不是圖片大小,是因?yàn)?–w?,-h?控制的是?X/Y?軸共同圍起來的那部分大小,而不是整個(gè)圖片的大小,這點(diǎn)在前面就可以看出了。
默認(rèn)的圖表大小是?400?(長(zhǎng))x?100?(高),但一般會(huì)返回497x179?這樣的數(shù)字,這個(gè)才是圖片的大小。
RRDtool?比?MRTG?好的一個(gè)地方就是?MRTG?一放大圖片,就會(huì)變得模糊。RRDtool?則不會(huì)。
在官方文檔中,-w?似乎是一個(gè)比較敏感的參數(shù),我們看下面的描述?:
引用:
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?會(huì)影響到圖表的?resolution?,進(jìn)一步影響到?RRDtool?如何選擇?RRA?,
但經(jīng)過實(shí)驗(yàn)卻發(fā)現(xiàn)并非如此。
[color=red]我對(duì)這兩段話中的圖表的?resolution?一詞不知如何理解和計(jì)算,希望好心的朋友能夠指點(diǎn)一下?^_^?.[/color]
實(shí)例1?:使用?–w?設(shè)定圖表大小為?300?像素
[root@dns1?bob]#?rrdtool?graph?3.png?
>?-w?300?\ #?設(shè)定?size?為?300?pixel
>?--start?now-120000?\
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
>?AREA:value1#ff0000???????????
381x154
[root@dns1?bob]#
可以看到圖表是不是變小了呢?而且整個(gè)圖片的大小也變小了。
如果用前面的話來推理,由于?120000/300(-w的值)=?400?>?300?(step),由于沒有?resolution=400?的?RRA,
所以應(yīng)該采用?resolution=7200?的第2個(gè)?RRA?的數(shù)據(jù)來繪圖,但實(shí)際上不是。
上面這個(gè)才是?300?pixel?寬,resolution=7200?的效果
所以我覺得?–w?和?–h?并不能影響?RRDtool?如何選擇?RRA?,只能起到縮小放大的作用。
BTW:當(dāng)你繪制的時(shí)間范圍較大時(shí),可以使用?–w?增大圖表大小,這樣看起來比較“舒服“
[size=4]七)?Y?軸上下限(Limits)[/size]
?
[-u|--upper-limit?value]?[-l|--lower-limit?value]?[-r|--rigid]
?
?默認(rèn)情況下,RRDtool?會(huì)和?MRTG?一樣自動(dòng)調(diào)整?Y?軸的數(shù)字,來配合當(dāng)前的數(shù)值大小。如果想禁止該特性,可以通過?–upper-limit?和
?
-–lower-limit?來做限制,表示Y軸顯示的值從多少到多少。如果沒有指定?–rigid?,則在圖表的上下邊界處還是會(huì)有一些延伸,但如果指定了
??
-–rigid?,則嚴(yán)格按照?–-upper-limit?和?–-lower-limit?繪制。
在使用?–lower-limit?時(shí)要注意,如果數(shù)據(jù)中有負(fù)數(shù),如果?-–lower-limit?為?0,則負(fù)數(shù)部分是顯示不出來的。
實(shí)例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?\ ? #?嚴(yán)格按照上面的規(guī)定來畫
>?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?中設(shè)置?X?軸的刻度比較復(fù)雜,如果沒有必要,可以交給?RRDtool?自動(dòng)去處理。
例如上面的圖,33?小時(shí)的情況下,X?軸只有2個(gè)值,顯得很不足。這時(shí)候有兩種方法?:
A)一是使用?–w?增大圖表的寬度,這樣?RRDtool?會(huì)自動(dòng)加多一些刻度上去。
不過需要增加多大才會(huì)有上面的這種效果不得而知,所以這種方法不是很方便。
B)二是通過上面的選項(xiàng)自己設(shè)置?X/Y?軸的刻度如何顯示。首先看上圖,在垂直的線中,紅色的線稱為?Major?Grid(主要網(wǎng)格線),
????灰色的線稱為?Base?Grid?(次要網(wǎng)格線)(這里是借用?EXCEL?中的概念?^_^?)。?X?軸下面的時(shí)間文字成為?Label?。了解這
????
????三樣?xùn)|西后,就可以動(dòng)手調(diào)整刻度了。
????
C)有兩種方法可以快速去掉?X/Y?軸的刻度,就是?–-x-grid?none?和?–-y-grid?none
D)GTM:GST?:控制次要格網(wǎng)線的位置。GTM?是一個(gè)時(shí)間單位,可以是?SECOND、MINUTE、HOUR、DAY?、WEEK、MONTH、YEAR?。
?????GST?則是一個(gè)數(shù)字,控制每隔多長(zhǎng)時(shí)間放置一根次要格線。例如我們要畫一個(gè)1天的圖表,決定每15分鐘一根次要網(wǎng)格線,則格式為?MINUTE:15
?????
E)MTM:MST?:控制主要網(wǎng)格線的位置。MTM?同樣是時(shí)間單位,MST?是一個(gè)數(shù)字。接上面的例子,決定一個(gè)小時(shí)1根主要網(wǎng)格線。則格式為?HOUR:1?
?????LTM:LST?:控制每隔多長(zhǎng)時(shí)間輸出一個(gè)label?。決定為1小時(shí)1個(gè)?label?。則格式為?HOUR:1
G)LPR:LFM?:LTM:LST?只是決定了?label?的顯示位置了,沒有指定要顯示什么內(nèi)容。LPR?指的是如何放置?label?。如果LPR?為0,則數(shù)字對(duì)齊格線
????(適用于顯示時(shí)間)。如果不為0,則會(huì)做一些偏移(適用于顯示星期幾、月份等)。至于LFM?則需要熟悉一下?date?命令的參數(shù),常用的有?%a(星期幾)、
????
????%b(月份)、%d(天)、%H(小時(shí))、%M(分)、%Y(年)。我們決定顯示小時(shí)和分,所以用?%H%M
H)綜合起來,X?軸的刻度定義就是?–-x-grid?MINUTE:15:HOUR:1:HOUR:1:0:’%H:%M’。最好把?%H:%M?括起來
?????建議?MST是?GST?的2-6倍,MST?和?LST?相同。這樣畫出來的圖比較美觀一些
????
這明顯就是圖片太小了,不夠顯示。把上面的?:%M?去掉就可以了,只顯示小時(shí),不顯示分鐘
????
如果把圖片放大一點(diǎn)就更好了?(-w?800)
????
所以在設(shè)置?X?軸的刻度時(shí),要記得不要顯示太多東西,否則需要增大圖片的大小
????
I)Y?軸刻度的設(shè)置又不一樣了
???grid?step?:用于控制Y軸每隔多少顯示一根水平線
???label?factor?:默認(rèn)為1,也就是在每根水平線的高度那里顯示一個(gè)值。
???例如下面就是一個(gè)例子?(每隔800顯示一根水平線)
????
J)Y?軸還有一個(gè)很方便的選項(xiàng)就是?–Y?,它可以最大限度的優(yōu)化?Y?軸的刻度,建議每次繪圖都加上去。
K)Y?軸另外一個(gè)有用的選項(xiàng)就是?–X?(雖然選項(xiàng)名是?-X?,但確實(shí)是用來設(shè)置?Y?軸刻度值的)。在上面的圖我們看到?RRDtool?自動(dòng)對(duì)?Y?軸的值進(jìn)行調(diào)整,
?????以?k?為單位顯示。但如果你不想以?k?顯示,而是想固定以某個(gè)單位來顯示(M,b)該怎么辦呢?這就要用到?–X?選項(xiàng)了。-X?后面跟一個(gè)參數(shù),參數(shù)值
?????
?????范圍是?-18、-15、-12、-9、-6?、-3、0、3、6、9、12、15、18?。0?表示以原值顯示,3?表示數(shù)值除以1000,也就是以?k?為單位顯示,6?就是以
?????
?????M?顯示,9?就是以?G?顯示。如果你給出1或者2,則?RRDtool?也可以接受,但會(huì)被“靜悄悄”的改為0。下面就是一個(gè)以原值(-X?0)顯示的例子
[?本帖最后由?ailms?于?2006-12-4?09:44?編輯?]
?ailms 回復(fù)于:2006-12-04 09:28:00
使用RRDtool?進(jìn)行繪圖_(三)
[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內(nèi)容?:
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?是一個(gè)有意思的選項(xiàng)。CU?的?abel?兄曾提供了一個(gè)中文?patch?可以實(shí)現(xiàn)顯示中文的效果。但對(duì)于我這等對(duì)?C?一竅不通的家伙,就不知道怎么用了。
????不過幸好?–n?選項(xiàng)可以實(shí)現(xiàn)這個(gè)目的,只需要中文字體的文件就可以搞定了。
?????[color=blue]首先你要找出一個(gè)中文的字體文件[/color]。例如/usr/share/fonts/zh_CN/TrueType/gkai00mp.ttf?。你也可以把?Windows?上的?C:\Windows\Fonts?下面的中
?????
?????文字體拷貝到?Linux?上,例如home/bob/Fonts/simhei.ttf?(黑體)效果不錯(cuò),其他的則不太行,會(huì)出現(xiàn)模糊或者重疊的情況。建議就使用黑體算了。
?????[color=blue]其次是確定字體大小。[/color]中文字體不宜小于?7?,否則看不清楚
?????[color=blue]確定你要修改的是圖表的那個(gè)部分[/color]。有?DEFAULT(全部),TITLE?(標(biāo)題)、AXIS(坐標(biāo)軸字體)、UNIT(Y軸單位字體)、LEGEND(圖例字體)幾種。
下面就以實(shí)際的例子來說明如何顯示中文?:
實(shí)例1?:使用?–n?讓?RRDtool?顯示中文
[root@dns1?bob]#?rrdtool?graph?4.png?\
>?-n?TITLE:10:'/home/bob/Fonts/simhei.ttf'?\ #?修改標(biāo)題的字體為黑體
>?-n?AXIS:10:'/home/bob/Fonts/simhei.ttf'?\ #?修改?X?軸的字體為黑體
>?--start?now-240000?\ #?大于3天的數(shù)據(jù)
>?DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
>?AREA:value1#00ff00:in?-t?"33小時(shí)前的?eth0?接口流量"?-v?"traffic"
>?-Y?–w?600 #?圖表寬度為?600?pixel
503x190
[root@dns1?bob]#
這就是最終的效果了,可以看到標(biāo)題和?X?軸都是中文的,但?Y?軸的字體還是默認(rèn)的字體。
B)-g?|--no-legend?用于取消圖表下方的圖例,不過不建議這么做。
C)-b|--base?value?在?MRTG?和?RRDtool?中,默認(rèn)?1k=1000?,使用?–b?可以進(jìn)行調(diào)整,例如?–b?1024
[size=4]十)數(shù)字報(bào)表[/size]
看看上面的圖表,是不是覺得還少了些什么呢?對(duì)了,就是只有圖,沒有文字說明。如何象?MRTG?那樣能夠顯示“最大值”、“平均值”、“當(dāng)前值”呢?
這就需要用到?GRPINT?和?COMMENT?語句了。
GPRINT?就是在圖表的下方(仍然屬于圖片的內(nèi)部)輸出最大值、最小值、平均值這些東東;COMMENT?就是用來輸出一些字符串,例如報(bào)表的表頭。
A)GPRINT的格式是GPRINT:vname:CF:format?。由于?format?部分太多參數(shù)了,我這里就用最常用的那個(gè)?:?%x.ylf?。
B)COMMENT?的格式是COMMENT:text?。要注意?COMMENT?默認(rèn)是不輸出換行的,如果要輸出換行,必須用?“\n”?。
下面就以一個(gè)實(shí)例來說明如何打印報(bào)表?:?繪制1小時(shí)前的流量圖,并打印數(shù)字報(bào)表(參照?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:"?????????當(dāng)前值--------------平均值--------------最大值--------------最小值--------------\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?軸刻度值和“流出”部分的值的關(guān)系,?Y?軸刻度值?—“流入”?=“流出”[/color]
由于時(shí)間精力有限,關(guān)于對(duì)齊方面的工作就大家自己試驗(yàn)吧.如果繪制的對(duì)象數(shù)量不是很多,可以用橫向報(bào)表,不要用這種垂直的格式,
[color=red]這種格式的好處是便于比較各個(gè)對(duì)象的值。不過我可以肯定,如何讓這些數(shù)字和上面的表頭對(duì)齊是一個(gè)會(huì)令你極度抓狂的工作的!!![/color]
上面的??COMMENT?一是輸出表頭,二是輸出空行。注意,要用?COMMENT?輸出空行,必須用?COMMENT:’?\n’?。
注意到?‘\’?前面的空格嗎?這個(gè)是不可以漏的,否則就不會(huì)有空行的效果了。
[size=4]十一)特殊功能[/size]
VRULE:time#color[:legend]
HRULE:value#color[:legend]
SHIFT:vname:offset
A)VRULE/HRULE?可以用于在圖表上面繪制垂直線/水平線。例如我們想要在圖表上面標(biāo)出最大值,可以用?HRULE?在?Y?軸的指定刻度值
????那里繪制一根水平線,例如?HRUE:100000#ff0000:”最大值”?在?100k?處畫一根水平線,并指出這是最大值。
SHIFT?可以用來移動(dòng)數(shù)據(jù),例如?abel?兄曾經(jīng)在?“[教學(xué)]中的教學(xué)(二)?RRDTOOL?1.2?更新項(xiàng)目”中提到過一個(gè)問題,
就是“xx同期相比”如何畫?下面就以如何比較3天的數(shù)據(jù)。
實(shí)例1?:繪制連續(xù)3天的數(shù)據(jù)
[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天前的數(shù)據(jù)呢?因?yàn)槲覀儧]有指定?–-start?,RRDtool?默認(rèn)只繪制1天前的數(shù)據(jù)。由于這里覆蓋了3天,
所以我們可以把?–-start?定義為?–-start?now-3d?就可以了。
現(xiàn)在是不是3天的數(shù)據(jù)都畫出來了呢?不過由于它們是橫向排列的,所以要比較同個(gè)時(shí)間段的并不容易,能否把它們
按“垂直”的方式排列呢?這就要用到?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"?\ #?把曲線向右移動(dòng)1天
>?SHIFT:value3:172800?LINE1:value3#000000:"3?days?ago"?\ #?把曲線向右移動(dòng)2天
>?-Y?–w?600
475x168
[root@dns1?bob]#
和上面的圖表比較,是否可以發(fā)現(xiàn)?X?軸不同了,不再是3天,而是1天多1點(diǎn)了。而且3根曲線重疊在一起了,可以看出在這三天中,
只有1天前的23點(diǎn)左右有一點(diǎn)流量之外,其余絕大部分都沒有流量。
這就是?SHIFT?的功能了,可以把曲線/方塊沿著?X?軸移動(dòng)(左右都可以),我們達(dá)到比較同期數(shù)據(jù)的目的。是不是很好用呢?
[size=4]十二)總結(jié)[/size]
這次的內(nèi)容可真夠多的,足足寫了19頁。不過工具性的東西就是這樣?:別看內(nèi)容?N多,你只要?jiǎng)邮之嫵?個(gè)圖之后,就會(huì)覺得一
切都很簡(jiǎn)單了。以后只要套用就可以了。關(guān)鍵是如何更好的把你想要的數(shù)據(jù)以合適的發(fā)給你是呈現(xiàn)出來。
上面這些內(nèi)容都是我通過實(shí)驗(yàn)得出的,由于具體的環(huán)境不同,可能會(huì)跟大家的不同,或者出現(xiàn)錯(cuò)誤。我希望大家不要客氣,有錯(cuò)誤
的地方就指正,有什么好的發(fā)現(xiàn)也提出來,一起完善?RRDtool?的文檔。這樣就可以讓越來越多的人了解、掌握?RRDtool?了?。???
?(^_^)!
[?本帖最后由?ailms?于?2006-12-4?09:45?編輯?]
?ailms 回復(fù)于:2006-12-04 09:45:55
RRDtool簡(jiǎn)體中文教程_9:如何使用RPN
如何使用RPN
?[color=blue]
**********************************************************************************************************************
注?:該教程參考了如下內(nèi)容?:
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?發(fā)明,最神奇的地方是用它來表示數(shù)學(xué)表達(dá)式,
完全不需要括號(hào)。而且?RPN?不像普通的數(shù)學(xué)表達(dá)式那樣,操作符在操作數(shù)的中間,而是在操作數(shù)的右邊。例如?3+2?用?RPN?表示就是?3,2,+?;
3+(2X5)?用?RPN?表示就是?3,2,5,x,+?最后運(yùn)算的部分(加法部分)的操作符放在最后,乘號(hào)放在前面,表示先執(zhí)行?2?x?5?,在把結(jié)果和3相加。
在?RRDtool?中,RPN?還可以用來表示?if-then-else?關(guān)系。這點(diǎn)在繪圖中很有用。例如你要看?eth0?接口在一天當(dāng)中流量?≥?10Mb/s?的部分,“隱藏”
其他低于?10Mb/s?的部分,則可以用到這個(gè)功能。
[size=4]二)操作符[/size]
什么是?RPN
A)RPN?是?Reverse?Polish?Notation?的縮寫,是用于表示算術(shù)運(yùn)算和邏輯運(yùn)算的一種語法格式。
B)RRDtool?的?CDEF?語句中就經(jīng)常使用?RPN?來對(duì)?DEF?取出來的數(shù)據(jù)進(jìn)行運(yùn)算。
C)RPN?的特點(diǎn)是操作數(shù)和操作符出現(xiàn)的順序和運(yùn)算的順序一致,這樣就不需要使用括號(hào)了
D)RPN?的格式是?<value1>,<value2>,<operator>?,[<value1>,<value2>,<operator>]…?可以看出是操作數(shù)在前,操作符在后的格式
E)RPN?需要提到堆棧的概念(stack)。堆棧是用來存儲(chǔ)操作數(shù)和操作符的。
F)當(dāng)堆棧中壓入(push)一個(gè)操作符時(shí),就從堆棧中取出(pop)所需要的操作數(shù)進(jìn)行計(jì)算(根據(jù)操作的不同pop出不同數(shù)量的操作數(shù))。
??
?????結(jié)果再返回(push)堆棧,最終整個(gè)?RPN?應(yīng)該只返回一個(gè)值,或者說堆棧中只有一個(gè)元素
G)在?CDEF?中書寫?RPN?操作符,要一律以大寫的格式出現(xiàn)
H)?RPN?中,如果某個(gè)部分的運(yùn)算結(jié)果非?0,則被認(rèn)為是?true?,只有?0?才被認(rèn)為是?false?
[size=4]三)RPN?操作符的分類[/size]
A)布爾操作符?:GT、GE、LT、LE、EQ、NE、
B)特殊值比較符?:UN、ISINF、
C)條件操作符?:IF
D)比較操作符?:MIN、MAX、LIMIT
E)算術(shù)操作符?:+?、-、*、/、%、SIN,?COS,?LOG,?EXP,?SQRT、FLOOR,?CEIL、ATAN、ATAN2、DEG2RAD,?RAD2DEG
F)數(shù)據(jù)集操作符?:所謂數(shù)據(jù)集(sets),就是指多個(gè)數(shù)據(jù)。SORT、REV、AVG、TREND
G)特殊值?:UNKN、INF、NEINF、PREV、COUNT
H)時(shí)間操作符?:NOW、TIME、LTIME
I)堆棧操作符?:POP、DUP、EXC
四)RPN?操作的結(jié)果
A)布爾操作符?:從堆棧中?pop?出兩個(gè)元素,并根據(jù)比較結(jié)果返回?0?(false)?或者?1?。任何同?UNKNOWN?或者?INF?、NEINF?比較的都為?0
B)特殊值比較符?:從堆棧中?pop?出1個(gè)元素,并同?UNKNOWN?或者?INF、NEINF?比較。結(jié)果為?0?或者?1
C)條件操作符?:從堆棧中pop出3個(gè)元素,如果最后pop出的那個(gè)元素不為0(條件部分為?true),則第2次?pop?出的那個(gè)元素被重新入棧(then部分);
?????否則第一次pop出的元素重新入棧(else部分)。結(jié)果為?then?部分或者?else?部分返回的值,不一定為0或者1
D)比較操作符?:
?????對(duì)于?MIN/MAX?操作符來說,從堆棧中?pop?出兩個(gè)操作符,并把較大/小的那個(gè)重新入棧。如果其中有一個(gè)?unknown?,則結(jié)果為?unknonw
?????對(duì)于?LIMIT?操作符來說,先從堆棧中?pop?出2個(gè)操作數(shù),作為邊界的定義;再?pop?出1個(gè)操作數(shù),比較該操作數(shù)是否落在前面定義的范圍內(nèi)。
?????
?????如果是則把最后?pop?出的那個(gè)元素重新入棧;否則把?UNKN?值入棧;注意,是?UNKN?,不是?0
E)算術(shù)操作符?:根據(jù)操作符?pop?出所需數(shù)量的操作數(shù),并把算術(shù)運(yùn)算的結(jié)果重新入棧
F)數(shù)據(jù)集操作符?:
????對(duì)于?SORT、REV?來說,先從堆棧中?POP?出一個(gè)元素,該元素的值就是下面要?pop?出的元素的數(shù)量。然后對(duì)堆棧從上到下的若干個(gè)元素
????
???由第一次?pop?的出的那個(gè)元素的值決定)進(jìn)行排序/反向排序。結(jié)果再重新入棧。
???注意?:由于堆棧的特點(diǎn)是后進(jìn)先出,所以要操作的元素是從SORT操作符往左方向計(jì)數(shù)。例如v1,v2,v3,v4,3,SORT是對(duì)?v2~v4?排序,
???
????????????不是對(duì)?v1~v3?排序。??這點(diǎn)在書寫?RPN?時(shí)要特別注意。
???注意?:SORT?操作是最小值在堆棧的最頂部;REV?則相反,最小值是在堆棧的最頂部。
???對(duì)于?AVG?操作來說,同樣是先?pop?出1個(gè)元素,并按照指定的數(shù)量對(duì)后續(xù)的若干個(gè)操作數(shù)進(jìn)行操作,但結(jié)果只有一個(gè)數(shù)值,并入棧。
G)特殊值?:
????UNKN?表示壓入一個(gè)?UNKN?值;INF、NEINF?分別表示把?INF、NEINF?值壓入堆棧
H)時(shí)間操作符?:
???TIME?返回當(dāng)前所提取的記錄的?timestamp?,注意?TIME?直接返回當(dāng)前記錄的?timestamp?,不用任何參數(shù)
???NOW?返回當(dāng)前時(shí)間,同樣?NOW?不用任何參數(shù)
I)堆棧操作符?:
???POP?:彈出堆棧的最頂部的那個(gè)元素
??EXC?:交換堆棧頂部的第一個(gè)和第二個(gè)元素的值
[size=4]五)如何閱讀?RPN[/size]
A)首先按照從左到右的順序,找出第一個(gè)?RPN?操作符,并根據(jù)上一節(jié)的內(nèi)容,對(duì)相應(yīng)的操作數(shù)進(jìn)行操作
B)操作結(jié)果分成兩種?:
如果是一個(gè)值,直接替換掉該部分?RPN?
如果是多個(gè)值(數(shù)據(jù)集操作,但?AVG?操作只返回一個(gè)值),則結(jié)果可能為多個(gè)數(shù)值。則把這若干個(gè)數(shù)值用?‘,’?隔開,替換原來那部分?RPN?
C)如此循環(huán),一直到整個(gè)?RPN?只返回一個(gè)值為止
[size=4]六、RPN?實(shí)例[/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?這兩個(gè)數(shù)值中較大的一個(gè);alpha,0,100,LIMIT?表示測(cè)試?alpha?的值是否小于等于0,大于等于100;
E)算術(shù)操作符?:1,2,-?表示?1-2=-1
F)數(shù)據(jù)集操作符?:
????v1,v2,v3,v4,v5,4,SORT?表示對(duì)?v1~v4?進(jìn)行正向排序,結(jié)果堆棧中還是有5個(gè)元素;
????v1,v2,v3,v4,3,AVG,+,2,/?表示對(duì)?v4,v3,v2?進(jìn)行求平均值,并把結(jié)果入棧。假設(shè)v2~v4的結(jié)果為?k?,則為?v1,k,+,2,/?也就是返回?(v1+k)/2
G)特殊值?:mydata,0,GT,UNKN,mydata,IF?表示如果?mydata?大于?0則返回?UNKNOWN?,否則還是?mydata?
H)時(shí)間操作符?:?TIME,`date?–d?“2006-10-01?10:00”?+%s`,GT,0,1,IF?表示如果當(dāng)前記錄的采集時(shí)間是在?2006-10-01?10:00?之后就返回1,否則返回?0
I)堆棧操作符?:POP?就立即彈出第一個(gè)元素
?
[size=4]七)如何表示?AND、OR?關(guān)系[/size]
A)我們知道?RPN?表達(dá)式的值除非0,否則都認(rèn)為是?true
B)我們可以利用?加法操作和乘法操作來實(shí)現(xiàn)?OR?和?AND?的邏輯關(guān)系;如果兩個(gè)?RPN?表達(dá)式的值相加不等于0,就一定為?true?;
?????如果兩個(gè)?RPN?表達(dá)式的值相乘不等于0,就一定為?true
C)AND?關(guān)系的例子?:例如要比較某個(gè)值(15,9)是否在特定范圍內(nèi)可以用?:
????15,10,GT,15,20,LT,*?,結(jié)果就是(15>10)*(15?<?20)=?1?*?1?=1?,所以為?true
?????9,10,GT,9,20,LT,*?,結(jié)果就是?(9?>10)*?(?9?<?20)=?0?*?1?=0?,所以為?false
D)OR?關(guān)系的例子:同上例如要比較某個(gè)值(7,15)小于10,或者大于20:
?????7,10,LT,7,20,GT,+?,結(jié)果為?(7?<?10)+?(7?>?20)?=?1+0?=?1,所以為?true
?????15,10,LT,15,20,GT,+?,結(jié)果為?(?15?<?10)?+?(?15?>?20)?=?0?+?0?=0?,所以為?false
E)不過使用?+?需要注意一個(gè)地方?:相加的雙方都必須是正數(shù),否則可能出現(xiàn)問題,例如一個(gè)正數(shù)(-5,true)和另外一個(gè)正數(shù)(5,true)相加為?0(false)
如果是按照?OR?的關(guān)系,應(yīng)該是?true?的,但結(jié)果變成0(false),所以在使用?+?來表示?OR?的關(guān)系時(shí),要注意該問題
F)使用?*?則沒有該問題了,正數(shù)?*?負(fù)數(shù)?=?負(fù)數(shù)?(true)。所以如果遇到?OR?關(guān)系的時(shí)候,可以轉(zhuǎn)換為?AND?關(guān)系來計(jì)算。
?????例如要表達(dá)?(x?<?a)?OR?(?x?>?b)?的關(guān)系,可以改為?(x?>a)?AND?(?x?<?b?)?,訣竅就是把比較操作符調(diào)反方向,把?+?改為?*
[size=4]八)實(shí)例[/size]
實(shí)例1:例如要看?eth0的總流量,可以用如下的定義
DEF:value1=eth0.rrd:eth0_in:AVERAGE?\
DEF:value2=eth0.rrd:eth0_out:AVERAGE?\
CDEF:value3=value1,value2,+?\
AREA:value3#ff0000:”total”
實(shí)例2?:假設(shè)我們要把?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?一直沒有數(shù)據(jù)插入,所以一直都是?NaN?,如果直接把?value1?和?value2?相加,由于?value2?是?UNKNOWN,
所以相加的結(jié)果也是?UNKNOWN?。圖表上將什么都不顯示,所以需要對(duì)?value2?進(jìn)行判斷,如果?value2?的值?UNKNOWN (value2,UN),
則返回0,否則返回?value2?本身。然后把這個(gè)值賦予變量?value3?,最后把?value1?和?value3?相加,才得出真正入流量
?
實(shí)例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
實(shí)例4?:只繪制特定時(shí)間段(在?2006/11/29?10:30?~?2006/11/29?12:30)的數(shù)據(jù)
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]九、完結(jié)[/size]
?相信到目前為止,大家對(duì)?RRDtool?的認(rèn)識(shí)應(yīng)該更深了吧。一定要多做實(shí)驗(yàn),這樣才能做到熟能生巧,靈活應(yīng)用。
?
?其實(shí)剩下的還有?xport、dump、restore、resize、tune、rrdcgi?幾個(gè)操作沒講,而且有一些應(yīng)用經(jīng)驗(yàn)方面的東西也沒有提到,
?
?不過想要全部寫出來,可能太耗時(shí)間和精力了,這些東西足足寫了我2個(gè)星期才寫完。中間還要不斷的做實(shí)驗(yàn)以驗(yàn)證正確性,怕誤導(dǎo)了大家。
?
?如果需要的話,可以自己下載官方文檔學(xué)習(xí),或者能有熱心的朋友補(bǔ)充就更好了,^_^?。
?
[size=4]十、?本人的一點(diǎn)學(xué)習(xí)體會(huì)[/size]
??本人從開始看?RRDtool?官方文檔到開始寫這篇教程,差不多用了2個(gè)月。?RRDtool?比學(xué)習(xí)?MRTG?難多了,資料少,RRDtool?的中文資料目前就只有?abel?
兄寫的那一篇教程,如果沒有實(shí)際的上機(jī)操作,是不可能看懂的,所以?abel?兄也特別交代這點(diǎn)。如果只一心想速成,到頭來反而吃虧的是自己。
???象sendmail、bind?這些服務(wù)器的配置,隨便在?google?上都可以搜到一大把所謂的“快速入門”,很多人也都照著做了。但明明別人可以的,為什么輪到自己
???
卻失敗呢?相信這是很多人心中曾有的郁悶經(jīng)歷。其實(shí)歸根到底就是基礎(chǔ)的問題,再深入一些就是學(xué)習(xí)心態(tài)的問題。“不積跬步,無以至千里;不積小流,無以成江海”。
配置一個(gè)服務(wù)器并不是照抄配置就可以的。環(huán)境的不同,需求的不同這些因素都要考慮在內(nèi)。怎么可能做到完全一樣呢?同一個(gè)語句換個(gè)環(huán)境可能就不行了。所以我很
少看那些所謂的快速入門,要么看?manual?,要么看書(說到這里,感覺?O’Reilly?的書真是不錯(cuò)!^_^),如果是象?RRDtool這種的,就只好看官方文檔了。
???
??學(xué)習(xí)的同時(shí)也要注意選擇好的教材。有時(shí)候一本好書能帶給無窮的好處。這點(diǎn)在我第一次看?O’Reilly?的?《dns?&?bind?4th》就有感覺,老外的書很注重循序漸進(jìn),
??
通常他們都是從某個(gè)實(shí)際工作環(huán)境的一個(gè)小例子說起,逐步引入各個(gè)命令、配置語句。然后隨著需求的壯大,不斷引入新的內(nèi)容,最后形成一個(gè)總體。這樣看完后會(huì)心中會(huì)
有一個(gè)整體的框架和概念。不象國(guó)內(nèi)一些書,毫不顧及條理,一上來就講語法、命令,搞得讀者很快都沒有興趣。這樣的書可謂害人不淺。
???同時(shí)也建議大家讀英文原版的書。為什么呢?雖然中文的看起來快一些,但學(xué)習(xí)不是競(jìng)走比賽。不是比誰看的快,而是比誰學(xué)的牢。英文書的詞匯其實(shí)都是專業(yè)詞匯,
只要看多了,自然記住了。實(shí)在記不住,可以用金山詞霸等工具輔助。俺的英文水平只有二級(jí),但并不妨礙我看書。況且看英文書,有一個(gè)“英文→中文”的轉(zhuǎn)換的過程。就
是揣摩作者這句話的含義,或者說這句話應(yīng)該如何翻譯好。有些人覺得這個(gè)沒有什么,但我覺得這個(gè)過程是你弄清作者思想的重要步驟。在你不斷的揣摩中,可能會(huì)有不同
的理解,直到你認(rèn)為這是最正確的那一種解釋為止。如果是看中文書,可能會(huì)由于惰性,比較容易就接受作者的想法,而失去這個(gè)主動(dòng)我思考的過程。
??一時(shí)有感而發(fā),胡亂寫了一通,請(qǐng)各位朋友見諒了。
??書山有路勤為徑,學(xué)海無涯苦做舟!
???愿以該座右銘和各位有志于Linux的朋友一起共勉!
??2006/12/2?22:23
?
轉(zhuǎn)載于:https://www.cnblogs.com/xalex/archive/2008/12/05/1348050.html
總結(jié)
以上是生活随笔為你收集整理的RRDTool学习资料备忘的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【代码真相】之 开篇
- 下一篇: C#操作xml之xpath语法