我有 3 个 rrd 文件(File1.rrd、File2.rdd 和 File3.rrd)。我从三个文件中获取最大值、最小值和最后一个值。为了说明更多,File1.rrd 有 3 个输出(最大值、最小值和当前),同样,File2.rrd 和 File3.rrd 将各有 3 个总计 (9) 个变量作为输出。我正在尝试将所有三个最小值、最大值和当前值相加,并将其存储到三个单独的变量中,但它每次都会产生错误。不支持诸如"变量名称中的 rpn 表达式无效,RPN 最终堆栈大小 != 1、不带 DEF 或 CDEF 变量的 rpn 表达式"之类的错误。当我尝试修复它时,所有错误都会在不同的场景中生成。 以下是代码片段供您参考。
rrdfile1 = file1.rrd
rrdfile2 = file2.rrd
rrdfile3 = file3.rrd
cmdline = cmdline + 'DEF:used_file1=file1:license_out:MAX:step=' + step_value + ' ' +
cmdline = cmdline +
VDEF: 'min_file1 = used_file1,MINIMUM' +
VDEF: 'max_file1 = used_file1,MAXIMUM' +
VDEF: 'cur_file1 = used_file1,LAST' +
VDEF: 'min_file2 = used_file2,MINIMUM' +
VDEF: 'max_file2 = used_file2,MAXIMUM' +
VDEF: 'cur_file2 = used_file2,LAST' +
VDEF: 'min_file3 = used_file3,MINIMUM' +
VDEF: 'max_file3 = used_file3,MAXIMUM' +
VDEF: 'cur_file3 = used_file3,LAST' +
我试图这样总结:
cmdline = cmdline + 'CDEF:Total_min = min_file1,min_file2, min_file3, +, +, + ' '
cmdline = cmdline + 'CDEF:Total_max = max_file1,max_file2, max_file3, +, +, + ' '
cmdline = cmdline + 'CDEF:Total_cur = cur_file1,cur_file2, cur_file3, +, +, + ' '
另外,疲惫不同的方法,但没有任何效果,我知道我们不能像这样求和,我们应该在 CDEF 中传递 DEF 变量,但不知道如何做到这一点。你能帮帮我吗?上面提到的代码不是实际代码,仅供您参考。
提前谢谢你。
"invalid rpn expression in a variable name, RPN final stack size != 1, rpn expressions without DEF or CDEF variables are not supported"
此错误消息告诉您问题所在;RPN 函数(可能在 CDEF 中)格式不正确。 原因是您需要在其中有一个 DEF 或 CDEF 变量,并且您正在使用 VDEF 变量。
有什么区别?
好吧,DEF 或 CDEF 是一系列值,可以绘制成图表。 另一方面,VDEF 是整个时间序列的单个值摘要。
DEF 是一组直接来自 RRD 文件的值,具有选定的分辨率(时间步长)和安慰因子(平均值、最大值、最小值)。
CDEF 是一组计算值,至少处理一个 DEF 或 CDEF 集。
但是,您的 VDEF 采用一组值(来自 DEF 或 CDEF)并对其进行汇总。 当您的图表显示 5 分钟间隔的平均值时,您可以通过这种方式获取全天的平均值。
那么,如何做你想做的事情呢?
您需要的是使用DEF 从 RRD 中提取具有正确安慰因子的多个时间序列;然后使用 CDEF 将它们相加。 您可能还希望使用 VDEF ot 获取页脚中文本的单个值。
例:
DEF:lasta=file.rrd:a:LAST
DEF:lastb=file.rrd:b:LAST
CDEF:lasttotal=lasta,lastb,+
DEF:maxa=file.rrd:a:MAXIMUM
DEF:maxb=file.rrd:b:MAXIMUM
CDEF:maxtotal=maxa,maxb,+
LINE:lasttotal#ff0000:"Last
LINE:maxtotal#00ff00:"Maximum for this interval"
VDEF:overallmaxtotal=maxtotal,MAXIMUM
PRINT:overallmaxtotal:"The maximum for the whole graph is %lf"
但是,您还有另一个问题。
随着颗粒度的降低 - 并且您移动到更大的时间窗口 - 总计的计算变得越来越不准确。 这是因为max(a+b) <> max(a)+max(b)
随着求和间隔的增加。 对于MAX和MIN都是如此,但对于LAST或AVG则不然。 获得适当准确性的唯一方法是在存储在 RRD 中之前进行求和。
此外,使用 AVERAGE 可能比使用 LAST 更好,因为当您移动到较低的粒度时,AVERAGE会正确组合值。
RRDTool网站上有很多信息可以帮助您了解。