<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 33,  comments - 70,  trackbacks - 0
    rrdtool 教學
    歡迎轉載 ,但有任何修改請來信告知,不得作為商業(yè)用途
    作者: abelyang <abelyang{at}twnic{dot}net{dot}tw>
    version: 1.0
    最後修正時間: 2005/05/26 00:10
    轉載時請保持此一宣告
    http://phorum.study-area.org/viewtopic.php?t=18496

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

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

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


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


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


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

    使用 rrdtool 匯整:

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


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

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

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

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

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

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

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

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

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


    # mrtg Threshold Check , 定義 Alert 所在目錄,及 Alert 值,Alert
    ThreshDir: /www/htdocs//mrtg/alert/
    #依我的
    #remote 重
    ThreshMaxI[sg-apol-mgcd]: 1000
    ThreshProgI[sg-apol-mgcd]:/www/htdocs/snmp.enum.org.tw/mrtg/alert/send_MSN.sh


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

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

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

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

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


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

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

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

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

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


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

    4. rrdtool 建檔語法 (rrdtool create)

    rrdtool create filename
    [--start|-b start time]
    [--step|-s step]
    [DS:ds-name:DST:heartbeat:min:max]
    [RRA:CF:xff:steps:rows]


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

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

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

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

    DS Data Source DS "宣告" 的意思
    telnet 是 DSN (name) , 欄位名稱,意即"變數(shù)名稱",
    COUNTER 是DST(type),習慣上常用如果輸入資料依序為 98 100 98:
    1.GAUGE(個別值,像CPU loading):產生圖檔時,畫 98 100 98
    2.COUNTER (累計值,像流量資料):產生圖檔時,畫,2 -2
    3.DERIVE (累計值,像流量資料),小於0畫0:產生圖檔時,畫 2 0
    4.ABSOLUTE 如同 COUNTER,但 COUNTER 可能 overflow(數(shù)值過大),所以會取絕對值
    補充說明,COUNTER/DERIVE/AVSOLVTE 雖是取差值,但會再除以兩次間隔間的秒數(shù),如上 COUNTER
    例,兩次間隔間為 300 秒,那畫出來的就是 2/300,-2/300 的值

    600 是有效期(heartbeat),如果連續(xù)如果原來在 12:00 要產生資料而沒有產生,前後 300 秒 (共 600
    秒)的平均值會算成 12:00 的值,如果都沒有值,則會成為 "UNKNOWN" (UN,就像 mrtg 沒有資料時,
    會畫一平線的狀況一樣),考考你,如果你想把現(xiàn)有的 mrtg logfile 轉成 rrd file, 這個值該設為
    多少呢 ?86400 以上
    0:100000000 是說 DSN 的數(shù)值有效範圍,如果超出這個值,皆視為 UN,這裏也可以寫成 U:U 代表不限範圍

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

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


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

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

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

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

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



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


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


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

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


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

    5.更新 RRD 資料 (rrdtool update)

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


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

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

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

    $>timestamp=`date +%s `

    來轉現(xiàn)在秒數(shù),如果是某些特定時間,則可以
    代碼:

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


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


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

    6.1 LINE{1|2|3} 圖例
    代碼:

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

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


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

    6.2 AREA,CDEF 圖例
    代碼:

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

    流量小時圖:


    流量日圖


    流量週圖


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

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

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

    DEF 重要的地方,其語法為 DEF:your_var:rrd_filename:DS_name:[AVERAGE|MAX..]
    請參考上面的 tcpdump-graph.sh
    主要用處在於您要取出那個 RRD 檔案的 DSN 到這個 graph 的參數(shù)來
    CDEF 一個虛擬的變數(shù),其值為 DEF 的某些運算,其運算式需寫成後序
    EX: a=1+3 寫成 a=1,3 +
    http=(smtp+http+telnet)/1024 寫成 http=1024,smtp,http,telnet,+,+,/
    不懂 ?
    http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/tutorial/ 這裏可以參考,由於
    CDEF 太過複雜(其實這裏才是精髓),除了 +-*/ ,您可自行研究
    LINE{1|2|3}:vname[#rrggbb[:legend]]
    LINE1:your_var#rgb顏色值:圖例說明,這個 "your_var" 需存在 DEF 或 CDEF 的宣告中,
    AREA:vname[#rrggbb[:legend]]
    AREA 則是畫出資料數(shù)值至 0 之間的區(qū)磈圖
    STACK:vname[#rrggbb[:legend]]
    STACK 則是表現(xiàn)在的圖的值,疊在上一個值上
    請注意,如果使用 AREA/STACK 時需特別注意圖蓋圖的問題,一定要先畫大的值,
    再畫小的值,才會有層次的效果,不然,最大的數(shù)據(jù)若最後畫,是直接壓過去哦

    COMMENT 說明欄字,如 COMMENT:"Last Updated" 將在圖上產生該文字,可以用 \n 等換行符號
    GPRINT GPRINT:vname:CF:format vname 即DEF 中的 your_var,而 CF 看你要輸出的文字是
    AVERAGE/MAX/MIN/LAST 等數(shù)值,format 如同 printf 中的格式,
    EX:
    GPRINT:telnet:AVERAGE:"%10.0lf \n"
    意即要輸出這段時間中 (-s ~ -e 中,telnet的平均值,%10.0lf 則是為了好算位置)
    如果你不懂 printf, man 一下會比我解釋一大堆來得快.


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

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

    image_path=/home/httpd/html/enum/study
    now=`date "+%Y/%m/%d %H:%M:%S"`
    start_time=`date -d "2003/08/12 19:00" +%s`
    time="hour day week month year"
    for t in $time
    do
    /usr/local/bin/rrdtool graph $image_path/example-$t.png \
    --title "本機重要 port 流量"? ?\
    DEF:t1=$RRD_PATH:telnet:AVERAGE \
    DEF:t2=$RRD_PATH:smtp:AVERAGE \
    DEF:t3=$RRD_PATH:domain:AVERAGE \
    DEF:t4=$RRD_PATH:http:AVERAGE \
    DEF:t5=$RRD_PATH:total:AVERAGE \
    CDEF:v1=t1,t2,t3,t4,+,+,+ \
    CDEF:v2=t1,t2,t3,+,+ \
    CDEF:v3=t1,t2,+ \
    CDEF:v4=t1 \
    CDEF:v5=t5,1024,/ \
    COMMENT:"各 PORT 流量統(tǒng)計---最大------平均-------最小-------?#123;在\n" ? ?\
    AREA:v1#339966:"HTTP" \
    GPRINT:t4:MAX:"? ? ? %12.0lf "? \
    GPRINT:t4:AVERAGE:"%12.0lf "? ? ? ? ? ? \
    GPRINT:t4:MIN:"%12.0lf "? ? ? ? ? ? ? ? \
    GPRINT:t4:LAST:"%12.0lf \n"? ? ? ? ? ? ? ?\
    AREA:v2#ffff00:"DNS"? ? ? ? \
    GPRINT:t3:MAX:"? ? ? ?%12.0lf "? \
    GPRINT:t3:AVERAGE:"%12.0lf "? ? ? ? ? ? \
    GPRINT:t3:MIN:"%12.0lf "? ? ? ? ? ? ? ? \
    GPRINT:t3:LAST:"%12.0lf \n"? ? ? ? ? ? ? ?\
    AREA:v3#FF0000:"SMTP"? ? ? ? \
    GPRINT:t2:MAX:"? ? ? %12.0lf "? \
    GPRINT:t2:AVERAGE:"%12.0lf "? ? ? ? ? ? \
    GPRINT:t2:MIN:"%12.0lf "? ? ? ? ? ? ? ? \
    GPRINT:t2:LAST:"%12.0lf \n"? ? ? ? ? ? ? ?\
    AREA:v4#0000ff:"TELNET"? ? ? ? \
    GPRINT:t1:MAX:"? ? %12.0lf "? \
    GPRINT:t1:AVERAGE:"%12.0lf "? ? ? ? ? ? \
    GPRINT:t1:MIN:"%12.0lf "? ? ? ? ? ? ? ? \
    GPRINT:t1:LAST:"%12.0lf \n"? ? ? ? ? ? ? ?\
    LINE2:v5#000000:"全部(Kb)"? ? ? ? \
    GPRINT:v5:MAX:"? %12.0lf "? \? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
    GPRINT:v5:AVERAGE:"%12.0lf "? ? ? ? ? ? \
    GPRINT:v5:MIN:"%12.0lf "? ? ? ? ? ? ? ? \
    GPRINT:v5:LAST:"%12.0lf \n"? ? ? ? ? ? ? ?\
    COMMENT:"\n" \
    COMMENT:"\n" \
    COMMENT:"? ? Last Updated:? $now" \
    -v "per second (bytes)" -M -U 10 \
    -Y -X b -h 200 -w 480 -s `date -d "-1 $t" +%s`
    done


    hour:


    day:


    week:


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

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

    6.4 Question: 如何抓 CISCO Switch(假設 24 port) 每個 port 流量呢 ?
    6.4.1 方法一
    代碼:

    # 先使用 mrtg 產生 cfg 檔
    cfgmaker Community_String@Switch_or_Router_IP > mrtg.cfg

    再來修改 mrtg.cfg , 加入這三行,在最前面
    代碼:

    # 表示使用 rrdtool 來做 data 的 log , 而不使用 log file
    LogFormat: rrdtool? ?
    # rrdtool 所在路徑,如果你裝 rrdtool 的 prefix=/usr 那就是在 /usr/bin 下
    PathAdd: /usr/bin/
    # 自己找 RRDs.pm 在哪,如果 prefix=/usr 那大概就是在下面這個 path
    LibAdd: /usr/lib/perl/


    再來,只要跑 mrtg mrtg.cfg ,那 mrtg 就幫你建好 rrd 檔在 LogDir 內(一般同 WorkDir: ),
    代碼:

    [root@log mrtg]# mrtg /etc/mrtg/mrtg.cfg
    [root@log mrtg]# ls -la *.rrd?
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_10.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_11.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_12.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_13.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_14.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_15.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_16.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_17.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_18.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_19.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_1.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_20.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_21.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_22.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_23.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_24.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_2.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_3.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_4.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_5.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_6.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_7.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_8.rrd
    -rw-r--r--? ? 1 nobody? ?users? ? ? ?84740 May 27 15:15 168.95.1.253_9.rrd


    再來,我會百分之百建議到 http://my14all.sourceforge.net/ 抓 14all.cgi 來繪圖.
    請辨明上述網站上的版本說明,14all.cgi 抓回來後要修改三個地方
    代碼:

    #..前略
    #if MRTG_lib.pm (from mrtg) is not in the module search path (@INC)
    # uncomment the following line and change the path appropriatly:
    # 修改這個,找你的 mrtg 的 lib 的路徑在哪裏,建議您將 mrtg 的 pm
    # 皆 copy 到 perl modules 的所在目錄
    use lib qw(MRTG_lib.pm);

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

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

    # 後略


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


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

    6.4.2 用自己寫的方法
    建檔的方式就不在說明,上述的 mrtg 產生的 .rrd file 一個就 ds0 (in), 一個叫 ds1(out),所以我
    們可以直接拿來使用,並使用 mrtg 會 collection 的 tool,而不用像前面 tcpdump 的例子自己寫
    update 語法 (當然,你喜歡也可以囉)
    代碼:

    [root@log mrtg]# rrdtool info 192.168.0.253_1.rrd
    filename = "192.168.0.253_1.rrd"
    rrd_version = "0001"
    step = 300
    last_update = 1117181102
    ds[ds0].type = "COUNTER"
    ds[ds0].minimal_heartbeat = 600
    ds[ds0].min = 0.0000000000e+00
    ds[ds0].max = 1.2500000000e+06
    ds[ds0].last_ds = "3689202706"
    ds[ds0].value = 1.0680042424e+05
    ds[ds0].unknown_sec = 0
    ds[ds1].type = "COUNTER"
    ds[ds1].minimal_heartbeat = 600
    ds[ds1].min = 0.0000000000e+00
    ds[ds1].max = 1.2500000000e+06
    ds[ds1].last_ds = "3880427199"
    ds[ds1].value = 2.7916855892e+05
    ds[ds1].unknown_sec = 0
    #後略

    我相信前面的 rrdtool create 介紹您有看懂,這裏一定不會有問題,有問題的話,請在從頭看起.
    利用原來的東西畫圖
    代碼:

    #!/bin/sh
    INTERFACE=$1
    RRDFILE="/www/htdocs/mrtg/192.168.0.253_$INTERFACE.rrd"

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

    畫出來的樣子:

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

    代碼:

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

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


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


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

    6.5 描繪每部 DNS 的回應狀況
    敝人專注於 DNS 之研究,所以回到老本行,我們看看如何來呈現(xiàn)此一問題
    代碼:

    # rrdtool 建檔語法,您可以一部 DNS 建一個 rrd file ,
    rrdtool create /root/study/dnsquery.rrd -s 60? ?\
    DS:a:GAUGE:600:-100:10000 \
    DS:b:GAUGE:600:-100:10000 \
    DS:c:GAUGE:600:-100:10000 \
    DS:d:GAUGE:600:-100:10000 \
    DS:ns:GAUGE:600:-100:10000 \
    DS:f:GAUGE:600:-100:10000 \
    DS:g:GAUGE:600:-100:10000 \
    RRA:AVERAGE:0.5:1:14400 \
    RRA:AVERAGE:0.5:6:4800? ? ? ? ? \
    RRA:AVERAGE:0.5:24:1200? ? ? ? ?\
    RRA:AVERAGE:0.5:288:600? ? ? ? ?\
    RRA:MAX:0.5:1:14400? ? ?\
    RRA:MAX:0.5:6:4800? ? ? ? ? ? ? \
    RRA:MAX:0.5:24:1200? ? ? ? ? ? ?\
    RRA:MAX:0.5:288:600


    取值及畫圖
    代碼:


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

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



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

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



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

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

    #httpd.conf 部份內容
    LoadModule watch_module? ? ? ?modules/mod_watch.so
    <IfModule mod_watch.c>
    ? <Location /watch-info>
    ? SetHandler watch-info
    ? </Location>
    ? <Location /watch-table>
    ? SetHandler watch-table
    ? </Location>
    </IfModule>
    VirtualDocumentRoot /www/htdocs/%0
    VirtualScriptAlias? /www/htdocs/%0/cgi-bin/

    我們可以試以下列指令求得某一個 VH 的流量
    代碼:

    [root@log study]# /usr/local/sbin/mod_watch.pl -f ifInOctets,ifOutOctets http://my_someone_virtual_host/watch-info
    4538020
    235836805
    4.37
    my_someone_virtual_host

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

    代碼:

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


    代碼:

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

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

    結果


    發(fā)現(xiàn)沒 ? 什麼問題呢 ? 仔細想想為什麼 Request/Document 值為 0 呢 !? 該如何解決.....



    7. 結語
    該說的前面都說了,想不想學 rrdtool 完全看你對系統(tǒng)的掌握度...本來是只介紹 rrdtool 的,不過想說
    寫多點,就 mrtg/14all.cgi 寫多點了. mrtg/rrd/14all.cgi 摸熟, 對你會很有幫助...官網是一定要去
    的地方,不要只看什麼教學文件..那很難學得透徹.
    posted on 2006-07-06 13:52 地獄男爵(hellboys) 閱讀(1322) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網站導航:
     
    <2006年7月>
    2526272829301
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    常用鏈接

    隨筆分類

    隨筆檔案

    文章檔案

    相冊

    連接

    最新隨筆

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产成人综合亚洲一区| 99精品视频免费| avtt亚洲天堂| 免费国产叼嘿视频大全网站| 亚洲国产av一区二区三区丶| 四虎影视精品永久免费网站| 在线毛片片免费观看| 亚洲大香伊人蕉在人依线| 日韩毛片免费在线观看| 国产在线观看无码免费视频| 亚洲理论片中文字幕电影| 免费播放美女一级毛片 | 亚洲最大黄色网址| 日本媚薬痉挛在线观看免费| 日韩av无码免费播放| 亚洲一区二区无码偷拍| 亚洲无线观看国产精品| 免费国产黄线在线观看| 亚洲免费在线观看| 狠狠色伊人亚洲综合网站色| 亚洲欭美日韩颜射在线二| 午夜两性色视频免费网站| 三年片在线观看免费| 立即播放免费毛片一级| 亚洲Aⅴ无码专区在线观看q| 哒哒哒免费视频观看在线www| 99精品视频在线观看免费专区| 亚洲a∨国产av综合av下载| 精品日韩亚洲AV无码一区二区三区| 国产18禁黄网站免费观看| 9277手机在线视频观看免费| 九九全国免费视频| 亚洲熟妇少妇任你躁在线观看| 久久精品国产96精品亚洲 | 国产在线19禁免费观看国产| 久久久久免费看黄a级试看| 人体大胆做受免费视频| 亚洲中文无码永久免费| 亚洲欧洲日韩国产| 亚洲s色大片在线观看| 亚洲高清偷拍一区二区三区|