如果我将RRD转储到XML,那么在"PDP状态"部分下有三个元素:<last_ds>
、<value>
和<unknown_sec>
。例如:
<!-- PDP Status -->
<last_ds>90</last_ds>
<value>4.2177496500e+03</value>
<unknown_sec> 184 </unknown_sec>
现在,据我所知,每次我执行"rrd更新"时,我都会更新主数据点(PDP)。看起来无论我把什么作为rrdtool update
(例如rrdtool update test.rrd "N:abc"
)的值,它都显示为<last_ds>
元素的值。但是,<value>
的数字是如何计算的?我指的是上面例子中的数字4217.7496500
。这是某种平均水平吗?最后但同样重要的是,虽然我知道<unknown_sec>
显示DS值未知时的秒数,但这个计数器似乎在280-295秒之间。如何解释?我的意思是,例如,如果我执行while true; do rrdtool update test.rrd "N:75"; rrdtool dump test.rrd | grep "<unknown_sec>"; sleep 1; done
,其中75低于该DS允许的最低值,那么输出如下:
/* data not shown for brevity */
<unknown_sec> 280 </unknown_sec>
<unknown_sec> 281 </unknown_sec>
<unknown_sec> 282 </unknown_sec>
<unknown_sec> 0 </unknown_sec>
<unknown_sec> 1 </unknown_sec>
<unknown_sec> 2 </unknown_sec>
/* data not shown for brevity */
<value>
的PDP内容是输入值乘以该值有效期的所有乘积的总和。为了构建PDP,在间隔结束时,该值除以间隔的持续时间减去未知秒数。。。启动新间隔时,未知秒数重置为0。。。
尽管上面RRDtool的创始人给出了正确的答案,但这还不够直白。
计算PDP的过程复杂而不平凡,即使是像ChatGPT-4这样的高级LLM也可能无法完全理解它。这个结论是基于我在半个晚上与它进行的漫长而深入的讨论。。。
我建议使用此页面,以使计算更加感性。
用简单的文字来解释这一点(经过近半个晚上的搜索、阅读、验证和总结):
- 假设一个5秒的步长(用RRD定义,而不是RRA)间隔,记为[0,5],[5,10],[10,15](交集是平凡的)
- 输入,格式为(时间,值):(00:03,8)、(00:06,1)和(00:17,6)
- 现在,如果我们从时间点00:00以5秒的间隔(用RRA步长定义)获取数据,我们可以得到以下结果:(时间:00:05,值:5.2)、(时间:00.10,值:5)、(日期:00:15,值:6)
计算可描述如下
- 对于区间[0,5]:我们估计值8从00:00(宇宙开始)到00:03,值1从00:03(上次我们知道确切输入值时)到00:06(1发生确切输入时间后),然后计算:
(8*3 + 1*2)/5 = 26/5 = 5.2
- 对于区间[5,10]:同样,计算
(1*6 + 6*4)/5 = 5
- 对于区间[10,15]:在00:17从00:06开始输入的值6覆盖了整个区间,因此结果为6
一些读者可能会发现这些示例输入数据来自此页面。然而,对它的解释和计算是不准确的,而我上面列出的结果可以用最新版本的RRDtool进行验证。
总之,PDP是输入值的加权平均值,其中每个项是输入值与其持续时间的乘积。这个所谓的持续时间是这个输入值和最后一个输入值之间的时间跨度。