Rrdtool绘制数字事件,没有锯齿状边缘

时间:2016-12-26 07:12:03

标签: rrdtool

我正在读取我的能量计输出以跟踪实际使用的能量等。能量成本是用tarif计算的,并且在白天从一个状态变为另一个状态(1或2)。当我将tarif与实际使用情况一起绘制时,tarif状态的尖锐边缘变得锯齿状,可能是由平均值引起的。

我使用过DS:tarif:GAUGE:...设置数据库,我使用DEF:tarif:xx.rrd:tarif:AVERAGE to graph。

如何录制和绘制"数字"信号有尖锐的边缘?

2 个答案:

答案 0 :(得分:1)

你可能会在这里提到两件事。

首先,确保您没有使用--slope-mode。此选项使用斜率而不是图中的步骤;这听起来像是错误的选择。

接下来,您遇到的问题是tariff DS在两个值之间变化(比如ab),但是当您查看更高级别的图表时,开始平均,看起来不对劲。

在查看高粒度(IE,特写)图时,每个RRA数据点有一个(或更多)像素,每个RRA数据点有一个样本。因此,您会看到ab。但是,当您向上移动到较低粒度(IE,更远)图表时,RRDtool将开始每个像素具有多个数据点。根据您的RRD文件定义,rrdtool将随时进行组合,或者使用不同的RRA,每个数据点使用更多样本。

因此,这意味着每个像素有多个样本,并且它们需要以某种方式组合。默认情况下,RRDTool将对它们进行平均,这可能导致锯齿状行为。

但是,你想要发生什么?如果对应于单个像素的时间间隔有2个a个实例和3个b个实例,那么该图表应显示什么?

以下是关于如何做到这一点的几点建议。

  1. 使用背景。
  2. 由于您的关税只有两个值,您可以使用它来为背景着色 - 例如,根据关税制作红色或绿色背景,然后在此顶部绘制使用图线。背景颜色可以通过使用像inf

    这样的半透明颜色从0到#ff808080的区域来完成
    1. 使用特殊的MAX(或MIN)RRA
    2. 也许您只想显示该期间的最高关税。因此,您可以为每个组合间隔创建一个额外的MAX类型RRA,并绘制MAX图形。当然,这意味着当你有1个像素= 1天时,你会看到更高的值作为一条直线。我想一个中位数' consolodation在这里很有用,但由于显而易见的原因,RRDTool没有这个。

      1. 更大的图表
      2. 大图表意味着更多像素,这意味着需要更少的平均值。

        1. 以不同方式显示您的数据
        2. 你想要想象什么?可能你不需要在这个时间窗口内看到每个单位的平均成本,计算的单位x关税总和会更好 - 特别是因为这可以平均没有问题。

          1. 不要使用RRDTool
          2. RRDTool旨在逐步对常规时​​间序列数据进行标准化,汇总和过期,并且非常有效。但是,如果您对永久拥有确切数据感兴趣,那么您可能需要一个不同的数据库。

            1. 预先规范您的采样时间
            2. 如果您的数据经常更改,那么数据规范化可能会改变它们。确保始终将数据存储在时间步边界 - 如果您的RRD步长为300(5分钟),则确保将数据存储在300的倍数的时间戳上,并且不要使用N(意思是“现在不管是什么时候”。

答案 1 :(得分:0)

感谢您提供非常精细的答案。因为我无法找到适合我的问题的答案,你的总结和我的情况,也可能有助于其他人。

回顾过去,我应该提供更多信息,在解决你的观点之前,让我现在就这样做:

以下是我的数据库定义脚本的片段:

# 5 min sample rate = 300 step rate
# 1D report: 1 step every 5 minutes (5 min sample rate=1), 20 per hr, 24hrs = 480 slots
# 1Wk report: 1 step every hour (20 x 5 min samples=20), 24 hrs, 7 days = 168 slots
# 1M report: 1 step every hour (20 x 5 min samples=20), 24 hrs, 30 days = 720 slots
# 1Y report: 1 step every day (24 Hr * 20 samples=480), 365 days = 365 slots
rrdtool create energy_mon.rrd --step 300 --start 1480943366 \
DS:meter_total:COUNTER:600:U:U \
DS:meter_low:COUNTER:600:U:U \
DS:meter_hi:COUNTER:600:U:U \
DS:energy:GAUGE:600:U:U \
DS:tarif:GAUGE:600:U:U \
RRA:AVERAGE:0.5:1:480 \
RRA:AVERAGE:0.5:20:168 \
RRA:AVERAGE:0.5:20:720 \
RRA:AVERAGE:0.5:480:365

以下是我的图表脚本的片段:

#daily
rrdtool graph $GDIR/energy_daily.png --start -1d \
-w 675 -h 250 \
--vertical-label "KWatt" \
--lower-limit=0 \
--watermark "`date`" \
DEF:energy=$DIR/energy_mon.rrd:energy:AVERAGE \
LINE1:energy$GREEN_COLOR:"Energie" \
DEF:tarif=$DIR/energy_mon.rrd:tarif:AVERAGE \
LINE1:tarif$BLACK_COLOR:"Tarief"

#two days
rrdtool graph $GDIR/energy_2days.png --start -2d \
-w 675 -h 250 \
--vertical-label "KWatt" \
--lower-limit=0 \
--watermark "`date`" \
DEF:energy=$DIR/energy_mon.rrd:energy:AVERAGE \
LINE1:energy$GREEN_COLOR:"Energie" \
DEF:tarif=$DIR/energy_mon.rrd:tarif:AVERAGE \
LINE1:tarif$BLACK_COLOR:"Tarief"

以下是“1天”结果的图表: 1 day 这是“最后48小时”的图表: 2 day

为了在图表上看到我的“tarif”以及KWatts中的实际能量使用,我将1(低)或2(正常)设置乘以100并将该数字存储在数据库中。在工作日,关税在23:00变为“低”,并在07:00恢复正常。在“每日”图表中,这是正确报告的,尽管是5分钟。样本分辨率“错误”。

如您所见,图形说明中“-2d”设置的“最后48小时”应该使用来自数据库的相同RRA数据,但tarif行不会从100切换到200,但是“坐在大约一半左右。 1-1 / 2小时,或超过30个样本。这不是基于像素级分辨率(;-)的舍入。

我目前唯一的解释是“-2d”图使用第二个RRA,实际上是用于一周的数据。如果这是答案,那么如何影响绘图指令中的“-d / w / m / y”设置与预期的RRA之间的关系?我没有看到两者之间的联系,所以它可能是自动选择的,并且最有可能(如果它那么聪明)基于数据点的数量。第一个RRA没有足够的,所以它切换到使用第二个RRA。看似合理,但这是真的吗?

BTW,对于我使用的其他图表使用“-1w”,“ - 1m”和“-1y”,在tarif“信号上显示相同的奇怪结果。

与此同时,我已经能够“修复”图形,而无需通过添加CDEF来重新定义我的数据库。这是我用于除“1d”以外的所有图形的内容。

DEF:tarif=$DIR/energy_mon.rrd:tarif:AVERAGE \
CDEF:normaal=tarif,100,GT,200,100,IF \
LINE1:normaal$BLACK_COLOR:"Tarief"

解释CDEF,如果关税是> 100(或实际上1 =低),将结果设置为“normaal”,这是高关税。如果没有,将关税设置为“dal”或低。

您使用背景颜色进行关税的建议是非常好的,因为我可以在当前数据库中使用它,我也尝试过。

你的MIN / MAX解决方案也是如此,我之前考虑过这个问题,但是因为这需要设置一个新数据库并用之前的数据填充它。 (我以.csv形式出现,之前我经历过那种乏味的练习 - 这就是为什么我在rddtool中创建了--start)

但是,我想谈谈这个问题的底部。 您或其他任何人是否有更多的智慧之词可以分享或验证/解释RRA的工作< ==> DEF关系还是选择?