rrdtool学习笔记

一、前言
为了做云缓存平台的技术储备,从零开始学习了rrdtool,rrdtool非常强大,刚接触会有摸不着边的感觉,尤其是一堆概念性的东西。学习的切入点便是这些概念,一一理解后你才能品尝到rrdtool的清香,首先要感谢ailms整理的“RRDtool简体中文教程
v1.01
”,通俗易懂的概况了rrdtool的所有知识。现在整理自己在学习过程中的一些笔记。

二、基本概念
RRDtool是指Round
Robin Database 工具(环状数据库)。Round
robin是一种处理定量数据、以及当前元素指针的技术。想象一个周边标有点的圆环--这些点就是时间存储的位置。从圆心画一条到圆周的某个点的箭头--这就是指针。就像我们在一个圆环上一样,没有起点和终点,你可以一直往下走下去。过来一段时间,所有可用的位置都会被用过,该循环过程会自动重用原来的位置。这样,数据集不会增大,并且不需要维护。RRDtool处理RRD数据库。它用向RRD数据库存储数据、从RRD数据库中提取数据(来源百度问答
)。为了方便理解其工作原理,本人做了一个rrdtool存储结构图:
rrdtool学习笔记
1、DS用于定义 Data Soure
。也就是用于存放脚本的结果的变量名(DSN)。如eth0_in ,eth0_out, lo_in , lo_out 。DSN 从 1-19 个字符,必须是
0-9,a-z,A-Z 。

2、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并自动计算出某个值。
这五种类型有什么区别?不防测试一下便知。
测试脚本:

view plaincopy to clipboardprint?
import sys,os
import time
import random
total_input_traffic = 0 
total_output_traffic = 0 
starttime=1252682400 
while 1: 
total_input_traffic = random.randrange(0, 5000) 
total_output_traffic = random.randrange(0, 5000) 
os.system("/usr/bin/rrdtool updatev /opt/rrdtool/COUNTER/eth0.rrd "+str(starttime)+":"+str(total_input_traffic)+":"+str(total_output_traffic)) 
os.system("/usr/bin/rrdtool updatev /opt/rrdtool/DERIVE/eth0.rrd "+str(starttime)+":"+str(total_input_traffic)+":"+str(total_output_traffic)) 
os.system("/usr/bin/rrdtool updatev /opt/rrdtool/ABSOLUTE/eth0.rrd "+str(starttime)+":"+str(total_input_traffic)+":"+str(total_output_traffic)) 
os.system("/usr/bin/rrdtool updatev /opt/rrdtool/GAUGE/eth0.rrd "+str(starttime)+":"+str(total_input_traffic)+":"+str(total_output_traffic)) 
if starttime>=1284218400: 
break; 
starttime+=300 
import sys,os
import time
import random
 
total_input_traffic = 0
total_output_traffic = 0
starttime=1252682400
while 1:
total_input_traffic = random.randrange(0, 5000)
total_output_traffic = random.randrange(0, 5000)
os.system("/usr/bin/rrdtool updatev /opt/rrdtool/COUNTER/eth0.rrd "+str(starttime)+":"+str(total_input_traffic)+":"+str(total_output_traffic))
os.system("/usr/bin/rrdtool updatev /opt/rrdtool/DERIVE/eth0.rrd "+str(starttime)+":"+str(total_input_traffic)+":"+str(total_output_traffic))
os.system("/usr/bin/rrdtool updatev /opt/rrdtool/ABSOLUTE/eth0.rrd "+str(starttime)+":"+str(total_input_traffic)+":"+str(total_output_traffic))
os.system("/usr/bin/rrdtool updatev /opt/rrdtool/GAUGE/eth0.rrd "+str(starttime)+":"+str(total_input_traffic)+":"+str(total_output_traffic))
if starttime>=1284218400:
break;
starttime+=300
测试结果:
a)COUNTER

rrdtool学习笔记
※为什么断断续续?原因很简单,random.randrange(0,
5000)获取的是随机值,就存在后面value比前value值小,如公式说明:(2000-3000)/300(setup)=UNKNOWN/300=UNKNOWN
rrdtool学习笔记
※原理同上,DERIVE除了支持是递增,也递减。

c)ABSOLUTE
rrdtool学习笔记
※计算公式:(3000-0)/300=100,得出初值为0的绝对值再求平均。

d)GAUGE
rrdtool学习笔记
※values直接入库,无作任何运行。

3、CDP:Consolidation
Data Point 。RRDtool
使用多个PDP合并为(计算出)一个CDP。也就是执行上面的CF操作后的结果。这个值就是存入RRA的数据,绘图时使用的也是这些数据。

4、CF就是Consolidation
Function的缩写。也就是合并(统计)功能。有AVERAGE、MAX、MIN、LAST四种分别表示对多个PDP进行取平均、取最大值、取最小值、取当前值四种类型。具体作用等到update操作时再说。

5、PDP:Primary
Data Point。正常情况下每个interval
RRDtool都会收到一个值;RRDtool在收到脚本给来的值后会计算出另外一个值(例如平均值),这个值就是PDP;这个值代表的一般是“xxx/秒”的含义。注意,该值不一定等于RRDtool收到的那个值。除非是GAUGE,可以看下面的例子就知道了。

6、DST就是Data
Source
Type的意思。有COUNTER、GUAGE、DERIVE、ABSOLUTE、COMPUTE5种。由于网卡流量属于计数器型,所以这里应该为COUNTER。

7、RRA用于指定数据如何存放。我们可以把一个RRA看成一个表,各保存不同interval的统计结果

8、resolution就是每个RRA中两个CDP相隔的时间

9、什么是
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

三、个人理解
1、CF(N个PDP为一个刻度单位)=CDP

1、CF(N个PDP为一个刻度单位)=CDP
*只限COUNTER、DERIVE、ABSOLUTE、COMPUTE
2、N个PDP为一个刻度单位=CDP
*只限GUAGE
3、xff字段如何计算?
PDP/(PDP UNKNOWN数)
4、PDP数据如何得出?
COUNTER(接收Value)=PDP
DERIVE(接收Value)=PDP
ABSOLUTE(接收Value)=PDP
COMPUTE(接收Value)=PDP
*GUAGE除外
5、常用时间截计算(shell)
A)时间截 =>日期
引用
date -d '1970-1-1 1276059000 sec utc'
B)日期=>时间截
引用
date -d '2010-09-11 23:20' +%s
<xff=unknown 四、rrdtool create
引用
rrdtool create Flow.rrd \--start $(date -d "1 
year ago" +%s) \--step 300 \DS:eth0_in:GAUGE:600:0:5000 
\DS:eth0_out:GAUGE:600:0:5000 \RRA:AVERAGE:0.5:1:600 
\RRA:AVERAGE:0.5:6:700 \RRA:AVERAGE:0.5:24:775 
\RRA:AVERAGE:0.5:288:797 \RRA:MAX:0.5:1:600 \RRA:MAX:0.5:6:700 
\RRA:MAX:0.5:24:775 \RRA:MAX:0.5:444:797 \RRA:MIN:0.5:1:600 
\RRA:MIN:0.5:6:700 \RRA:MIN:0.5:24:775 
\RRA:MIN:0.5:444:797

RRA存储周期计算:

1、RRA:AVERAGE:0.5:1:600
引用
(300s=5m)*1=5m*600=50h=(2.08天)2d2、RRA:AVERAGE:0.5:6:700
引用
(300s=5m)*6=30m*700=50h=(14.58天)2w3、RRA:AVERAGE:0.5:24:750
引用
(300m=5m)*24=2h*750=(64.5天)2M4、RRA:AVERAGE:0.5:288:797
引用
(300m=5m)*288=1d*797=(797天)2Y

五、rrdtool
graph
引用
rrdtool graph COUNTER/day.png -w 700 -h 200 \-n 
TITLE:11:'/opt/rrdtool/wdjt.ttf' \-n UNIT:8:'/opt/rrdtool/simhei.ttf' 
\-n LEGEND:8:'/opt/rrdtool/simhei.ttf' \-c SHADEA#DDDDDD \-c 
SHADEB#808080 \-c FRAME#006600 \-c FONT#006699 \-c ARROW#FF0000 
\-c AXIS#000000 \-c BACK#FFFFFF \-Y -X 3 \-t "服务器流量统计" -v "流量" 
\--start -1d --end now \--x-grid MINUTE:12:HOUR:1:HOUR:1:0:'%H' 
\DEF:value1=COUNTER/eth0.rrd:eth0_in:AVERAGE 
\DEF:value2=COUNTER/eth0.rrd:eth0_out:AVERAGE 
\CDEF:value3=value1,value2,+ \COMMENT:" \n" \COMMENT:" \n" 
\AREA:value1#00ff00:上传 
\GPRINT:value1:LAST:"当前\:%8.0lf"  \GPRINT:value1:AVERAGE:"平均\:%8.0lf"  \GPRINT:value1:MAX:"最大\:%8.0lf"  \GPRINT:value1:MIN:"最小\:%8.0lf"  \COMMENT:" 
\n" \LINE2:value2#4433ff:下载 
\GPRINT:value2:LAST:"当前\:%8.0lf"  \GPRINT:value2:AVERAGE:"平均\:%8.0lf"  \GPRINT:value2:MAX:"最大\:%8.0lf"  \GPRINT:value2:MIN:"最小\:%8.0lf"  \COMMENT:" 
\n" \COMMENT:"─────────────────────────────────────────────\n" 
\LINE3:value3#ff8833:总流量 \COMMENT:" \n" \HRULE:350000#ff0000:"报警值" 
\COMMENT:" \n" \COMMENT:"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t最后更新 \:$(date 
'+%Y-%m-%d %H\:%M')\n" -Y 
\COMMENT:"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t天涯社区系统运维部开发与维护\n"
效果图: rrdtool学习笔记 概念说明:
1、#分别是 
LINE1|2|3,也就是线条的粗细。

2、"--x-grid 
MINUTE:15:HOUR:1:HOUR:1:0:'%H'"说明如下:
#GTM:GST:控制次要格网线的位置。GTM 是一个时间单位,可以是 
SECOND、MINUTE、HOUR、DAY 、WEEK、MONTH、YEAR 。GST 
则是一个数字,控制每隔多长时间放置一根次要格线。例如我们要画一个1天的图表,决定每15分钟一根次要网格线,则格式为 
MINUTE:15

#MTM:MST:控制主要网格线的位置。MTM 同样是时间单位,MST 
是一个数字。接上面的例子,决定一个小时1根主要网格线。则格式为 HOUR:1

#LTM:LST :控制每隔多长时间输出一个label 
。决定为1小时1个 label 。则格式为 HOUR:1:0(不清楚0做什么用) ,如10 11 12 
13

#LPR:LFM:LTM:LST只是决定了label的显示位置了,没有指定要显示什么内容。LPR指的是如何放置label。如果LPR为0,则数字对齐格线(适用于显示时间)。如果不为0,则会做一些偏移(适用于显示星期几、月份等)。至于LFM则需要熟悉一下date命令的参数,常用的有%a(星期几)、%b(月份)、%d(天)、%H(小时)、%M(分)、%Y(年)。我们决定显示小时和分,所以用%H%M,最好将'%H:%M'括起来,哪只显示小时就'%H'。

3、"-Y 
-X 0 
"说明如下:
a)Y轴还有一个很方便的选项就是–Y,它可以最大限度的优化Y轴的刻度,建议每次绘图都加上去。
b)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显示,12则T。如果你给出1或者2,则RRDtool也可以接受,但会被“静悄悄”的改为0。下面就是一个以原值(-X0)显示原始数据,100k显示 
为100000。

4、字体参数说明

引用
-n TITLE:12: 
simhei.ttf    #修改top标题字体-n  AXIS:8: simhei.ttf    #修改X轴数据字体,如01 02 03 
04...-n  LEGEND:10: simhei.ttf  #修改数字报表字体,如最大、最小、平均值及其它-n  UNIT:8: 
simhei.ttf    #修改Y轴标题字符,如"流量"-n  WATERMARK:8: 
simhei.ttf    #数据区右则字体,如"RRDTOOL-TOBIOETIKER"5、HRULE:100000#ff0000:"报警值"绘制一根水平线,在 
100k 处画一根水平线,并指出这是报警值6、COLOR参数说明
引用
-c SHADEA#CCCCCC  #左上边框color-c 
SHADEB#000000  #右下边框color-c FRAME#EEEEEE  #数据标志说明边框color,如"上传"左边的小正方形。-c 
FONT#006699    #图形所有字体color-c ARROW#FF0000  #两个箭头color-c 
AXIS#FF0099    #两条箭头线color-c BACK#FFFFFF    #图形背景(不含数据区)color-c 
CANVAS#000000   #图形数据区背景color-c MGRID#ee2359  #主网格线color-c 
GRID#FF0000    #次网格线color

转自:http://blog.liuts.com/post/215/#entrymore</xff=unknown

原创文章,作者:s19930811,如若转载,请注明出处:http://www.178linux.com/1267

(0)
s19930811s19930811
上一篇 2015-03-20
下一篇 2015-03-21

相关推荐

  • linux学习笔记: shell脚本编程相关(上)

    前言 unix/linux操作系统下的shell,是一种壳,其目的是提供一个用户与计算机相互交互的命令接口,通过输入各种命令,达到操作的目的。 与此同时,shell支持控制流程,进而可以组合出各种各样的应用实例。 shell脚本的格式  首行shebang机制:  bash脚本,首行添加#!/bin/bash&nbsp…

    Linux干货 2017-04-18
  • vim编辑器

    vim编辑器    模式化编辑器                        &nbsp…

    Linux干货 2016-08-10
  • 马哥教育网络班20期+第二周课程练习

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。 2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。 3、请使用命令行展开功能来完成以下练习:    (1)、创建/tmp目录下的:a_c, a_d, b_c, b_d   …

    Linux干货 2016-06-23
  • 文本处理三剑客–sed使用详解

    处理文本的工具sed Stream EDitor     行编辑器 sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。…

    Linux干货 2017-05-21
  • CentOS 6 启动流程

    CentOS6启动流程 1.加载BIOS的硬件信息,获取第一个启动设备 2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息 3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备 4.核心执行init程序,并获取默认的运行信息 5.init程序执行/etc/rc.d/rc.sysinit文件 6.启动核心的外挂模块 7.ini…

    2017-09-01
  • Linux终端类型介绍

    相关命令:tty 适合阅读人群:所有   终端机 终端(Computer terminal),是一台电子计算机或者计算机系统,用来让用户输入数据,及显示其计算结果的机器。又名终端机,它与一部独立的电脑不同,其实就是一种输入输出设备,一台电脑多人使用,每增加一个用户只须增加一台显示器和一套键盘鼠标就可以成为一个独立的终端,多用户可同时使用互相独立,跟…

    Linux干货 2016-10-14