Chinaunix首页 | 论坛 | 博客
  • 博客访问: 789028
  • 博文数量: 95
  • 博客积分: 6011
  • 博客等级: 准将
  • 技术积分: 1342
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-12 16:58
文章分类

全部博文(95)

文章存档

2009年(44)

2008年(51)

我的朋友

分类: 服务器与存储

2009-05-08 14:46:53

使用RRDtool 进行绘图_(二)
**********************************************************************************************************************
注 :该教程参考了如下内容 :
A
)官方文档 :
B
abel 兄的大作 :

作者 :ailms
版本 :v1
最后修改 :2006/11/17 17:35
**********************************************************************************************************************

五)说明文字(Label

CODE:

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


-t 
是用于图表上方的标题,-v 是用于 Y 轴的说明文字

实例:给图表增加标题

CODE:

[root@dns1 bob]# rrdtool graph 1.png \
> --start now-183600 \ # 
从当前开始往前51个小时
> -t "51 hours ago" -v "Traffic" \ # 
标题是 “51 hours ago”轴的说明文字是 “Traffic”
> DEF:value1=eth0.rrd:eth0_in:AVERAGE \
> DEF:value2=eth0.rrd:eth0_out:AVERAGE \
> LINE1:value1#0000ff:in \ # 
注释 :以1个像素宽的曲线画出 value1,颜色是蓝色,图例的说明文字是“in”
> LINE2:value2#ff0000:out # 
注释 :以2个像素宽的曲线画出 value2,颜色是红色,图例的说明文字是 “out”
497x179
[root@dns1 bob]#


现在我们用的是 LINE 的方式来绘图。LINE 可以有3种,分别是 LINE1|2|3,也就是线条的粗细。还有一种是 STACK 方式下面再介绍。

可以看到流入的流量比流出的流量稍大,这样看的话,out 流量比较难看,是否可以有别的方式呢?RRDtool 还提供了

另外一种格式,就是 STACK 。意思就是在前一个对象的基础(把前一个对象的值当成 X 轴)上绘图,而不是从 X 轴开始。

实例:使用 STACK 方式绘图

CODE:

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


这是没有采用 STACK 方式绘图的效果 :

可以看得出上面采用 STACK 方式的比较清晰,但要注意,采用 STACK 方式后,在读取 out 流量时,轴的刻度不再是 out 的值,

应该用刻度值减去 in 的值,才是 out 真正的值。这点比较麻烦。需要配合 GPRINT 语句才能达到一定的效果。

六)图表大小(Size

CODE:

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


这里说图表大小而不是图片大小,是因为 –w -h 控制的是 X/Y 轴共同围起来的那部分大小,而不是整个图片的大小,这点在前面就可以看出了。

默认的图表大小是 400 (长)x 100 (高),但一般会返回497x179 这样的数字,这个才是图片的大小。

RRDtool 
 MRTG 好的一个地方就是 MRTG 一放大图片,就会变得模糊。RRDtool 则不会。

在官方文档中,-w 似乎是一个比较敏感的参数,我们看下面的描述 :

QUOTE:

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.

 

QUOTE:

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

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

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


这两段话分别是从rrd-beginners    rrd_graph 文档中摘出来的。似乎看起来 –w 会影响到图表的 resolution ,进一步影响到 RRDtool 如何选择 RRA 

但经过实验却发现并非如此。

我对这两段话中的图表的 resolution 一词不知如何理解和计算,希望好心的朋友能够指点一下 ^_^ .


实例:使用 –w 设定图表大小为 300 像素

CODE:

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


可以看到图表是不是变小了呢?而且整个图片的大小也变小了。

如果用前面的话来推理,由于 120000/300-w的值)= 400 > 300 step,由于没有 resolution=400  RRA

所以应该采用 resolution=7200 的第2 RRA 的数据来绘图,但实际上不是。

上面这个才是 300 pixel 宽,resolution=7200 的效果

所以我觉得 –w  –h 并不能影响 RRDtool 如何选择 RRA ,只能起到缩小放大的作用。

BTW
:当你绘制的时间范围较大时,可以使用 –w 增大图表大小,这样看起来比较舒服

七) Y 轴上下限(Limits

CODE:

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


默认情况下,RRDtool 会和 MRTG 一样自动调整 Y 轴的数字,来配合当前的数值大小。如果想禁止该特性,可以通过 –upper-limit 

-–lower-limit 
来做限制,表示Y轴显示的值从多少到多少。如果没有指定 –rigid ,则在图表的上下边界处还是会有一些延伸,但如果指定了
  
-–rigid 
,则严格按照 –-upper-limit  –-lower-limit 绘制。

在使用 –lower-limit 时要注意,如果数据中有负数,如果 -–lower-limit  0,则负数部分是显示不出来的。

实例:使用 –-upper-limit  –-lower-limit 限制 Y 轴的上下限

CODE:

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


八) X/Y 轴刻度(Grid

CODE:

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


RRDtool 
中设置 X 轴的刻度比较复杂,如果没有必要,可以交给 RRDtool 自动去处理。

例如上面的图,33 小时的情况下,轴只有2个值,显得很不足。这时候有两种方法 :

A
)一是使用 –w 增大图表的宽度,这样 RRDtool 会自动加多一些刻度上去。

不过需要增加多大才会有上面的这种效果不得而知,所以这种方法不是很方便。

B
)二是通过上面的选项自己设置 X/Y 轴的刻度如何显示。首先看上图,在垂直的线中,红色的线称为 Major Grid(主要网格线),

灰色的线称为 Base Grid (次要网格线)(这里是借用 EXCEL 中的概念 ^_^ )。 X 轴下面的时间文字成为 Label 。了解这

三样东西后,就可以动手调整刻度了。

C
)有两种方法可以快速去掉 X/Y 轴的刻度,就是 –-x-grid none  –-y-grid none

D
GTM:GST 控制次要格网线的位置。GTM 是一个时间单位,可以是 SECONDMINUTEHOURDAY WEEKMONTHYEAR 

    GST 
则是一个数字,控制每隔多长时间放置一根次要格线。例如我们要画一个1天的图表,决定每15分钟一根次要网格线,则格式为 MINUTE:15
   
E
MTM:MST 控制主要网格线的位置。MTM 同样是时间单位,MST 是一个数字。接上面的例子,决定一个小时1根主要网格线。则格式为 HOUR:1 

    LTM:LST 
:控制每隔多长时间输出一个label 。决定为1小时1 label 。则格式为 HOUR:1

G
LPR:LFM LTM:LST 只是决定了 label 的显示位置了,没有指定要显示什么内容。LPR 指的是如何放置 label 。如果LPR 0,则数字对齐格线

(适用于显示时间)。如果不为0,则会做一些偏移(适用于显示星期几、月份等)。至于LFM 则需要熟悉一下 date 命令的参数,常用的有 %a(星期几)、

%b
(月份)、%d(天)、%H(小时)、%M(分)、%Y(年)。我们决定显示小时和分,所以用 %H%M

H
)综合起来,轴的刻度定义就是 –-x-grid MINUTE:15:HOUR:1:HOUR:1:0:’%H:%M’。最好把 %H:%M 括起来

    
建议 MST GST 2-6倍,MST  LST 相同。这样画出来的图比较美观一些


这明显就是图片太小了,不够显示。把上面的 :%M 去掉就可以了,只显示小时,不显示分钟 

如果把图片放大一点就更好了 (-w 800) 

所以在设置 X 轴的刻度时,要记得不要显示太多东西,否则需要增大图片的大小 

I
轴刻度的设置又不一样了

grid step 
用于控制Y轴每隔多少显示一根水平线

label factor 
默认为1,也就是在每根水平线的高度那里显示一个值。

例如下面就是一个例子 (每隔800显示一根水平线)



J
轴还有一个很方便的选项就是 –Y ,它可以最大限度的优化 Y 轴的刻度,建议每次绘图都加上去。

K
轴另外一个有用的选项就是 –X (虽然选项名是 -X ,但确实是用来设置 Y 轴刻度值的)。在上面的图我们看到 RRDtool 自动对 Y 轴的值进行调整,

    
 k 为单位显示。但如果你不想以 k 显示,而是想固定以某个单位来显示(Mb)该怎么办呢?这就要用到 –X 选项了。-X 后面跟一个参数,参数值
   
    
范围是 -18-15-12-9-6 -30369121518 表示以原值显示,表示数值除以1000,也就是以 k 为单位显示,就是以
   
    M 
显示,就是以 G 显示。如果你给出1或者2,则 RRDtool 也可以接受,但会被静悄悄的改为0。下面就是一个以原值(-X 0)显示的例子

使用RRDtool 进行绘图_(三)

**********************************************************************************************************************
注 :该教程参考了如下内容 :
A
)官方文档 :
B
abel 兄的大作 :

作者 :ailms
版本 :v1
最后修改 :2006/11/17 17:35
**********************************************************************************************************************


九、 其他(Miscellaneous

CODE:

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


A
-n | --font 是一个有意思的选项。CU  abel 兄曾提供了一个中文 patch 可以实现显示中文的效果。但对于我这等对 C 一窍不通的家伙,就不知道怎么用了。

不过幸好 –n 选项可以实现这个目的,只需要中文字体的文件就可以搞定了。

   
首先你要找出一个中文的字体文件。例如/usr/share/fonts/zh_CN/TrueType/gkai00mp.ttf 。你也可以把 Windows 上的 C:\Windows\Fonts 下面的中
   
    
文字体拷贝到 Linux 上,例如home/bob/Fonts/simhei.ttf (黑体)效果不错,其他的则不太行,会出现模糊或者重叠的情况。建议就使用黑体算了。

   
其次是确定字体大小。中文字体不宜小于 7 ,否则看不清楚

   
确定你要修改的是图表的那个部分。有 DEFAULT(全部),TITLE (标题)、AXIS(坐标轴字体)、UNITY轴单位字体)、LEGEND(图例字体)几种。

下面就以实际的例子来说明如何显示中文 :

实例:使用 –n  RRDtool 显示中文

CODE:

[root@dns1 bob]# rrdtool graph 4.png \
> -n TITLE:10:'/home/bob/Fonts/simhei.ttf' \ # 
修改标题的字体为黑体
> -n AXIS:10:'/home/bob/Fonts/simhei.ttf' \ # 
修改 X 轴的字体为黑体
> --start now-240000 \ # 
大于3天的数据
> DEF:value1=eth0.rrd:eth0_in:AVERAGE \
> AREA:value1#00ff00:in -t "33
小时前的 eth0 接口流量" -v "traffic"
> -Y –w 600 # 
图表宽度为 600 pixel
503x190
[root@dns1 bob]#


这就是最终的效果了,可以看到标题和 X 轴都是中文的,但 Y 轴的字体还是默认的字体。

B
-g |--no-legend 用于取消图表下方的图例,不过不建议这么做。

C
-b|--base value  MRTG  RRDtool 中,默认 1k=1000 ,使用 –b 可以进行调整,例如 –b 1024

十)数字报表

看看上面的图表,是不是觉得还少了些什么呢?对了,就是只有图,没有文字说明。如何象 MRTG 那样能够显示最大值平均值当前值呢?

这就需要用到 GRPINT  COMMENT 语句了。
GPRINT 
就是在图表的下方(仍然属于图片的内部)输出最大值、最小值、平均值这些东东;COMMENT 就是用来输出一些字符串,例如报表的表头。

A
GPRINT的格式是GPRINT:vname:CF:format 。由于 format 部分太多参数了,我这里就用最常用的那个 : %x.ylf 

B
COMMENT 的格式是COMMENT:text 。要注意 COMMENT 默认是不输出换行的,如果要输出换行,必须用 “\n” 

下面就以一个实例来说明如何打印报表 : 绘制1小时前的流量图,并打印数字报表(参照 abel 兄给出的例子)

CODE:

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


注意比较 Y 轴刻度值和流出部分的值的关系, Y 轴刻度值 —“流入” =“流出

由于时间精力有限,关于对齐方面的工作就大家自己试验吧.如果绘制的对象数量不是很多,可以用横向报表,不要用这种垂直的格式,

这种格式的好处是便于比较各个对象的值。不过我可以肯定,如何让这些数字和上面的表头对齐是一个会令你极度抓狂的工作的!!!

上面的   COMMENT 一是输出表头,二是输出空行。注意,要用 COMMENT 输出空行,必须用 COMMENT:’ \n’ 

注意到 ‘\’ 前面的空格吗?这个是不可以漏的,否则就不会有空行的效果了。

十一)特殊功能

CODE:

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


A
VRULE/HRULE 可以用于在图表上面绘制垂直线/水平线。例如我们想要在图表上面标出最大值,可以用 HRULE  Y 轴的指定刻度值

那里绘制一根水平线,例如 HRUE:100000#ff0000:”最大值”  100k 处画一根水平线,并指出这是最大值。

SHIFT 
可以用来移动数据,例如 abel 兄曾经在 “[教學]中的教學() RRDTOOL 1.2 更新項目中提到过一个问题,

就是“xx同期相比如何画?下面就以如何比较3天的数据。

实例:绘制连续3天的数据

CODE:

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


为什么只有1天前的数据呢?因为我们没有指定 –-start RRDtool 默认只绘制1天前的数据。由于这里覆盖了3天,

所以我们可以把 –-start 定义为 –-start now-3d 就可以了。

现在是不是3天的数据都画出来了呢?不过由于它们是横向排列的,所以要比较同个时间段的并不容易,能否把它们

垂直的方式排列呢?这就要用到 SHIFT 了!

CODE:

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


[root@dns1 bob]#

和上面的图表比较,是否可以发现 X 轴不同了,不再是3天,而是1天多1点了。而且3根曲线重叠在一起了,可以看出在这三天中,

只有1天前的23点左右有一点流量之外,其余绝大部分都没有流量。

这就是 SHIFT 的功能了,可以把曲线/方块沿着 X 轴移动(左右都可以),我们达到比较同期数据的目的。是不是很好用呢?

十二)总结

这次的内容可真够多的,足足写了19页。不过工具性的东西就是这样 :别看内容 N多,你只要动手画出1个图之后,就会觉得一

切都很简单了。以后只要套用就可以了。关键是如何更好的把你想要的数据以合适的发给你是呈现出来。

上面这些内容都是我通过实验得出的,由于具体的环境不同,可能会跟大家的不同,或者出现错误。我希望大家不要客气,有错误

的地方就指正,有什么好的发现也提出来,一起完善 RRDtool 的文档。这样就可以让越来越多的人了解、掌握 RRDtool 了 。
阅读(1830) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~