全部博文(95)
分类: 服务器与存储
2009-05-08 14:46:53
使用RRDtool 进行绘图_(二)
**********************************************************************************************************************
注 :该教程参考了如下内容 :
A)官方文档 :
B)abel 兄的大作 :
作者 :ailms
最后修改 :2006/11/17 17:35
**********************************************************************************************************************
五)说明文字(Label)
CODE:
[-t|--title string] [-v|--vertical-label string]
-t 是用于图表上方的标题,-v 是用于 Y 轴的说明文字
实例1 :给图表增加标题
CODE:
[root@dns1 bob]# rrdtool graph 1.png \
> --start now-183600 \ # 从当前开始往前51个小时
> -t "51 hours ago" -v "Traffic" \ # 标题是 “51 hours ago”,Y 轴的说明文字是 “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 轴开始。
实例2 :使用 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 流量时,Y 轴的刻度不再是 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 一词不知如何理解和计算,希望好心的朋友能够指点一下 ^_^ .
实例1 :使用 –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,则负数部分是显示不出来的。
实例1 :使用 –-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 小时的情况下,X 轴只有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 是一个时间单位,可以是 SECOND、MINUTE、HOUR、DAY 、WEEK、MONTH、YEAR 。
GST 则是一个数字,控制每隔多长时间放置一根次要格线。例如我们要画一个1天的图表,决定每15分钟一根次要网格线,则格式为 MINUTE:15
E)MTM:MST :控制主要网格线的位置。MTM 同样是时间单位,MST 是一个数字。接上面的例子,决定一个小时1根主要网格线。则格式为 HOUR:1
LTM:LST :控制每隔多长时间输出一个label 。决定为1小时1个 label 。则格式为 HOUR:
G)LPR:LFM :LTM:LST 只是决定了 label 的显示位置了,没有指定要显示什么内容。LPR 指的是如何放置 label 。如果LPR 为0,则数字对齐格线
(适用于显示时间)。如果不为0,则会做一些偏移(适用于显示星期几、月份等)。至于LFM 则需要熟悉一下 date 命令的参数,常用的有 %a(星期几)、
%b(月份)、%d(天)、%H(小时)、%M(分)、%Y(年)。我们决定显示小时和分,所以用 %H%M
H)综合起来,X 轴的刻度定义就是 –-x-grid MINUTE:15:HOUR:1:HOUR:1:0:’%H:%M’。最好把 %H:%M 括起来
建议 MST是 GST 的2-6倍,MST 和 LST 相同。这样画出来的图比较美观一些
这明显就是图片太小了,不够显示。把上面的 :%M 去掉就可以了,只显示小时,不显示分钟
如果把图片放大一点就更好了 (-w 800)
所以在设置 X 轴的刻度时,要记得不要显示太多东西,否则需要增大图片的大小
I)Y 轴刻度的设置又不一样了
grid step :用于控制Y轴每隔多少显示一根水平线
label factor :默认为1,也就是在每根水平线的高度那里显示一个值。
例如下面就是一个例子 (每隔800显示一根水平线)
J)Y 轴还有一个很方便的选项就是 –Y ,它可以最大限度的优化 Y 轴的刻度,建议每次绘图都加上去。
K)Y 轴另外一个有用的选项就是 –X (虽然选项名是 -X ,但确实是用来设置 Y 轴刻度值的)。在上面的图我们看到 RRDtool 自动对 Y 轴的值进行调整,
以 k 为单位显示。但如果你不想以 k 显示,而是想固定以某个单位来显示(M,b)该怎么办呢?这就要用到 –X 选项了。-X 后面跟一个参数,参数值
范围是 -18、-15、-12、-9、-6 、-3、0、3、6、9、12、15、18 。0 表示以原值显示,3 表示数值除以1000,也就是以 k 为单位显示,6 就是以
M 显示,9 就是以 G 显示。如果你给出1或者2,则 RRDtool 也可以接受,但会被“静悄悄”的改为0。下面就是一个以原值(-X 0)显示的例子
使用RRDtool 进行绘图_(三)
**********************************************************************************************************************
注 :该教程参考了如下内容 :
A)官方文档 :
B)abel 兄的大作 :
作者 :ailms
最后修改 :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(坐标轴字体)、UNIT(Y轴单位字体)、LEGEND(图例字体)几种。
下面就以实际的例子来说明如何显示中文 :
实例1 :使用 –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天的数据。
实例1 :绘制连续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