分类: 系统运维
2010-10-02 11:46:45
建库实际上就是建立后缀名为 .rrd 的 RRD 文件。
一)语法格式
其中 filename 、DS 部分和 RRA 部分是必须的。其他两个参数可免。
二)参数解释
A)
B) --step :就是 RRDtool “期望” 每隔多长时间就收到一个值。和 MRTG 的 interval 同样含义。默认是5分钟。我们的脚本也应该是
每5分钟运行一次。
C) --start :给
出 RRDtool 的第一个记录的起始时间。RRDtool 不会接受任何采样时间小于或者等于指定时间的数据。也就是说
–-start指定了数据库最早的那个记录是从什么时候开始的。如果 update 操作中给出的时间在 –-start 之前,则
RRDtool拒绝接受。--satrt 选项也是可选的。按照 我们在前一篇中的设定,则默认是当前时间减去
600*300秒,也就是50个小时前。 如果你想指定--start 为1天前,可以用
注意,--start 选项的值必须是 timestamp 的格式。
D) DS :DS 用于定义 Data Soure 。也就是用于存放脚本的结果的变量名(DSN)。
就是我们前面提到的 eth0_in ,eth0_out, lo_in , lo_out 。DSN 从 1-19 个字符,必须是 0-9,a-z,A-Z 。
E) DST :DST 就是 Data Source Type 的意思。有 COUNTER、GUAGE、DERIVE、ABSOLUTE、COMPUTE 5种。由于网卡流量属于计数器型,所以这里应该为 COUNTER 。
F) RRA :RRA 用于指定数据如何存放。我们可以把一个RRA 看成一个表,各保存不同 interval 的统计结果
G)PDP :Primary
Data Point 。正常情况下每个 interval RRDtool 都会收到一个值;RRDtool 在收到脚本给来的值后
会计算出另外一个值(例如平均值),这个 值就是 PDP
;这个值代表的一般是“xxx/秒”的含义。注意,该值不一定等于RRDtool 收到的那个值。除非是GAUGE ,可以看下面的例子就知道了
H) CF :CF 就是 Consolidation Function 的缩写。也就是合并(统计)功能。有 AVERAGE、MAX、MIN、LAST 四种分别表示对多个PDP 进行取平均、取最大值、取最小值、取当前值四种类型。具体作用等到 update 操作时 再说。
I) CDP :Consolidation Data Point 。RRDtool 使用多个 PDP 合并为(计算出)一个 CDP。也就是执行上面 的CF 操作后的结果。这个值就是存入 RRA的数据,绘图时使用的也是这些数据。
三)再说 DST
DST 的选择是十分重要的,如果选错了 DST ,即使你的脚本取的数据是对的,放入 RRDtool 后也是错误的,更不用提画出来的图是否有意义了。
如何选择 DST 看下面的描述 :
A)COUNTER :必须是递增的,除非是计数器溢出(overflows)。在这种情况下,RRDtool 会自动修改收到的值。例如网络接口流量、收到的packets 数量都属于这一类型。
B)DERIVE:和 COUNTER 类似。但可以是递增,也可以递减,或者一会增加一会儿减少。
C)ABSOLUTE :ABSOLUTE 比较特殊,它每次都假定前一个interval的值是0,再计算平均值。
D)GAUGE :GAGUE 和上面三种不同,它没有“平均”的概念,RRDtool 收到值之后字节存入 RRA 中
E)COMPUTE :COMPUTE 比较特殊,它并不接受输入,它的定义是一个表达式,能够引用其他DS并自动计算出某个值。例如
则 eth0_bytes 每得到一个值,eth0_bits 会自动计算出它的值:将 eth0_bytes 的值乘以 8 。不过
COMPUTE 型的 DS 有个限制,只能应用它所在的 RRD 的 DS ,不能引用其他 RRD 的 DS。 COMPUTE 型 DS
是新版本的 RRDtool 才有的,你也可以用 CDEF 来实现该功能。
F)AVERAGE
类型适合于看“平均”情况,例如一天的平均流量,。所以 AVERAGE 适用于需要知道 ‘xxx/秒’ 这样的需求。但采用 AVERAGE
型时,并不知道 在每个 CDP
中(假设30分钟平均,6个PDP组成)之中,流量具体是如何变化的,什么时候高,什么时候低。这于需要用到别的统计类型了
G)MAXIMUM 、MINIMUM不适用想知道“xxx/秒”这样的需求,而是适用于想知道某个对象在各个不同时刻的表现的需求,也就是着重点在于各个时间点。
例如要看某个接口在一天内有没有超过50Mb 流量的时候就要用 MAXIMUM
例如要看磁盘空间的空闲率在一天内有没有低于 20% 的时候就要用 MINIMUM
H)LAST
类型适用于 “累计”的概念,例如从xxx时候到目前共累计xxxx 这样的需求。例如邮件数量,可以用 LAST 来表示 30
分钟内总共收到多少个邮件,同样 LAST 也没有平均的概念,也就是说不适用于 ‘xxx/秒’
这样的需求,例如你不能说平均每秒钟多少封邮件这样的说法;同样也不适用于看每个周期内的变化,例如30分钟内共收到100封邮件,分别是
:第一个5分钟20封,第二个5分钟30封,第三个5分钟没有,第4个5分钟10封,第5个5分钟也没有,第6个5分钟40封。如果用 MAXIMUM
或者 MINIMUM 就不知道在30分钟内共收到100封邮件,而是得出30和0。所以 LAST 适用于每隔一段时间被观察
对象就会复位的情况。例如每30分钟就收一次邮件,邮件数量就是 LAST
值,同时现有的新邮件数量就被清零;到下一个30分钟再收一次邮件,又得到一个 30 分钟的 LAST 值。
这样就可以得得出“距离上一次操作后到目前为止共xxx”的需求。(例如距离上一次收取邮件后又共收到100封新邮件)
四)DST 实例说明
这样说可能还是比较模糊,可以看下面的例子,体会一下什么是 DST 和 PDP :
所以第一行的 values 并不是 PDP ,后面4行才是 PDP
五)开始建库
有的人可能会问,上面有两个 DS,那 RRA 中究竟存的是那个 DS 的数据呢?实际上,这些 RRA 是共用的,你只需建立一个 RRA,它就可以用于全部的 DS 。
所以在定义 RRA 时不需要指定是给那个 DS 用的。
六)什么是 CF
以第2个RRA 和 4,2,1,3 这4个 PDP 为例
AVERAGE :则结果为 (4+2+1+3)/4=2.5
MAX :结果为4个数中的最大值 4
MIN :结果为4个数中的最小值1
LAST :结果为4个数中的最后一个 3
同理,第三个RRA和第4个RRA则是每24个 PDP、每288个 PDP 合成为1个 CDP
七)解释度(Resolution)
这里要提到一个 Resolution 的概念,在官方文档中多处提到 resolution 一词。Resolution 究竟是什么?Resolutino 有什么用?
举个例子,如果我们要绘制1小时的数据,也就是60分钟,那么我们可以从第一个RRA 中取出12个 CDP 来绘图;也可以从第2个 RRA中取出2个 CDP 来绘图。到底 RRDtool 会使用那个呢?
让我们看一下 RRA 的定义 :RRA:AVERAGE:0.5:4:600 。
Resolution
就等于 4 * step = 4 * 300 = 1200 ,也就是说 ,resolution 是每个CDP 所代表的时间范围,或者说 RRA
中每个 CDP(记录)之间的时间间隔。所以第一个 RRA 的 resolution 是 1* step=300,第2是 1200,第三个是
24*300=7200,第4个 RRA 是 86400 。
默认情况下,RRDtool 会自动挑选合适的 resolution 的那个 RRA 的数据来绘图。我们大可不必关心它。但如果自己想取特定 RRA 的数据,就需要用到它了。
关于 Resolution 我们还会在 fetch 和 graph 中提到它。
八)xff 字段
细心的朋友可能会发现,在 RRA 的定义中有一个数值,固定是 0.5 ,这个到底是什么东东呢?
这个称为 xff 字段,是 xfile factor 的缩写。让我们来看它的定义 :
这个看起来有点头晕,我们举个简单的例子 :例如
这个 RRA 中,每24个 PDP (共两小时)就合成为一个 CDP,如果这 24 个 PDP 中有部分值是 UNKNOWN (原因可以很多),例如1个,那么这个 CDP
合成的结果是否就为 UNKNOWN 呢?
不是的,这要看 xff 字段而定。Xff 字段实际就是一个比例值。0.5 表示一个 CDP 中的所有 PDP 如果超过一半的值为 UNKNOWN ,则该 CDP 的值就被标为
UNKNOWN。也就是说,如果24个 PDP中有12个或者超过12个 PDP 的值是 UNKNOWN ,则该 CPD 就无法合成,或者合成的结果为 UNKNOWN;
如果是11个 PDP 的值为 UNKNOWN ,则该 CDP 的值等于剩下 13 个 PDP 的平均值。
如果一个 CDP 是有2个 PDP 组成,xff 为 0.5 ,那么只要有一个 PDP 为 UNKNOWN ,则该 PDP 所对应的 CDP 的值就是 UNKNOWN 了
使用RRDtool 进行绘图
一)前言 其中的 data definiton、variable definition 、data calculation、分别是下面的格式 其中 filename 就是你想要生成的图片文件的名称,默认是 png 。你可以通过选项修改图片的类型,可以有 PNG、SVG、EPS、PDF四种。 既然要绘图,就应该有一个起始/结束的时间。Graph 操作中有 –s ,-e 选项。这两个选项即可以用于控制图表的 X 轴显示的时间范围,也可以用 这里是 :step=1000,但 RRDtool 会取 :step=1200 的 第2个 RRA 的数据来绘图,可以和上面的 1.png 比较,发现比较平滑。
使用RRDtool 我们最关心什么?当然是把数据画出来了。虽然前面谈了很多,但这些都是基础来的。掌握好了,可以让你在绘图时更加得心应手。
本来还有 RPN (反向波兰表达式)一节的,但考虑一下,觉得还是放到后面,先从基本的绘图讲起。
这一节的内容虽然很多,但基本都是实验性的内容,只要多试几次就可以了。
二、graph 语法
[data definition ...]
[data calculation ...]
[variable definition ...]
[graph element ...]
[print element ...]
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)
于控制 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 轴的起始时间
> --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中取数据
> --start now-120000 \
> DEF:value1=eth0.rrd:eth0_in:AVERAGE:step=1000 \ # :step 指定 resolution=1000
> AREA:value1#ff0000
481x154
[root@dns1 bob]#
实例3 :使用 –S 从第2个RRA中取数据
> -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=
实例4 :同时使用 –S 和 :step
> -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 只显示指定时间内的数据
如果我们不加 :start 和 :end ,则效果如下 :
我们甚至可以让两个对象显示不同的时间,例如
实例6 :让两个对象显示不同时间段的数据
实例7 :把一段时间分为几段分别显示 :
我
们把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分钟。
五)说明文字(Label)
-t 是用于图表上方的标题,-v 是用于 Y 轴的说明文字
实例1 :给图表增加标题
现在我们用的是 LINE 的方式来绘图。LINE 可以有3种,分别是 LINE1|2|3,也就是线条的粗细。还有一种是 STACK 方式下面再介绍。
可以看到流入的流量比流出的流量稍大,这样看的话,out 流量比较难看,是否可以有别的方式呢?RRDtool 还提供了另外一种格式,就是 STACK 。意思就是在前一个对象的基础(把前一个对象的值当成 X 轴)上绘图,而不是从 X 轴开始。
实例2 :使用 STACK 方式绘图
这是没有采用 STACK 方式绘图的效果 :
可
以看得出上面采用 STACK 方式的比较清晰,但要注意,采用 STACK 方式后,在读取 out 流量时,Y 轴的刻度不再是 out
的值,应该用刻度值减去 in 的值,才是 out 真正的值。这点比较麻烦。需要配合 GPRINT 语句才能达到一定的效果。
六)图表大小(Size)
这里说图表大小而不是图片大小,是因为 –w ,-h 控制的是 X/Y 轴共同围起来的那部分大小,而不是整个图片的大小,这点在前面就可以看出了。
默认的图表大小是 400 (长)x 100 (高),但一般会返回497x179 这样的数字,这个才是图片的大小。
RRDtool 比 MRTG 好的一个地方就是 MRTG 一放大图片,就会变得模糊。RRDtool 则不会。
在官方文档中,-w 似乎是一个比较敏感的参数,我们看下面的描述 :
实例1 :使用 –w 设定图表大小为 300 像素
可
以看到图表是不是变小了呢?而且整个图片的大小也变小了。如果用前面的话来推理,由于 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)
默认情况下,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 轴的上下限
八) X/Y 轴刻度(Grid)