簡體   English   中英

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

[英]rrd_fetch does not contain values from last update. why?

我將來自溫度傳感器的信息存儲在 rrd 中。 我想從 php 中的給定時間跨度中檢索值。

對於過去 2 小時的數據,我使用這個:

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

這是工作。 但是,我可以通過rrd_lastupdate($file);獲得的最后一個值。 在 rrd_fetch 的數據中找不到。 我如何調整我的代碼,以便 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 時,后台會執行一個多階段過程。 首先,將數據轉換為 Rates; 然后歸一化; 然后合並。

  1. 數據提交update()

  2. 數據被轉換為速率。 如果您的 DS 是gauge類型那么這是一個 noop,但其他類型將根據上次更新的時間進行轉換。

  3. 現在我們得到了lastupdate()返回的值,也就是這個 DP(數據點)

  4. 數據被歸一化。 這意味着我們假設從最后一個已知數據點開始線性進展,並計算最后一步間隔(上面示例中的 300 秒)的平均值。 這在時間 window 邊界上給出了一個新的 PDP(主要數據點)(即 PDP 時間是間隔的倍數)

  5. PDP 現在已合並。 收集到足夠的數據后,根據 CF 和 XFF,將新的 CDP(合並數據點)寫入 RRA。 如果您的 RRA 具有 1cdp=1pdp(如您的情況),則 CDP 應與 PDP 相同。

  6. 現在我們得到 RRA 中的 CDP,這就是fetch()返回的內容。

由此,您可以看到您存儲的值與lastupdate() (由於歸一化和速率); 這與fetch()不同(由於 Consolodation)。

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

由於您的fetch()沒有要求比 1cdp=1pdp RRA 中更多的數據,因此您將避免由於合並而發生的更改,但您可能會遇到規范化。

如果您希望顯示的值相同,則需要確保所有 3 個操作都是空操作。

  1. 使用 type gauge停止 Rate 轉換

  2. 確保所有更新都准確地在時間范圍內完成,以避免規范化。 不要在更新中使用“N”(現在),將其固定為時間戳,該時間戳是間隔(300 秒)的倍數。

  3. 擁有足夠大的 1cdp=1pdp RRA 以避免 Consolodation。

有關這方面的更多詳細信息,請參閱此處 Alex 的著名頁面: http://rrdtool.vandenbogaerdt.nl/process.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM