Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1769591
  • 博文数量: 184
  • 博客积分: 10122
  • 博客等级: 上将
  • 技术积分: 5566
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-08 12:32
文章存档

2011年(1)

2008年(183)

我的朋友

分类: LINUX

2008-03-03 13:22:34

一)前言

使用RRDtool 我们最关心什么?当然是如何把数据画出来了。虽然前面谈了很多,但这些都是基础来的。掌握好了,可以让你在绘图时更加得心应手。

本来还有 RPN (反向波兰表达式)一节的,但考虑一下,觉得还是放到后面,先从基本的绘图讲起。

这一节的内容虽然很多,但基本都是实验性的内容,只要多试几次就可以了。

二、graph 操作的语法

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

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

CODE:
DEF:=::[:step=][:start=

其中 filename 就是你想要生成的图片文件的名称,默认是 png 。你可以通过选项修改图片的类型,可以有 PNG、SVG、EPS、PDF四种。

A)DEF 是 Definition (定义)的意思。定义什么呢?你要绘图,总要有数据源吧?DEF 就是告诉 RRDtool 从那个 RRD 中取出指定

    DS(eth0_in、eth0_out)的某个类型的统计值(还可以指定 resolution、start、end),并把这一切放入到一个变量 中 。
   
    你可能会感到奇怪,为什么还有一个 CF 字段?因为 RRA 有多种  CF 类型,有些 RRA 可能用来保存平均值、有些 RRA 可能用于统计最大值、
   
    最小值等等。所以你必须同时指定使用什么 CF 类型的 RRA的数据。至于 :start 和 :end 、:reduce 则用得比较少,最常用的就是 :step 了,
   
    它可以让你控制 RRDtool 从那个 RRA 中取数据。

B)VDEF 是 Variable Definition (变量定义)的意思。定义什么呢?记得 MRTG 在图表的下面有一个称之为 Legend 的部分吗?

    那里显示了1个或者2个 DS (MRTG 没有 DS 一说,这里是借用 RRDtool 的)的 “最大值”、“平均值”、“当前值”。这些值是如何
   
    计算的呢?
   
    RRDtool 中用 VDEF 来定义。这个变量专门存放某个 DS 某种类型的值,例如 eth0_in 的最大值、eht0_out 的当前值等。当你需要象
   
     MRTG  一样输出数字报表(Legend) 时,就可以在 GPRINT 子句(sub clause)中调用它。
   
   同样它也需要用一个变量来存放数值。要注意的是,旧版 的 RRDtool 中是用另外一种格式来达到相同的目的。新版的 RRDtool 则推荐使用
   
    VDEF   语句。但在使用过程中,却发现 VDEF 的使用反而造成了困扰。 例如你有5个 DS 要画,每个 DS 你都想输出最大值、最小值、平均值
   
    、当前值。  如果使用 VDEF ,则需要 4 * 5 = 20 个 VDEF 语句,这会造成极大的困扰。具体例子可以看第十一节“数字报表”部分。
   
C)CDEF 是 Calculation Define 的意思。使用过MRTG 的都会体会到一点,MRTG 的计算能力实在太差了。例如你有两个 Target ,

      一个是 eth0_in , 一个是 eth0_out,如果要把它们相加起来,再除以8,得出 bytes 为单位的值,如何计算呢?或者说你只想看
      
      eth0_in 中超过 10Mb/s 的那部分, 其余的不关心,又如何实现呢?因为 MRTG 不能对它从 log 取出来的数据进行修改,只能原
      
      原本本的表现,所以很难满足我们的要求。而使用 CDEF , 这一切都可以很容易的实现。CDEF 支持很多数学运算,甚至还支持简
      
      单的逻辑运算 if-then-else ,可以解决前面提到的第2个问题:如何只绘制你所关 心的数据。不过这一切都需要熟悉 RPN 的语法,
      
      所以我们放到下一节介绍,这一节就介绍如何把 RRDtool 中的数据以图表的方式显示出来。
      
      
三)选项分类

本部分我们按照官方文档的方式,把选项分成几大类,分为  :

A)Time range : 用于控制图表的X轴显示的起始/结束时间,也包括从RRA中提取指定时间的数据。

B)Labels :用于控制 X/Y 轴的说明文字。

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

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

E)Grid :用于控制 X/Y 轴的刻度如何显示。

F)Miscellaneous :其他选项。例如显示中文、水印效果等等。

G)Report :数字报表

需要说明的是,本篇当中并不是列出了所有选项的用法,只是列出较为常用的选项,如果想查看所有选项的的用法,可以到官方站点下载文档,

这里就不一一列出了,望各位见谅。


四)时间范围控制(Time Range)

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

既然要绘图,就应该有一个起始/结束的时间。Graph 操作中有 –s ,-e 选项。这两个选项即可以用于控制图表的 X 轴显示的时间范围,也可以用

于控制 RRDtool 从 RRA 中提取对应时间的数据。如果没有指定 –-end ,默认为 now;如果没有指定 –-start,则默认为1天前。如果两者都没有

指定,则图表默认显示从当前算起1天内的。数
回头看一下 DEF 中,也有 :start ,:end , :step ,这些和 –-start、--end、--step 之间有什么关系呢?

让我们先看 :step 和 –step之间的关系是如何的。

下面以 eth0.rrrd 为例,假设要绘制的时间范围 range 等于 end -start[

A)如果 0 <  ragne < 180000 (第一个 RRA 的时间覆盖范围) ,则默认从第1个RRA中取数据 :

     如果 DEF 中给出的 :step > 300 ,例如 1000 ,则从 resolution= 1000 的或者第一个高于 1000 的RRA 中挑选数据,由于 eth0.rrd 中没有
   
                                                     resolution = 1000 的 RRA,则 RRDtool 会从 resolution = 1200 的第2 RRA 中取数据。

     如果 DEF 中给出的 :step <= 300 ,例如 200 ,则 RRDtool 会忽略该设定,还是从第一个 RRA 中取数据。

B)如果 180000 < range < 720000  ,由于第一个RRA只能保存2天的数据,所以默认从第2个RRA中取数据 :

     如果 DEF 中给出的 :step > 1200 ,例如 1800,则 RRDtool 会从 resolution = 7200 的第3 RRA 中取数据

     如果 DEF 中给出 :step<= 1200,例如 300 ,则 RRDtool 会忽略,还是从第2个 RRA 中取数据

C)如果 720000 < range <  4320000 ,则默认从第三个 RRA 中取数据 :

     如果 DEF 中给出的 :step > 7200 ,例如 10000 ,则从第4个 RRA中取数据

     如果 DEF 中给出的 :step <= 7200 , 例如 1200 ,则忽略该值,并还是从第3 个 RRA 中取数据

D)如果 4320000 < range < 63072000 ,则默认从第4个 RRA 中取数据 :

     如果 DEF 中给出的 :step > 86400 ,则行为未知

     如果 DEF 中给出的 :step <=86400 ,则从第4个 RRA 中取数据

E)-S 选项可以直接控制 RRDtool 如何挑选 RRA 。

    例如 -S 1200 ,即使DEF 中不加 :setp ,则 RRDtool 会从第2个 RRA 中取数据,即使 rang < 180000

    如果 -S 和 :step 同时出现,则 :step 优先。

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

     默认情况下,如果 DEF 中不加 :start 和 :end ,则等于 –-start 和 –end

    如果 DEF 中定义了 :start 和 :end ,则以 :start 和 :end 为准。

实例1 :使用 –-start 指定 X 轴的起始时间

CODE:
[root@dns1 bob]# rrdtool graph 1.png \       
> --start now-120000 \        # 表示起始时间是当前时间往前 120000 秒,也就是 33 个小时左右
> DEF:value1=eth0.rrd:eth0_in:AVERAGE \         # 从eth0.rrd 中取出 eth0_in 的数据,CF 类型为 AVERAGE
> AREA:value1#ff0000        # 用“方块”的形式来绘制 value1 ,注意这里是用 value1 ,不是用 eth0_in
481x154                        # 如果 RRDtool 有绘图方面的语句,则这里显示图片大小,否则为 0x0。
[root@dns1 bob]#



可以看到 X 轴的文字有些是乱码,不过不要紧,你可以临时已用 env LANG=C rrdtool xxxx 来解决该问题,或者在后面用

–n 来设定 RRDtool 使用中文字体,就不会出现这样的情况了


实例2 :使用 :step 从第2个RRA中取数据

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

这里是 :step=1000,但 RRDtool 会取 :step=1200 的 第2个 RRA 的数据来绘图,可以和上面的 1.png 比较,发现比较平滑。




实例3 :使用 –S 从第2个RRA中取数据

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



可以看到和上面的图一样,说明 RRDtool 的确按照 -S 的设置从第2个RRA 中取数据了

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

实例4 :同时使用 –S 和 :step

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




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

实例5 :使用 :start 和 :end 只显示指定时间内的数据

CODE:
[root@dns1 bob]# rrdtool graph 1.png \
> --start now-1h \                        # X 轴显示1个小时的长度
> DEF:value1=eth0.rrd:eth0_in:AVERAGE:start=now-600:end=now-300 \        # 但只取10分钟前到5分钟前的这部分
> AREA:value1#00ff00:in  
475x168
[root@dns1 bob]#



如果我们不加 :start 和 :end ,则效果如下 :



我们甚至可以让两个对象显示不同的时间,例如

实例6 :让两个对象显示不同时间段的数据

CODE:
[root@dns1 bob]# rrdtool graph 1.png \
> --start now-2h \                # 规定时间为2小时内
> DEF:value1=eth0.rrd:eth0_in:AVERAGE:end=now:start=end-1h \        # 规定时间为1小时内               
> DEF:value2=eth0.rrd:eth0_out:AVERAGE \        # 没有指定 :start 和 :end,默认和 –-start 一样也是2小时
> AREA:value1#00ff00:in \
> LINE2:value2#ff0000:out:STACK
475x168
[root@dns1 bob]#




实例7 :把一段时间分为几段分别显示 :

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



我们把3个小时内的数据用三种不同粗细、不同颜色的曲线画了出来。

看到了吗,out部分(红色)显示了2个小时内的流量,而in部分(绿色)则只显示了1个小时内的部分

在这里要提一点,虽然我们指定了 –-start 或者 –-end ,或者 :start , :end,但并不意味着曲线就一定会从指定的时间点开始和结束。

例如我们上面指定了 :start=now-600:end=now-300 ,也就是只显示5分钟的数据。但图表出来的效果却是10(10:05-10:15)分钟

的数据,这是因为我们挑选的时间当中“不慎”横垮了两个周期(10:05-10:10,10:10-10:15),所以 RRDtool 会把它们全部画出来,而

不是只画其中的5分钟。
阅读(2030) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~