一.RRDTool简介
RRDTool是一个高性能的数据记录及绘图工具,主要用于处理时间序列数据比如网络带宽、房间温度、CPU负载、服务器负载及对其它网络设备进行监控的数据等。它能让管理记录和分析通过SNMP从其它任意数据源 (Data Source) 获取到的时间序列数据,并能将这些数据以图形化的方式予以展示。RRDTool记录数据的文件名后缀通常为.rrd,而且其能够存储的数据的总量不会改变。因为当文件写满之后,新生成的数据会覆盖当前文件中最早生成的数据。其作者为Tobi Oeticker。
RRDTool提供了几个子命令实现对.rrd文件的管理,如create, update, updatev, graph, dump, restore, fetch, tune, last, info, rrdresize, xport, flushcached和rrdcgi等。有此开发语言直接内嵌了RRDTool,如PHP, tcl, Perl, Python等。
RRDTool只能绘制线条或区域形图,也可以是两者的综合。一般说来,RRDTool能绘制以下四种类型的图形:
LINE: 线条
VRULE: 垂线
HRULE: 水平线
AREA: 区域
1.1 使用RRDTool绘图的步骤:
a、使用rrdtool create命令创建一个新的RRD数据文件;
b、使用rrdtool update为前面创建的RRD数据文件提供数据;此数据需要周期性的进行更新,因此,应该将rrdtool update创建为cron任务;
c、使用rrdtool graph从RRD数据文件中获取数据并绘图;
1.2rrdtool create命令的用法:
语法:
rrdtool create filename [--start|-b start time] [--step|-s step] [--no-overwrite] [DS:ds-name:DST:dst arguments] [RRA:CF:cf arguments]
此命令用于创建初始的RRD数据文件,创建完成后文件大小为其最终大小,里面初始数据以*UNKNOWN*进行填充;文件名通常以.rrd结尾。
--start|-b start time (default: now - 10s): 用于指定开始向文件中记录数据的起始时间,此时间为1970年1月1日起至指定起始时间所经过的秒数;这里不接受已经过去的时间。
--step|-s step (default: 300 seconds): 记录数据的时间间隔;
--no-overwrite:不覆盖一个已经存在的rrd数据文件;
DS:ds-name:DST:dst arguments
DS: 用于指定向此rrd文件记录数据的数据源(Data Source)。一个RRD文件可以接受多个不同的数据源的数据,如某主机某网卡的入站数据流量和出站数据流量等。
ds-name: 当前数据源的名称(以便在其它地方引用)。数据源的名称长度不能超过19个字符,而且只能包含字母和数字。
DST: Data Source Type,即数据源类型。RRDTool中的数据源类型有GAUGE, COUNTER, DERIVEA, ABSOLUTE和COMPUTE等。
前四种的用法格式为:DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max
COMPUTE的用法格式为:DS:ds-name:COMPUTE:rpn-expression
heartbeat:在指定的更新时间间隔到达时,rrd文件期望接收到新的数据。而由于各种原因,更新数据的到达时间可能会有误差。此处的heartbeat则用于指定此RRD文件所能够接受的更新数据最长到达时间长度。
min和max: 用于此RRD文件为当前数据源产生的数据指定一个接受范围,max为其上限,min为其下限。而超出此范围的数据都被标识为*UNKNOWN*。在为某数据源指定上限和下限时,通常用其理论上的最大值和最小值。
RRA:CF:cf arguments
RRD文件的目的之一就是存储RRA(Round Robin Archives)数据。对一个数据源来说,一个archive通常由一系列的数值或统计值组成。在RRD文件中,每个RRA是分开存储的,因此每个RRA都需要专门进行定义。
每当一个更新数据被记入RRD文件时,其都会被查找一个与之对应的“时间点”处,此即为一个PDP(Primary Data Point)。
同时,这些数据会被RRA中定义的统计函数(Consolidation Function)进行处理后再进行记录。
CF就是用于指定对数据进行处理的统计函数,它们包括AVERAGE、MIN、MAX和LAST。当然,通过这些函数计算过的数据可能会丢失一部分精度或信息。
RRA一行详细的语法格式为RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows
其中xff为xfiles factor,用来定义当PDP的数据为*UNKNOWN*的部分小于多大百分比时,统计的结果仍然可以标记为某具体值。因此,xff取值范围为0到1之间的任意值。
steps用于定义有多少PDP用于CF进行汇总并记入RRD文件中;rows用记定义每一个RRA中共保存多少个生成的数据记录。
关于DST的详细说明:
GAUGE:这是最常用的DST,即某指标当前的直接值,而不用再经过rrdtool解析;
COUNTER: 计数器,需要持续性递增类的数值,比如经由某网卡所传输的字节数;如果计数器发生溢出,RRDTool会试图猜测出其正确的值。
DERIVE:类似COUNTER,但不对其值作溢出与否的检查和猜测。
ABSOLUTE: 类似COUNTER,但每次计数都将计数器清零后直接计数。
COMPUTE: 用于记录将本RRD中其它数据源中的数据经过某表达式处理后的数据。
举例
每隔5s生成一个随机数
观察 5s 50s 500s的平局
加入至少一天的每5s 86400/5个数据
至少一周的每50s的
一个月的每500s的数据
rrdtool create test.rrd -s 5 DS:testds:GAUGE:8:0:U RRA:AVERAGE:0.5:1:17280【一天】 RRA:AVERAGE:0.5:10:3456 【2天】 RRA:AVERAGE:0.5:100:1210 【一周】
使用rrdtool info test。rrd 可以查看文件的格式
比如更新数据
rrdtool update test.rrd N:$RANDOM N 表示当前时间
查看结果
rrdtool fetch test.rrd AVERAGE
编写一个脚本,不停的给出一些数字
#!/bin/bash
while true;do
rrdtool update test.rrd N:$RANDOM
sleep 5
done
然后在前台执行
bash -x 脚本名字
过一会儿后执行
rrdtool fetch -r 5 test.rrd AVERAGE -r 5 知名时间跨度
1.3 rrdtool update用法
rrdtool {update | updatev} filename [--template|-t ds-name[:ds-name]...] [--daemon address] [--] N|timestamp:value[:value...] at-timestamp@value[:value...] [timestamp:value[:value...] ...]
rrdtool update用于向RRD文件提供时间序列数据。updatev是update的增强版,其中v表示verbose,其通返回值比update更丰富和详细。
1.4 语法解析
filename:要更新的RRD文件
--template|-t ds-name[:ds-name]...: 默认情况下,除了COMPUTE类型的外,update期望其接受的数据完全符合RRD中数据源的定义次序。如果需要自己指定其接受的数据及与数据源对应的次序,则可以使用--template选项来实现。注意,不要为COMPUTE类型的数据源指定要更新的数据。
--daemon address: 如果使用此选项,则意味着RRDTool将试图从指定的caching daemon接收更新数据。
N|timestamp:value[:value...]:用于指定向RRD提供的数据更新所产生的时间,这个可以是timestamp类型的数据,也可用N表示使用系统当前时间。负值则表示以当前时间为基准向前退回的时间点;而使用负值时,选项和数据之间必须使用--隔开,否则时间将会被解析为选项。而value部分则是向DS提供的更新数据,这些数据的次序要跟RRA中的数据源资源保持一致。如果某特定数据源没有产生新的数据,则用U来标识。多个数据源的值之间使用冒号隔开。
1.5 rrdtool graph用法
rrdtool graph|graphv filename [option ...] [data definition ...] [data calculation ...] [variable definition ...] [graph element ...] [print element ...]
rrdtool graph基于一个或多个data definition收集所需要数据实现绘图,而这些data definition可以来自一个或多个RRD数据文件。
如果想通过graph显示平均值、最大值、百分比值等,则最好通过使用variable definition语句实现。
同时,从RRA中取得的数值已经进行聚合,因此,其在图形中仅表现为一个像素点。
然而,有时候从RRA中取得数据未必如期望展示的那样,比如以byte为单位收集的数据,而展示时想以bit为单位。
此时则可以使用data calculation来实现此种转换,这种转换过程要通过RPN命令来实现。
1.6 语法解析
filename: graph命令生成的图像的路径和文件名,文件名一般以.png、.svg或.eps为后缀;如果文件名使用-,则表示图像直接发往标准输出。
[-s|--start time] [-e|--end time] [-S|--step seconds] :start和end用于指定显示图像用到的数据所来自的时间序列范围,
默认为前1天至此刻的时间跨度,这也是具有最好解析度的时间跨度。start和end接受多种时间格式为其值。默认情况下,
rrdtool graph会计算在指定的时间跨度内1个像素所对应的时间长度,并以之为解析度从RRA中获取数据;
而step选项则可以让用户指定使用的解析度,比如,如果想以一个小时的时长为解析度,则可以为step指定3600这个值。
当然,如果指定的解析度小于一个像素则会被忽略。
[-t|--title string] [-v|--vertical-label string]:title用于指定图像上方的标题,而vertical-label则可以指定纵轴的标题。
[-w|--width pixels] [-h|--height pixels] [-j|--only-graph] [-D|--full-size-mode]:
width和height用于指定画布的大小,默认为400X100。如果使用full-size-mode,则图像大小会自适应进行变化。
如果使用only-graph选项,并且指定的height的值小于32,则图像会被保存为微型图像,即预览图。
[-u|--upper-limit value] [-l|--lower-limit value] [-r|--rigid]:
默认情况下,图像会自动调整其纵轴的刻度,以适应展示所有的可能值。当然,可以在命令中使用upper-limit指定其能展示的最大值,
lower-limit指定其能表现的最小值;根据实际数据大小,指定了upper-limit和lower-limit后图像依然会进行自适应,除了使用rigid选项进行限定。
[-A|--alt-autoscale]:有时使用默认的算法来实现纵轴自适应的功能不能予以满足,alt-autoscale选项则可以通过自动调整其能够表现的最大值和最小值避免此种情况的出现。如果仅想自动调整所表现的最大值,则可以使用alt-autoscale-max,仅想自动调整其能表现的最小值,则使用alt-autoscale-min。
1.7 Data and variables有三种格式:
DEF:vname=rrdfile:ds-name:CF[:step=step][:start=time][:end=time]
CDEF:vname=RPN expression
VDEF:vname=RPN expression
在正常的图形展示中,至少需要一个DEF和一个LINE, AREA, GPRINT或PRINT四者之一的语句。
上面的这三种语句都可以从RRD文件中获取数据,甚至还可以对获取到的数据针对实际需要进行换算或调整。如果需要将获取到的数据进行换算或调整,可以通过定义变量来进行。
变量名称只能包括字母、数据和-和_,而且其最大长度不能超过255个。
DEF:<vname>=<rrdfile>:<ds-name>:<CF>[:step=<step>][:start=<time>][:end=<time>][:reduce=<CF>]
这个命令能够从RRD中取得数据,而vname所保存的值可以在整个脚本中使用。默认情况下,在一个正确的解析度上保存了正确统计值的RRA将被选用,当然,也可以使用--step选项改变默认的解析度。而--step指定的解析度还可以被此命令中的step指定的值所覆盖。此处的时间跨度跟rrdtool graph的命令所使用的跨度相同,然后也可以在此处为start和end指定一个具体的值来覆盖命令中的跨度。但是,在时间中所使用的冒号必须要进行转义。
如果数据的解析度高于图像的解析度,数据将会被进一步聚合以适应图像的解析度,这使得图形展示的能力大于实际时间跨度。然而,理想情况下,一个像素对应RRA文件中的一个CDP(Consolidate Data Point)是最好的。比如,以3600秒为解析度,那么一个宽度为400的图像所能够展示的时间跨度为400*3600秒,即400个小时。
1.8 定义图像
LINE[width]:value[#color][:[legend][:STACK]][:dashes[=on_s[,off_s[,on_s,off_s]...]][:dash-offset=offset]]
绘制线形图,width用于指定线条条的宽度,可以是个浮点数。颜色使用三组两位16进制的数字分别表示红色、绿色和蓝色值。如果不指定颜色,线条将不可见。value可以是来自于DEF、VDEF或CDEF变量的值。legend为图例说明,需要指定为所需要的字符串,以表示说明此线条图代表的意义。STACK选项用于跟其它线形图或区域图共同展示时处于最上方。
AREA:value[#color][:[legend][:STACK]]
除了图形为面积图外,其中的选项的用法与LINE一致。
VRULE:time#color[:legend][:dashes[=on_s[,off_s[,on_s,off_s]...]][:dash-offset=offset]]
在某时间点绘制一条垂直线。此时间值只能是来自于VDEF的数值或变量。
HRULE:value#color[:legend][:dashes[=on_s[,off_s[,on_s,off_s]...]][:dash-offset=offset]]
在某值处绘制一条水平线。其绘制出的样子类似于LINE,但对图像的自适应没有影响,即如果指定的水平线所处的值位于图像之外,其将不可见。
1.9 VDEF
VDEF:vname=RPN expression
此命令用于根据RPN语句返回一个值或一个时间。
2.0 CDEF
CDEF:vname=RPN expression
此命令用于在一个或多个数据序列之外创建一个新的数据点集合(在内存中完成),则RPN指令用于在这些数据点上以某数学函数进行求值,并将结果保存至vname中。例如CDEF:mydatabits=mydata,8,*
GPRINT:vname:format[:strftime]
strftime中的时间值只能来自于VDEF。format中的字符会原样输出,除了%引导的格式符。
举例
rrdtool graph test.png -s 1352852265 --step 50 -t tupian -v vtupian DEF:vname=test.rrd:testds:AVERAGE LINE1:vname#ff0000:testline
rrdtool graph test.png -s 1352852265 --step 5 -t tupian -v vtupian DEF:vname=test.rrd:testds:AVERAGE LINE1:vname#ff0000:testline
rrdtool graph test.png -s 1352852265 -t tupian -v vtupian DEF:vname=test.rrd:testds:AVERAGE:step=5 DEF:vname1=test.rrd:testds:AVERAGE:step=50 LINE1:vname#ff0000:testline1 LINE2:vname1:00ff00:testline2