rrd_fetch 不包含上次更新的值。为什么?

rrd_fetch does not contain values from last update. why?

我正在将来自温度传感器的信息存储在 rrd 中。我想从 php.

中的给定时间跨度中检索值

对于最近 2 小时的数据,我使用这个:

rrd_fetch($file, array("AVERAGE", "-s -2h"));

这是有效的。但是,在 rrd_fetch 的数据中找不到我可以通过 rrd_lastupdate($file); 获得的最后一个值。我如何调整我的代码,以便 rrd_fetch 调用也包含上次更新的数据?

rrd 在Python中是这样设置的:

   rrdtool.create(
        RRD_FILE,
        "--start", "now",
        "--step", "300",
        "RRA:AVERAGE:0.5:1:288",
        "RRA:AVERAGE:0.5:12:336",
        "RRA:AVERAGE:0.5:288:365",
        "DS:temp:GAUGE:600:0:50")

并在 while 循环中像这样更新:

while True:
    temp = get_value()
    data_rrd = "N:{0}".format(temp)
    try:
        rrdtool.update(file, data_rrd)
    except:
        print("Failed to write to RRD.")
    time.sleep(300)

这是因为 lastupdate()fetch() 做的事情不同。

当您将数据添加到 RRD 时,有一个 multi-stage 进程在后台进行。首先,将数据转换为 Rates;然后归一化;然后合并。

  1. 数据已提交update()

  2. 数据被转换为费率。如果你的DS是gauge类型那么这是一个noop,但是其他类型会根据上一次更新的时间进行转换。

  3. 现在我们得到lastupdate()返回的值,就是这个DP(datapoint)

  4. 数据已标准化。这意味着我们假设从最后一个已知数据点开始线性进展,并计算最后一步间隔(上面示例中的 300 秒)的平均值。这在时间 window 边界上给出了一个新的 PDP(主要数据点)(即 PDP 时间是间隔的倍数)

  5. PDP 现已合并。收集到足够的数据后,根据 CF 和 XFF,将新的 CDP(合并数据点)写入 RRA。如果您的 RRA 有 1cdp=1pdp(如您的情况),那么 CDP 应该与 PDP 相同。

  6. 现在我们得到了RRA中的CDP,也就是fetch()returns.

从这里可以看出,您存储的值与 lastupdate() 不同(由于归一化和速率);这与 fetch() 不同(由于 Consolodation)。

此外,在 window 完成之前,您不会看到 lastupdate() 中出现的值;在 RRA CDP 完成之前,您不会看到它出现在 fetch() 中。

由于您的 fetch() 没有要求比您的 1cdp=1pdp RRA 中更多的数据,您将避免由于合并而发生的更改,但您可能会达到规范化。

如果您希望显示的值相同,则需要确保所有 3 个操作都是 no-ops。

  1. 使用类型gauge停止汇率转换

  2. 确保所有更新都准确地在时间范围内完成,以避免规范化。不要在更新中使用 'N'(现在),将其固定为时间戳,该时间戳是 Interval (300s) 的倍数。

  3. 拥有足够大的 1cdp=1pdp RRA 以避免合并。

有关这方面的更多详细信息,请在此处查看 Alex 的著名页面:http://rrdtool.vandenbogaerdt.nl/process.php