时序数据库/RRDTOOL¶
@2010-07-16 新版功能: 创建,xff 解释
在 @2012-11-17 版更改: 增加演示 shell 代码
在 @2013-08-18 版更改: 增加 rrdcached 解释
演示代码¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #!/bin/sh
rm -fr count.rrd gauge.rrd
rrdtool create rrdtool.rrd --step 60 DS:gauge:GAUGE:120:0:U DS:count:COUNTER:120:0:U RRA:AVERAGE:0.5:1:60
start=$(date --date='20121204' +%s)
for i in `seq 1 60`; do
t=$((start + i * 60))
rrdtool update rrdtool.rrd --template gauge:count ${t}:${i}:$((i * i * 2))
done
WIDTH=504
HEIGHT=128
DATETIME=$(date)
INTERVAL=$((24 * 3600))
rrdtool graph rrdtool.png -i -M -s ${start} -e $((start + 3600)) \
-w ${WIDTH} -h ${HEIGHT} \
-l 0 \
DEF:rcount=rrdtool.rrd:count:AVERAGE \
DEF:rgauge=rrdtool.rrd:gauge:AVERAGE \
CDEF:count=rcount,1,* \
CDEF:gauge=rgauge,10,/ \
LINE1:count#00ff00:"count" \
LINE1:gauge#0000ff:"gauge"
|
xff 的意义¶
一直对 rrdtool 在 create 时 RRA 中的 xff 参数的意义不是很清楚,今天 仔细研究了一下,做个总结。下面是 man rrdcreate 里的说明:
*RRA:_AVERAGE_ | MIN | MAX | LAST:xff:steps:rows*
*xff The xfiles factor defines what part of a consolidation interval may
be made up from *UNKNOWN* data while the consolidated value is still
regarded as known. It is given as the ratio of allowed *UNKNOWN* PDPs
to the number of PDPs in the interval. Thus, it ranges from 0 to 1
(exclusive).*
xff 决定在给定间隔中可以有多大比例的未知 PDP,超过这个比例则该间隔内的值 为 UNKNOWN ,其取值范围为前闭后开区间,即: [0, 1) 。举两个极端的例子:
xff = 0 表示不能有未知 PDP
xff = 0.9 表示可以有 90% 的 PDP
下面是测试的程序(备忘)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #!/bin/sh
LANG=C
xff=0.5
#t=$(date +%s)
t=1480272727
echo $(date), $t
rrdtool create test.rrd -b $(date +%s) --step 1 DS:temp:GAUGE:1:0:100 RRA:AVERAGE:${xff}:5:10
for i in `seq 1 20`; do
rrdtool update test.rrd ${t}:${i}
t=$((t + 1))
done
rrdtool dump test.rrd
|
使用 rrdcached 降低 IO 压力¶
在 RRDtool 的数据文件较多时,磁盘 IO 会给系统带来一定的压力。rrdcached 即是解决该问题的一个方法。相应的代码修改也非常简单,只需要设置 RRDCACHED_ADDRESS 环境变量或者修改相应的更新方法增加一个参数 "-l daemon_address" 即可。不过需要注意的是,如果在每次数据更新(update 方法) 后接着有其他的操作(如graph等)则 rrdcached 起不到应有的作用。原因是 rrdcached 仅对 update 方法才会有 cache,其他方法在执行之前都会先发送 FLUSH 命令,导致数据直接更新到文件,即清空 cache。因此,rrdcache 不适用 于在数据更新(update)之后马上执行 graph 等操作的场景。