首页 > 解决方案 > RRDTool 数据值(例如最大值)在不同的时间分辨率下是不同的

问题描述

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

例如我家的温度和湿度,分辨率 1h:

1小时分辨率

现在分辨率为 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",

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

PS 我正在使用库来生成图形和数据库,请不要对可能的语法错误感到惊讶。

标签: rrdtoolrrd

解决方案


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

这个配置有几个问题需要解释:

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

其次,您需要指定动态汇总函数。绘制图形时,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。最大值线现在与平均线分开绘制,因此我们可以看到任何数据汇总的效果 - 这些线将在高分辨率下在一起,但随着时间窗口的扩大和分辨率的降低,它们之间的距离会越来越远。

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

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

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

有关详细信息,请参阅RRDTool 手册页


推荐阅读