RRDTool数据值(例如最大值)在不同的时间分辨率下是不同的

RRDTool data values (e.g. max value) are different in different time resolutions

目前我正在尝试使用 RRDTool。我知道选择的时间段越长,准确性就越低。但我想我可以用我的数据源设置绕过这个。

例如我家的温度和湿度,resoultion 1h:

现在分辨率为 1d:

如您所见,最大差异很大。蓝线的值。

我使用以下值创建了我的数据源和档案:

"rrdtool create temp.rrd --step 30",
"DS:temp:GAUGE:60:U:U",
"DS:humidity:GAUGE:60:U:U",
"RRA:AVERAGE:0.5:1:1051200",
"RRA:MAX:0.5:1:1051200",
"RRA:MIN:0.5:1:1051200",

我认为 1051200(1 年 = 31536000 / 30 秒(分辨率)= 1051200)对于保存一年的每个值都是正确的,不需要插值。

即使分辨率发生变化(例如,最大湿度 (Luftfeuchtigkeit) 为 99.9%),是否也可以获得显示的准确值?

以下是我对图像创作的价值观:

"--start" => "-1h", (-1d etc-)
"--title" => "Haustemperatur",
"--vertical-label" => "°C / % RLF",
"--width" => 800,
"--height" => 600,
"--lower-limit" => "-5",
"DEF:temperatur=$rrdFile:temperatur:LAST",
"DEF:humidity=$rrdFile:humidity:LAST",
"LINE1:temperatur#33CC33:Temperatur",
"GPRINT:temperatur:LAST:\t\tAktuell\: %4.2lf °C",
"GPRINT:temperatur:AVERAGE:Schnitt\: %4.2lf °C",
"GPRINT:temperatur:MAX:Maximum\: %4.2lf °C\j",
"LINE1:humidity#0000FF:Relative Luftfeuchtigkeit",
"GPRINT:humidity:LAST:Aktuell\: %4.2lf %%",
"GPRINT:humidity:AVERAGE:Schnitt\: %4.2lf %%",
"GPRINT:humidity:MAX:Maximum\: %4.2lf %%\j",

感谢您的帮助和任何建议。

P.S。我正在使用一个库来生成图表和数据库,请不要对可能出现的语法错误感到惊讶。

您的问题是您导致值在图表时间动态汇总,但没有正确指定要使用的汇总函数。您的第二张图显示的是间隔中最后一个的最大值,而不是真正的最大值。

此配置有几个问题需要说明:

首先,您的 RRD 是使用 1cdp=1pdp 和不同合并函数(AVG、MIN、MAX)的 3 个 RRA 定义的。这意味着它们在功能上是相同的,但它们不会为您节省任何绘图时间,因为它们没有为您做任何预汇总!您绝对应该考虑只使用其中一个(可能是 AVG)并以较低的分辨率添加其他分辨率,以在您有更多时间时帮助加快绘图速度 window。

其次,您需要指定on-the-fly rollup 功能。绘制图形时,RRDTool 将根据您的 DEF 线计算出要使用的最佳 RRA,并将即时执行所需的任何额外合并。如果唯一可用的 RRA 粒度太高,这可能需要很长时间。

您的图形请求使用 DEF:temperatur=$rrdFile:temperatur:LAST 但您实际上没有 LAST 类型的 RRA,因此 RRDTool 将获取最后的平均值。您的 RRA 数据点间隔为 30 秒,但您的第二张图每个像素(大约)5 分钟,这意味着 RRDTool 需要从 RRA 中获取 10 个条目,并打印最后一个。查看顶部图表中的数据,该区间的最后一个值似乎是 66,尽管之前的值是 100。

所以你有一个选择。您是否希望图表显示时间段的平均值、最大值或两者?您希望底部的数字显示平均值的最大值,还是所有值的最大值?

例如

"DEF:temperatur=$rrdFile:temperatur:AVERAGE",
"DEF:humidity=$rrdFile:humidity:AVERAGE",
"DEF:temperaturmax=$rrdFile:temperatur:MAX;reduce=MAX",
"DEF:humiditymax=$rrdFile:humidity:MAX;reduce=MAX",
"LINE1:temperatur#33CC33:Temperatur",
"LINE1:temperaturmax#66EE66:Maximum Temperatur",
"GPRINT:temperatur:LAST:\t\tAktuell\: %4.2lf °C",
"GPRINT:temperatur:AVERAGE:Schnitt\: %4.2lf °C",
"GPRINT:temperaturmax:MAX:Maximum\: %4.2lf °C\j",
"LINE1:humidity#0000FF:Relative Luftfeuchtigkeit",
"LINE1:humiditymax#3333FF:Maximum Luftfeuchtigkeit",
"GPRINT:humidity:LAST:Aktuell\: %4.2lf %%",
"GPRINT:humidity:AVERAGE:Schnitt\: %4.2lf %%",
"GPRINT:humiditymax:MAX:Maximum\: %4.2lf %%\j",

在这种情况下,我们为最大数据集定义一个单独的DEF,这样我们即使在合并后也始终可以获得最高值。这也用在 GPRINT 中,以便我们得到 MAX 的 MAX 而不是 AVERAGE 的 MAX。最大线现在与平均线分开绘制,这样我们就可以看到任何数据汇总的效果 - 这些线将在高分辨率下聚集在一起,但随着时间 window 变宽和分辨率降低而变得更远.

DEF 设置为强制任何用于最大值的汇总函数为 MAX 而不是 AVG,因此我们可以确保获得最大值而不是最大值的平均值。

我们还使用 AVERAGE 而不是 LAST,以便在汇总后获得更有意义的数据。请注意,如果我们想要,我们也可以为 LAST 使用单独的 DEF,尽管它的用处不大。

请注意,如果您希望在超过几天的时间内生成图表,您绝对应该考虑为 AVERAGE 和 MAX 添加一些较低分辨率的 RRA,否则图表生成会非常缓慢。 RRDTool 的设计目的是数据将随着时间的推移而累积,而不是(如在传统数据库中)每个样本都保持原样。因此,除非您真的需要将 30 秒分辨率的数据保存一整年,否则您可能更愿意将此高分辨率数据只保存一周,然后使用单独的 RRA,这些 RRA 可以累计 1 小时的分辨率并保存更长时间。很多人保持30s 2天,然后30min-summary 2周,2h-summary 2个月,然后1day-summary 2年

有关详细信息,请参阅 the RRDTool manual pages