免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 37190 | 回复: 28
打印 上一主题 下一主题

[教學]中的教學(一) RRDTOOL (像 mrtg 的東西)完全攻略 [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-05-27 18:58 |只看该作者 |倒序浏览
rrdtool 教學
歡迎轉載 ,但有任何修改請來信告知,不得作為商業用途
作者: abelyang <abelyang{at}twnic{dot}net{dot}tw>;
version: 1.0
最後修正時間: 2005/05/26 00:10
轉載時請保持此一宣告


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

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

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


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


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


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

使用 rrdtool 匯整:

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


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

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

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

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

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

  1. 每五鐘值存 603 筆,再來是
  2. 30 分鐘存 603 筆
  3. 2 小時值存 603 筆
  4. 一天值存 800 筆
复制代码

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

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

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


  12. # mrtg Threshold Check , 定義 Alert 所在目錄,及 Alert 值,Alert 程式
  13. ThreshDir: /www/htdocs//mrtg/alert/
  14. #依我的程式,本例為 SoftSwitch CPU 每分鐘佔用超過 10 秒,以 MSN 傳送訊息給相關管理者,並從
  15. #remote 重開 daemon service
  16. ThreshMaxI[sg-apol-mgcd]: 1000
  17. ThreshProgI[sg-apol-mgcd]:/www/htdocs/snmp.enum.org.tw/mrtg/alert/send_MSN.sh
复制代码


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

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

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

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

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


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

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

  1. CDEF:la60u=la60,1000,GT,1000,la60,IF
复制代码

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

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


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

4. rrdtool 建檔語法 (rrdtool create)

rrdtool create filename
[--start|-b start time]
[--step|-s step]
[DS:ds-nameST]
[RRA:CF]


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

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

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

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

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

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

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

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


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

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

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

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

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



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


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


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

  1. rrdtool create /root/study/tcpdump.rrd -s 300 -b `date -d "-1 month" +%s` \
  2. DS:telnet:GAUGE:600:0:10000000 \
  3. DS:smtp:GAUGE:600:0:10000000 \
  4. DS:domain:GAUGE:600:0:10000000 \
  5. DS:http:GAUGE:600:0:10000000 \
  6. DS:pop3:GAUGE:600:0:10000000 \
  7. DS:total:GAUGE:600:0:10000000 \
  8. RRA:AVERAGE:0.5:1:603 \
  9. RRA:AVERAGE:0.5:6:603          \
  10. RRA:AVERAGE:0.5:24:603         \
  11. RRA:AVERAGE:0.5:288:800         \
  12. RRA:MAX:0.5:1:603 \
  13. RRA:MAX:0.5:6:603 \
  14. RRA:MAX:0.5:24:603 \
  15. RRA:MAX:0.5:288:800
复制代码


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

5.更新 RRD 資料 (rrdtool update)

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


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

  1. $>;rrdtool update tcpdump.rrd  1061811856:114:0:50:1199:0:821073
复制代码

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

  1. $>;timestamp=`date +%s `
复制代码

來轉現在秒數,如果是某些特定時間,則可以

  1. $>;timestamp=`date -d "2003/08/15 12:00" +%s`
复制代码


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


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

6.1 LINE{1|2|3} 圖例

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

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


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

6.2 AREA,CDEF 圖例

  1. #或如下 (畫出時,天,週,的流量圖)
  2. #filename: tcpdump-graph.sh
  3. RRD_PATH="/root/study/tcpdump.rrd"
  4. image_path="/root/study/html"
  5. image_path=/home/httpd/html/enum/study
  6. now=`date "+%Y/%m/%d %H:%M:%S"`
  7. start_time=`date -d "2003/08/12 19:00" +%s`
  8. time="hour day week "
  9. for t in $time
  10. do
  11. /usr/local/bin/rrdtool graph $image_path/example-$t.png \
  12. --title "本機重要 port 流量統計" \
  13. DEF:t1=$RRD_PATH:telnet:AVERAGE \
  14. DEF:t2=$RRD_PATH:smtp:AVERAGE \
  15. DEF:t3=$RRD_PATH:domain:AVERAGE \
  16. DEF:t4=$RRD_PATH:http:AVERAGE \
  17. DEF:t5=$RRD_PATH:total:AVERAGE \
  18. CDEF:v1=t1,t2,t3,t4,+,+,+ \
  19. CDEF:v2=t1,t2,t3,+,+ \
  20. CDEF:v3=t1,t2,+ \
  21. CDEF:v4=t1 \
  22. CDEF:v5=t5,1024,/ \
  23. AREA:v1#339966:"HTTP" \
  24. AREA:v3#FF0000:"SMTP"        \
  25. AREA:v4#0000ff:"TELNET"        \
  26. LINE2:v5#000000:"Total(Kb)"        \
  27. COMMENT:"\n" \
  28. COMMENT:"Last Updated:  $now" \
  29. -v "per second (bytes)" -M -U 10 \
  30. -Y -X b -h 200 -w 480 -s `date -d "-1 $t" +%s` -b 1024
  31. done               
复制代码

流量小時圖:


流量日圖


流量週圖


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

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

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

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

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


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

  1. #tcpdump.sh
  2. RRD_PATH="/root/study/tcpdump.rrd"
  3. image_path="/root/study/html"
  4. sec=300
  5. killall tcpdump
  6. mv ip.packet ip.packet.1
  7. tcpdump -w ip.packet  tcp or udp or icmp &
  8. scan_port="23 25 53 80 110"
  9. rrd_data=""
  10. for sport in $scan_port
  11. do
  12.         port=`tcpdump -r ip.packet.1 port $sport -v | sed -e 's/.*, len \(.*\))/
  13. \1/g' |  tr '\n' '+'`
  14.         port=`echo ${port}0| bc`
  15.         port=`expr $port / $sec`
  16.         rrd_data="$rrd_data$port:"
  17. done
  18. total=`tcpdump -r ip.packet.1 -v  |grep -v 'config'| sed -e 's/.*, len \(.*\))/\
  19. 1/g'  |  tr '\n' '+'`
  20. total=` echo ${total}0 | bc`
  21. now=`date +%s`
  22. echo "rrdtool update tcpdump.rrd $now:$rrd_data$total" >;>;tcpdump.cmd
  23. rrdtool update tcpdump.rrd $now:$rrd_data$total

  24. image_path=/home/httpd/html/enum/study
  25. now=`date "+%Y/%m/%d %H:%M:%S"`
  26. start_time=`date -d "2003/08/12 19:00" +%s`
  27. time="hour day week month year"
  28. for t in $time
  29. do
  30. /usr/local/bin/rrdtool graph $image_path/example-$t.png \
  31. --title "本機重要 port 流量"        \
  32. DEF:t1=$RRD_PATH:telnet:AVERAGE \
  33. DEF:t2=$RRD_PATH:smtp:AVERAGE \
  34. DEF:t3=$RRD_PATH:domain:AVERAGE \
  35. DEF:t4=$RRD_PATH:http:AVERAGE \
  36. DEF:t5=$RRD_PATH:total:AVERAGE \
  37. CDEF:v1=t1,t2,t3,t4,+,+,+ \
  38. CDEF:v2=t1,t2,t3,+,+ \
  39. CDEF:v3=t1,t2,+ \
  40. CDEF:v4=t1 \
  41. CDEF:v5=t5,1024,/ \
  42. COMMENT:"各 PORT 流量統計---最大------平均-------最小-------?#123;在\n"         \
  43. AREA:v1#339966:"HTTP" \
  44. GPRINT:t4:MAX:"      %12.0lf "  \
  45. GPRINT:t4:AVERAGE:"%12.0lf "            \
  46. GPRINT:t4:MIN:"%12.0lf "                \
  47. GPRINT:t4:LAST:"%12.0lf \n"               \
  48. AREA:v2#ffff00:"DNS"        \
  49. GPRINT:t3:MAX:"       %12.0lf "  \
  50. GPRINT:t3:AVERAGE:"%12.0lf "            \
  51. GPRINT:t3:MIN:"%12.0lf "                \
  52. GPRINT:t3:LAST:"%12.0lf \n"               \
  53. AREA:v3#FF0000:"SMTP"        \
  54. GPRINT:t2:MAX:"      %12.0lf "  \
  55. GPRINT:t2:AVERAGE:"%12.0lf "            \
  56. GPRINT:t2:MIN:"%12.0lf "                \
  57. GPRINT:t2:LAST:"%12.0lf \n"               \
  58. AREA:v4#0000ff:"TELNET"        \
  59. GPRINT:t1:MAX:"    %12.0lf "  \
  60. GPRINT:t1:AVERAGE:"%12.0lf "            \
  61. GPRINT:t1:MIN:"%12.0lf "                \
  62. GPRINT:t1:LAST:"%12.0lf \n"               \
  63. LINE2:v5#000000:"全部(Kb)"        \
  64. GPRINT:v5:MAX:"  %12.0lf "  \                             
  65. GPRINT:v5:AVERAGE:"%12.0lf "            \
  66. GPRINT:v5:MIN:"%12.0lf "                \
  67. GPRINT:v5:LAST:"%12.0lf \n"               \
  68. COMMENT:"\n" \
  69. COMMENT:"\n" \
  70. COMMENT:"    Last Updated:  $now" \
  71. -v "per second (bytes)" -M -U 10 \
  72. -Y -X b -h 200 -w 480 -s `date -d "-1 $t" +%s`
  73. done
复制代码


hour:


day:


week:


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

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

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

  1. # 先使用 mrtg 產生 cfg 檔
  2. cfgmaker Community_String@Switch_or_Router_IP >; mrtg.cfg
复制代码

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

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


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

  1. [root@log mrtg]# mrtg /etc/mrtg/mrtg.cfg
  2. [root@log mrtg]# ls -la *.rrd  
  3. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_10.rrd
  4. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_11.rrd
  5. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_12.rrd
  6. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_13.rrd
  7. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_14.rrd
  8. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_15.rrd
  9. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_16.rrd
  10. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_17.rrd
  11. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_18.rrd
  12. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_19.rrd
  13. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_1.rrd
  14. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_20.rrd
  15. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_21.rrd
  16. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_22.rrd
  17. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_23.rrd
  18. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_24.rrd
  19. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_2.rrd
  20. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_3.rrd
  21. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_4.rrd
  22. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_5.rrd
  23. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_6.rrd
  24. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_7.rrd
  25. -rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_8.rrd
  26. -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 抓回來後要修改三個地方

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

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

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

  22. # 後略
复制代码


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


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

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

  1. [root@log mrtg]# rrdtool info 192.168.0.253_1.rrd
  2. filename = "192.168.0.253_1.rrd"
  3. rrd_version = "0001"
  4. step = 300
  5. last_update = 1117181102
  6. ds[ds0].type = "COUNTER"
  7. ds[ds0].minimal_heartbeat = 600
  8. ds[ds0].min = 0.0000000000e+00
  9. ds[ds0].max = 1.2500000000e+06
  10. ds[ds0].last_ds = "3689202706"
  11. ds[ds0].value = 1.0680042424e+05
  12. ds[ds0].unknown_sec = 0
  13. ds[ds1].type = "COUNTER"
  14. ds[ds1].minimal_heartbeat = 600
  15. ds[ds1].min = 0.0000000000e+00
  16. ds[ds1].max = 1.2500000000e+06
  17. ds[ds1].last_ds = "3880427199"
  18. ds[ds1].value = 2.7916855892e+05
  19. ds[ds1].unknown_sec = 0
  20. #後略
复制代码

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

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

  4. date_range="day week month year"
  5. for t in $date_range
  6. do
  7. rrdtool graph /www/htdocs/mrtg/sample1_$t.png \
  8. --title "Switch ($SWITCH) #$INTERFACE 流量"  \
  9. -s `date -d "-1 $t" +%s`        \
  10. DEF:in=$RRDFILE:ds0:AVERAGE     \
  11. DEF:out=$RRDFILE:ds1:AVERAGE    \
  12. COMMENT:"In/Out         MAX        AVG         NOW \n"  \
  13. AREA:in#00ff00:"In ": \
  14.         GPRINT:in:MAX:"%10.0lf"  \
  15.         GPRINT:in:AVERAGE:"%10.0lf"  \
  16.         GPRINT:in:LAST:"%10.0lf\n"  \
  17. LINE2:out#0000ff:"Out": \
  18.         GPRINT:out:MAX:"%10.0lf"  \
  19.         GPRINT:out:AVERAGE:"%10.0lf"  \
  20.         GPRINT:out:LAST:"%10.0lf"  \
  21. -w 600 -h 150
  22. done
复制代码

畫出來的樣子:

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


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

  5. date_range="day week month year"
  6. for t in $date_range
  7. do
  8. rrdtool graph /www/htdocs/snmp.enum.org.tw/images/sample2_$t.png \
  9. --title "Switch  #14/#15 INTERFACE 流量"  \
  10. -s `date -d "-1 $t" +%s`        \
  11. DEF:in1=$RRDFILE1:ds0:AVERAGE   \
  12. DEF:in2=$RRDFILE2:ds0:AVERAGE   \
  13. DEF:out1=$RRDFILE1:ds1:AVERAGE  \
  14. DEF:out2=$RRDFILE2:ds1:AVERAGE  \
  15. CDEF:n_out1=out1,-1,*   \
  16. CDEF:n_out2=out2,-1,*   \
  17. COMMENT:"In/Out         MAX        AVG         NOW \n"  \
  18. AREA:in1#ff0000:"In14 ": \
  19.         GPRINT:in1:MAX:"%10.0lf"  \
  20.         GPRINT:in1:AVERAGE:"%10.0lf"  \
  21.         GPRINT:in1:LAST:"%10.0lf\n"  \
  22. STACK:in2#00ff00:"In15 ": \
  23.         GPRINT:in2:MAX:"%10.0lf"  \
  24.         GPRINT:in2:AVERAGE:"%10.0lf"  \
  25.         GPRINT:in2:LAST:"%10.0lf\n"  \
  26. AREA:n_out1#ff0000:"In14 ": \
  27.         GPRINT:out1:MAX:"%10.0lf"  \
  28.         GPRINT:out1:AVERAGE:"%10.0lf"  \
  29.         GPRINT:out1:LAST:"%10.0lf\n"  \
  30. STACK:n_out2#00ff00:"In15 ": \
  31.         GPRINT:out2:MAX:"%10.0lf"  \
  32.         GPRINT:out2:AVERAGE:"%10.0lf"  \
  33.         GPRINT:out2:LAST:"%10.0lf\n"  \
  34. -w 600 -h 150
  35. done

复制代码

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


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

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

  1. # rrdtool 建檔語法,您可以一部 DNS 建一個 rrd file , 也可以合在一起建
  2. rrdtool create /root/study/dnsquery.rrd -s 60   \
  3. DS:a:GAUGE:600:-100:10000 \
  4. DS:b:GAUGE:600:-100:10000 \
  5. DS:c:GAUGE:600:-100:10000 \
  6. DS:d:GAUGE:600:-100:10000 \
  7. DS:ns:GAUGE:600:-100:10000 \
  8. DS:f:GAUGE:600:-100:10000 \
  9. DS:g:GAUGE:600:-100:10000 \
  10. RRA:AVERAGE:0.5:1:14400 \
  11. RRA:AVERAGE:0.5:6:4800          \
  12. RRA:AVERAGE:0.5:24:1200         \
  13. RRA:AVERAGE:0.5:288:600         \
  14. RRA:MAX:0.5:1:14400     \
  15. RRA:MAX:0.5:6:4800              \
  16. RRA:MAX:0.5:24:1200             \
  17. RRA:MAX:0.5:288:600
复制代码


取值及畫圖


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

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



  20. time="day week "
  21. for t in $time
  22. do
  23. rrdtool graph $IMAGE_PATH/dnsquery-$t.jpg \
  24. -t "DNS Query Response Time (${t}ly)" \
  25. -w 600 -h 250 -s `date -d "-1 $t" +%s`  -v "msec"  -X b         \
  26.         DEF:a=dnsquery.rrd:a:MAX        \
  27.         DEF:b=dnsquery.rrd:b:MAX        \
  28.         DEF:c=dnsquery.rrd:c:MAX        \
  29.         DEF:d=dnsquery.rrd:d:MAX        \
  30.         DEF:ns=dnsquery.rrd:ns:MAX      \
  31.         DEF:f=dnsquery.rrd:f:MAX        \
  32.         DEF:g=dnsquery.rrd:g:MAX        \
  33.         CDEF:z0=-1,a,b,c,d,ns,f,g,+,+,+,+,+,+,7,/,*     \
  34.         CDEF:a1=a,3000,+        \
  35.         CDEF:a11=3000,a,a,-,+   \
  36.         CDEF:b1=b,2500,+        \
  37.         CDEF:b11=2500,a,a,-,+   \
  38.         CDEF:c1=c,2000,+        \
  39.         CDEF:c11=2000,a,a,-,+   \
  40.         CDEF:d1=d,1500,+        \
  41.         CDEF:d11=1500,a,a,-,+   \
  42.         CDEF:ns1=ns,1000,+      \
  43.         CDEF:ns11=1000,a,a,-,+  \
  44.         CDEF:f1=f,500,+         \
  45.         CDEF:f11=500,a,a,-,+    \
  46.         CDEF:g1=g,              \
  47.         AREA:z0#c0c0c0:"Average Response Time(msec)"    \
  48.         COMMENT:"\n"    \
  49.         AREA:a1#ff0000:"a.dns.tw"       \
  50.         GPRINT:a:MAX:"%12.0lf"          \
  51.         GPRINT:a:AVERAGE:"%12.0lf"      \
  52.         GPRINT:a:MIN:"%12.0lf"          \
  53.         GPRINT:a:LAST:"%12.0lf\n"       \
  54.         AREA:a11#ffffff                 \
  55.         AREA:b1#800000:"b.dns.tw"       \
  56.         GPRINT:b:MAX:"%12.0lf"          \
  57.         GPRINT:b:AVERAGE:"%12.0lf"      \
  58.         GPRINT:b:MIN:"%12.0lf"          \
  59.         GPRINT:b:LAST:"%12.0lf\n"       \
  60.         AREA:b11#ffffff                 \
  61.         AREA:c1#00ff00:"c.dns.tw"       \
  62.         GPRINT:c:MAX:"%12.0lf"          \
  63.         GPRINT:c:AVERAGE:"%12.0lf"      \
  64.         GPRINT:c:MIN:"%12.0lf"          \
  65.         GPRINT:c:LAST:"%12.0lf\n"       \
  66.         AREA:c11#ffffff                 \
  67.         AREA:d1#008000:"d.dns.tw"       \
  68.         GPRINT:d:MAX:"%12.0lf"          \
  69.         GPRINT:d:AVERAGE:"%12.0lf"      \
  70.         GPRINT:d:MIN:"%12.0lf"          \
  71.         GPRINT:d:LAST:"%12.0lf\n"       \
  72.         AREA:d11#ffffff                 \
  73.         AREA:ns1#0000ff:"ns.twnic.net"  \
  74.         GPRINT:ns:MAX:"%8.0lf"          \
  75.         GPRINT:ns:AVERAGE:"%12.0lf"     \
  76.         GPRINT:ns:MIN:"%12.0lf"         \
  77.         GPRINT:ns:LAST:"%12.0lf\n"      \
  78.         AREA:ns11#ffffff                \
  79.         AREA:f1#000080:"f.dns.tw"       \
  80.         GPRINT:f:MAX:"%12.0lf"          \
  81.         GPRINT:f:AVERAGE:"%12.0lf"      \
  82.         GPRINT:f:MIN:"%12.0lf"          \
  83.         GPRINT:f:LAST:"%12.0lf\n"       \
  84.         AREA:f11#ffffff                 \
  85.         AREA:g1#ff8040:"g.dns.tw"       \
  86.         GPRINT:g1:MAX:"%12.0lf"         \
  87.         GPRINT:g1:AVERAGE:"%12.0lf"     \
  88.         GPRINT:g1:MIN:"%12.0lf"         \
  89.         GPRINT:g1:LAST:"%12.0lf\n"      \
  90.         COMMENT:"note:<0 means no response\n"
  91. done
复制代码

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



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

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

  1. #httpd.conf 部份內容
  2. LoadModule watch_module       modules/mod_watch.so
  3. <IfModule mod_watch.c>;
  4.   <Location /watch-info>;
  5.   SetHandler watch-info
  6.   </Location>;
  7.   <Location /watch-table>;
  8.   SetHandler watch-table
  9.   </Location>;
  10. </IfModule>;
  11. VirtualDocumentRoot /www/htdocs/%0
  12. VirtualScriptAlias  /www/htdocs/%0/cgi-bin/
复制代码

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

  1. [root@log study]# /usr/local/sbin/mod_watch.pl -f ifInOctets,ifOutOctets http://my_someone_virtual_host/watch-info
  2. 4538020
  3. 235836805
  4. 4.37
  5. my_someone_virtual_host
复制代码

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


  1. # 建檔 ,請多注意 $1 用意
  2. #!/bin/sh
  3. vh=$1
  4. rrdtool create /root/study/mod_watch_$vh.rrd -s 300     \
  5. DS:in:COUNTER:600:0:100000000 \
  6. DS:out:COUNTER:600:0:100000000 \
  7. DS:req:COUNTER:600:0:100000000 \
  8. DS:doc:COUNTER:600:0:100000000 \
  9. DS:gabege:COUNTER:600:0:1 \
  10. RRA:AVERAGE:0.5:1:14400 \
  11. RRA:AVERAGE:0.5:6:4800          \
  12. RRA:AVERAGE:0.5:24:1200         \
  13. RRA:AVERAGE:0.5:288:600         \
  14. RRA:MAX:0.5:1:14400     \
  15. RRA:MAX:0.5:6:4800              \
  16. RRA:MAX:0.5:24:1200             \
  17. RRA:MAX:0.5:288:600
复制代码


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

  10. for t in day week month year
  11. do
  12. rrdtool graph $IMAGE_PATH/mod_watch_${vh}_${t}.png -t "mod_watch 範例" \
  13. -s `date -d "-1 $t" +%s`        \
  14. DEF:in=$RRDFILE:in:AVERAGE      \
  15. DEF:out=$RRDFILE:out:AVERAGE    \
  16. DEF:req=$RRDFILE:req:AVERAGE    \
  17. DEF:doc=$RRDFILE:doc:AVERAGE    \
  18. AREA:in#00ff00:"流入      "     \
  19.         GPRINT:in:MAX:"%12.0lf"          \
  20.         GPRINT:in:AVERAGE:"%12.0lf"      \
  21.         GPRINT:in:MIN:"%12.0lf"          \
  22.         GPRINT:in:LAST:"%12.0lf\n"       \
  23. LINE1:out#0000ff:"流出    "     \
  24.         GPRINT:out:MAX:"%12.0lf"          \
  25.         GPRINT:out:AVERAGE:"%12.0lf"      \
  26.         GPRINT:out:MIN:"%12.0lf"          \
  27.         GPRINT:out:LAST:"%12.0lf\n"       \
  28. LINE1:req#ff0000:"Request "     \
  29.         GPRINT:req:MAX:"%12.0lf"          \
  30.         GPRINT:req:AVERAGE:"%12.0lf"      \
  31.         GPRINT:req:MIN:"%12.0lf"          \
  32.         GPRINT:req:LAST:"%12.0lf\n"       \
  33. LINE1:doc#800000:"Document"     \
  34.         GPRINT:doc:MAX:"%12.0lf"          \
  35.         GPRINT:doc:AVERAGE:"%12.0lf"      \
  36.         GPRINT:doc:MIN:"%12.0lf"          \
  37.         GPRINT:doc:LAST:"%12.0lf\n"       \
  38. -w 400 -h 100
  39. done
复制代码

結果


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



7. 結語
該說的前面都說了,想不想學 rrdtool 完全看你對系統的掌握度...本來是只介紹 rrdtool 的,不過想說
寫多點,就 mrtg/14all.cgi 寫多點了. mrtg/rrd/14all.cgi 摸熟, 對你會很有幫助...官網是一定要去
的地方,不要只看什麼教學文件..那很難學得透徹.

註: 看不到圖不能怪我...

论坛徽章:
2
荣誉会员
日期:2011-11-23 16:44:17拜羊年徽章
日期:2015-03-03 16:15:43
2 [报告]
发表于 2005-05-27 19:19 |只看该作者

[教學]中的教學(一) RRDTOOL (像 mrtg 的東西)完全攻略

很好,学习!

论坛徽章:
0
3 [报告]
发表于 2005-05-27 21:33 |只看该作者

[教學]中的教學(一) RRDTOOL (像 mrtg 的東西)完全攻略

好帖,不过我已经用mrtg做了,但内存部分有问题,好好学习

论坛徽章:
0
4 [报告]
发表于 2005-05-27 22:42 |只看该作者

[教學]中的教學(一) RRDTOOL (像 mrtg 的東西)完全攻略

编译rrdtool的时候,提示缺少cgilib
下载了cgilib-0.5,不知道该如何装

cat readme
Using this Library
------------------
To use this library you need to include the cgi.h include file with the
following command into your C programs:

   #include <cgi.h>;

Additionally you'll have to add the library libcgi.a to the linker,
either by modifying LDFLAGS in your makefiles or by adding `-lcgi' to
the appropriate commandline.

Test Suite
----------

This library comes with a program called cgitest.c.  You can use it as
reference implementation for this CGI library.  Therefore it should be
included as source in your distribution.

If you want to test your forms you can use the following action.

   <form action=/cgi-bin/cgitest/listall method=post>;

The /listall target will display all environment variables, all CGI
variables and all HTTP Cookies that were transmitted.  This way you
can test your implementations quite easy.

Further Documentation
---------------------

  The CGI Library

    http://www.infodrom.north.de/cgilib/

  HTTP Return Codes

    http://www.w3.org/Protocols/HTTP/HTRESP.html

  HTTP Headers

    http://www.w3.org/Protocols/HTTP/Object_Headers.html

Feedback
--------

If you have additions, questions or improvements please don't hesitate
to contact me.

Infodrom Oldenburg
Martin Schulze
joey@infodrom.north.de



cat Makefile
#   Copyright (c) 1998,9 by Martin Schulze <joey@infodrom.north.de>;

#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.

#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.

#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.

CFLAGS = -I. -Wall -O2 -g
LDFLAGS = -L.
LIBS = -lcgi

OBJS = cgi.o cookies.o

libcgi.a: $(OBJS)
        ar rc $@ $^

cgitest: cgitest.o libcgi.a
        $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)

jumpto: jumpto.o libcgi.a
        $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)

all: libcgi.a cgitest jumpto

install: cgitest
        install -m 755 cgitest /usr/lib/cgi-bin

clean:
        rm -f cgitest cgitest.o jumpto jumpto.o libcgi.a $(OBJS) *.[35].html

htmlman:
        for f in *.[35]; do \
          man -l $$f|rman -f HTML --title $$f -r "%s.%s.html" >; $$f.html; \
        done

abelGG能否给个提示?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2005-05-28 16:22 |只看该作者

[教學]中的教學(一) RRDTOOL (像 mrtg 的東西)完全攻略

你的問題應是裝 1.2.x 版本的關係
我現在沒時間做清楚的回覆,
不過我們先建議你在 rrdtool 的 configure 時
加 --disable-rrdcgi  (或 cgi) .
可以讓 1.2 版的不使用  cgi

可以解決不能 make 的問題,等學會用了,再來處理 cgi 問題即可

论坛徽章:
0
6 [报告]
发表于 2005-05-28 21:56 |只看该作者

[教學]中的教學(一) RRDTOOL (像 mrtg 的東西)完全攻略

谢谢abelGG,使用了 --disable-rrdcgi 参数后,可以编译安装了
我可以继续学习了
再次谢谢ableGG

论坛徽章:
0
7 [报告]
发表于 2005-05-29 10:18 |只看该作者

[教學]中的教學(一) RRDTOOL (像 mrtg 的東西)完全攻略

abel 兄 能不能写一个简单点的。

我的怎么不能显是:
rrdtool graph speed.png
    --start 1117331184 --end 1117335600                       DEF:myspeed=test.rrd:speed:AVERAGE                      LINE2:myspeed#FF0000

rrdtool create test.rrd                        --start N --step 60                     DS:speed:COUNTER:600:U:U              RRA:AVERAGE:0.5:1:24                  RRA:AVERAGE:0.5:6:10

speed.gif (9.93 KB, 下载次数: 137)

speed.gif

论坛徽章:
0
8 [报告]
发表于 2005-05-29 12:51 |只看该作者

[教學]中的教學(一) RRDTOOL (像 mrtg 的東西)完全攻略

rrdtool update ...........

有一个rrdtool的集成环境cacti还不错,大家可以先熟悉这个东东。我也是刚刚处在学习阶段,大家共同进步吧

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2005-05-29 19:03 |只看该作者

[教學]中的教學(一) RRDTOOL (像 mrtg 的東西)完全攻略

上面我巳介紹,我想 bst 兄一定沒看仔細,我們建議您來回至少看十次才好
不然有些話的深意體會不到

而本篇也介紹了 CU 較少人提及的
MRTG Threshold Check  (Alert 機制,因為我看來看去所有的 mrtg 教學不過抄來抄去),因為這個功能讓你可以接外部程式,真的非常好用
mrtg+rrd , 用 14all.cgi 解法,若大家有研究,其實做出來後大概就比較不會有人想用 logfile 的 format, 而轉換 logfile 到 rrdtool 也有現成的工具

mod_watch , 這個東西絕對是看 Web Virtual Host 流量的好東西,遠比
mod_Accounting 好太多了,mod_Accounting 的 mysql session 太多

當然,你只要熟知 SNMP, 要畫什麼就有什麼,windows CPU Loading 都可以做得出來,完全看對工具的掌握度

過去所貼的幾個東西大家也可參考一下
http://chinaunix.net/jh/30/406037.html
http://bbs.chinaunix.net/forum/viewtopic.php?t=512493&highlight=RRDTOOL

rrdtool 1.0.x 版的中文化請看這篇
http://phorum.study-area.org/viewtopic.php?t=23822&highlight=rrdtool
請注意,這個做法不適用於 1.2.x 版本


另外如果你想看更多過去個人有關 rrdtool 的討論及說明,
建議您到網中人的網站
http://phorum.study-area.org
中 search "rrdtool" , 會有不少資料及 Troubleshooting 的問題
了解別人的問題,才能避免自己發生

至於您能了解到人麼程度,就看你的底子了

再貼一些個人成果:
http://211.72.210.251/sysinfo.html
Linux 主機資訊

Switch 流量

台灣的 Whois 流量


VoIP 的使用情形


怎麼用,就看您對數字的處理能力

论坛徽章:
0
10 [报告]
发表于 2005-05-29 20:24 |只看该作者

[教學]中的教學(一) RRDTOOL (像 mrtg 的東西)完全攻略

谢谢abel兄,更感谢给提供了这么好的一些资料。goole了一下机会找不到这些方面的资料。我先看看这些资料,不懂的地方在请教able兄。看了看英文资料有一些概念是真不好懂。再次感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP