• rrdtool


    参考

    http://oss.oetiker.ch/rrdtool/doc
    https://calomel.org/rrdtool.html
    http://www.cnblogs.com/lightideal/archive/2012/03/14/2395613.html
    http://blog.liuts.com/post/215/
    http://www.study-area.org/tips/rrdtool/rrdtool.html
    http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=864861#
    http://www.cnblogs.com/orez88/articles/1886654.html

    rrdtool

    RRDtool是指Round Robin Database工具(环状数据库)。

    Round robin是一种处理定量数据、以及当前元素指针的技术。想象一个周边标有点的圆环-这些点就是时间存储的位置。从圆心画一条到圆周的某个点的箭头-这就是指针。就像我们在一个圆环上一样,没有起点和终点,你可以一直走下去。过来一段时间,所有可用的位置都会被用过,该循环过程会自动重用原来的位置。这样,数据集不会增大,并且不需要维护。我们使用RRDtool来处理RRD数据库。使用它向RRD数据库存储提取数据。

    RRD适合存储时间序列的数据。就是说你必须能够在时间的几个点上度量某些值,并提供这些信息给RRDtool。如果你能够做到这一点,RRDtool就能够存储它们。这些数值必须是数字,但是不一定要是整数。

    命令

    rrdtool create filename [--start|-b start time][--step|-s step][DS:ds-name:DST:heartbeat:min:max][RRA:CF:xff:steps:rows]
    rrdtool info filename
    rrdtool last filename
    rrdgraph filename
    

    --start

    数据库开始时间,默认是now - 10s,使用utc时间。可以使用now - 1s, now - 1d, now - 1w, now - 1m, now - 1y建立不同开始时间的数据库。

    --step

    步进时间间隔,默认是5分钟(300s)

    DS(Data Soure)

    必须是 0-9,a-z,A-Z。

    DST(Data Source Type)

    使用GAUGE, COUNTER, DERIVE, DCOUNTER, DDERIVE, ABSOLUTE这几种类型名。注意选择合适的类型。

    COUNTER 必须是递增的,除非是计数器溢出(overflows)。在这种情况下,RRDtool会自动修改收到的值。例如网络接口流量、收到的packets 数量都属于这一类型。

    DERIVE 和COUNTER类似。可以是递增,也可以递减,或者一会增加一会儿减少。

    ABSOLUTE ABSOLUTE比较特殊,它每次都假定前一个interval的值是0,再计算平均值。

    GAUGE GAGUE和上面三种不同,它没有平均的概念,RRDtool 收到值之后字节存入RRA中

    计算公式
    Values = 300, 600, 900, 1200  # 假设RRDtool收到4个值,分别是300,600,900,1200
    Step = 300 seconds # step为300

    COUNTER = 1,1, 1,1 # (300-0)/300,(600-300)/300,(900-600)/300,(1200-900)/300 ,所以结果为 1,1,1,1
    DERIVE = 1,1,1,1 # 同上
    ABSOLUTE = 1,2,3,4 # (300-0)/300,(600-0)/300 , (900-0)/300, (1200-0)/300,所以结果为 1,2,3,4
    GAUGE = 300, 600, 900, 1200 # 300 , 600 ,900 ,1200 不做运算,直接存入数据库

    COMPUTE COMPUTE比较特殊,它并不接受输入,它的定义是一个表达式,能够引用其他DS并自动计算出某个值。
    例如DS:eth0_bytes:COUNTER:600:0:U DS:eth0_bits:COMPUTE:bytes,8,*

    heartbeat

    取值有效区间。设定600,如规定时间没有产生值,则取当前时间-300 ~ +300,共600秒的平均值,用做当前的产生值

    min:max

    取值的选择范围,超过此区间,属无效。

    RRA(Round Robin Archive)

    指定数据如何存放。我们可以把一个RRA看成一个表,各保存不同interval的统计结果。比如存储一年,一月,一周,一天,就需要4条。

    CF(consolidation function)

    4种类型:AVERAGE、MIN、MAX、LAST,代表平均,最小,最大,最后
    AVERAGE类型适合于看‘平均’情况,例如一天的平均流量

    MAXIMUM MINIMUM 不适用想知道‘xxx/秒’这样的需求,而是适用于想知道某个对象在各个不同时刻的表现的需求,也就是着重点在于各个时间点
    例如要看某个接口在一天内有没有超过50Mb流量的时候就要用 MAXIMUM
    例如要看磁盘空间的空闲率在一天内有没有低于20%的时候就要用 MINIMUM

    LAST 类型适用于‘累计’的概念

    xff

    steps:rows

    steps步进单位,可以动态调整默认步进的周期.如steps为6, 周期就调整为5m*6=30m(0.5h)
    rows采样的总记录数

    如何选择steps和rows的值?
    数据库step是5m(300s), 计算公式 rows = (60 / steps * default step) * 存储总时长(h)
    规划存储1天,每5分钟采样1次: (60 / (1 * 5)) * 24 = 288
    规划存储1周,每30分钟采样1次: (60 / (6 * 5)) * 24 * 7 = 336

    实际情况,存储2倍的样本适合,1d 1:600, 1w 6:700, 1m 24:775, 1y 288:797

    如果step是1m(60s)的情况,
    1h 60个画图点,
    1d 如果需要300左右画图点的话 288 / 24 = 12/h,steps为5(60/12), rows 600(2882)
    1w 350 / 7 = 50/d, steps为20(60/3), rows 600(288
    2)
    1m 300 / 30 = /d
    1y 360 天,每天画1个 360

    RRA:AVERAGE:0.5:1:600 # hour
    RRA:AVERAGE:0.5:5:600 # day
    RRA:AVERAGE:0.5:30:700 # week
    RRA:AVERAGE:0.5:120:800 # month
    RRA:AVERAGE:0.5:1440:800 # year

    PDP(Primary Data Point)

    在每个interval,RRDtool都会收到一个值,RRDtool在收到脚本给来的值后会计算出另外一个值(例如平均值),这个值就是PDP。
    这个值代表的一般是’xxx/秒‘的含义。注意,该值不一定等于RRDtool收到的那个值。除非是GAUGE。

    CDP(Consolidation Data Point)

    RRDtool使用多个PDP合并为一个CDP。也就是执行上面的CF操作后的结果。这个值就是存入RRA的数据,绘图时使用的也是这些数据。

    RRA实例

    img

    RRA:AVERAGE:0.5:1:603 # 5分钟采样,存储603条记录
    RRA:AVERAGE:0.5:6:603 # 30分钟采样,存储603条记录
    RRA:AVERAGE:0.5:24:603 # 2小时采样,存储603条记录
    RRA:AVERAGE:0.5:288:800 # 1天采样,存储800条记录
    RRA:MAX:0.5:1:603
    RRA:MAX:0.5:6:603
    RRA:MAX:0.5:24:603
    RRA:MAX:0.5:288:800

    时间戳转换

    date -d '1970-1-1 1276059000 sec utc' +%Y%m%d %H:%m:%S
    date --date='@1435134401' +%Y%m%d %H:%m:%S
    
    date -d '2010-09-11 23:20:00' +%s
    

    随机数区间

    start=1435134401; for i in {1..288}; do time=$[$start+i*300]; value=$(shuf -i 1-100 -n 1); rrdtool update cpu.rrd $time:$value; done
    
    # shuf -i 1-100 -n 1 取1-100的随机数
    

    example

    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
    

    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:" 
    " 
    COMMENT:" 
    " 
    AREA:value1#00ff00:上传 
    GPRINT:value1:LAST:"当前:%8.0lf"  
    GPRINT:value1:AVERAGE:"平均:%8.0lf"  
    GPRINT:value1:MAX:"最大:%8.0lf"  
    GPRINT:value1:MIN:"最小:%8.0lf"  
    COMMENT:" 
    " 
    LINE2:value2#4433ff:下载 
    GPRINT:value2:LAST:"当前:%8.0lf"  
    GPRINT:value2:AVERAGE:"平均:%8.0lf"  
    GPRINT:value2:MAX:"最大:%8.0lf"  
    GPRINT:value2:MIN:"最小:%8.0lf"  
    COMMENT:" 
    " 
    COMMENT:"─────────────────────────────────────────────
    " 
    LINE3:value3#ff8833:总流量 
    COMMENT:" 
    " 
    HRULE:350000#ff0000:"报警值" 
    COMMENT:" 
    " 
    COMMENT:"															最后更新 :$(date '+%Y-%m-%d %H:%M')
    " -Y 
    

    Time range

    --start time # 开始时间
    --end time # 结束时间

    Labels

    --title # 水平标题
    --vertical-label # 垂直标题

    Size

    --width --height # 宽度 x 高度,默认400 x 100

    Limits

    --upper-limit
    --lower-limit
    --rigid
    --alt-autoscale
    --alt-autoscale-min
    --alt-autoscale-max
    --no-gridfit

    X-Axis

    --x-grid GTM:GST:MTM:MST:LTM:LST:LPR:LFM # x轴竖线和日期标记位置
    GTM:GST 控制次要格网线的位置。用于整点内的划分,比如1小时内,每15分钟划1条线。
    GTM 是一个时间单位,可以是 SECOND、MINUTE、HOUR、DAY 、WEEK、MONTH、YEAR。GST 则是一个数字,控制每隔多长时间放置一根次要格线。例如我们要画一个1天的图表,决定每15分钟一根次要网格线,则格式为 MINUTE:15。

    MTM:MST 控制主要网格线的位置。用于整点,比如每1小时划1条线。

    LTM:LST 控制每隔多长时间输出一个label。设置为每2小时。

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

    --week-fmt # 默认使用'Week %V'显示周,可以换用其他

    Y-Axis

    --y-grid grid step:label factor # 类似x-grid,建议不用。

    --alt-y-grid # 根据y轴区间自动划分网格

    --units-exponent
    --alt-y-grid自动对Y轴的值进行调整,以k为单位显示。但如果你不想以k显示,而是想固定以某个单位来显示(M,b)。
    使用--units-exponent value,value范围是-18、-15、-12、-9、-6、-3、0、3、6、9、12、15、18。
    0表示以原值显示,3表示数值除以1000,以k为单位显示,6就是以M显示,9就是以G显示,12则T。

    color

    --color COLORTAG#rrggbb[aa]
    COLORTAG
    BACK background # 背景
    CANVAS for the background of the actual graph # 图形数据区
    SHADEA for the left and top border # 左上边界
    SHADEB for the right and bottom border # 右下边界
    GRID, MGRID for the major grid # 主网格线,次网络线
    FONT for the color of the font # 字体
    AXIS for the axis of the graph # 箭头线
    ARROW for the arrow head pointing up and forward # 箭头
    FRAME for the line around the color spots # 数据标志说明边框

    [aa] # 透明模式
    00 is off, FF is maximum

    font

    --font FONTTAG:size[:font]
    FONTTAG
    DEFAULT sets the default value for all elements # 全部数据
    TITLE for the title # 标题数据
    AXIS for the axis labels # x轴数据
    UNIT for the vertical unit label # y轴数据
    LEGEND for the graph legend # 刻字数据
    WATERMARK for the watermark on the edge of the graph # 水印数据

    Data and variables

    DEF(Definition)
    DEF:vname=rrdfile:ds-name:CF[:step=step][:start=time][:end=time]
    vname变更名称
    rrdfile文件位置
    ds-name数据源名称
    CF CF名称

    VDEF(Variable Definition)
    VDEF:vname=RPN expression

    CDEF(Calculation Definition)
    CDEF:vname=RPN expression
    使用数组操作,类似于python的join, 操作优先画图,比如byte to bit

    graph

    COMMENT:text # 打印文本,如换行,最大值,最小值等等
    GPRINT:vname:format # 输出值,比如最大值是什么?

    LINE[width]:value[#color][:[legend][:STACK][:skipscale][:dashes[=on_s[,off_s[,on_s,off_s]...]][:dash-offset=offset]]]
    画线,可以指定color,legend,STACK

    rrdtool fetch if_octets-eth0.rrd AVERAGE --start -1h --end now-60s

  • 相关阅读:
    [Javascript] Broadcaster + Operator + Listener pattern -- 9. Create modify, filter, map operators
    [Javascript] Broadcaster + Operator + Listener pattern -- 8. Pass a Done Symbol when an Async Function is Done
    [Javascript] Broadcaster + Operator + Listener pattern -- 7. Create a broadcaster forOf
    [Javascript] Broadcaster + Operator + Listener pattern -- 6. Create a Buffer to Pair Values Together with Zip
    [Functional Programming] Match Function Requirements with Lodash Partial and Flip
    [Javascript] Broadcaster + Operator + Listener pattern -- 5. Merge (Example)
    [React] Performance: Split state update and component render with Hoc
    [React] Optimize context value
    [React] useAsync
    Nodejs.sublime-build 在sublime3中的配置
  • 原文地址:https://www.cnblogs.com/liujitao79/p/4599687.html
Copyright © 2020-2023  润新知