rrdtool:在一个滑动窗口内计算95%的数据



我使用rrdtool来绘制Munin生成和存储的CPU使用情况数据。Munin(至少对我们来说)将每个数据系列存储在一个.rrd文件中,该文件具有12个RRA:"5米间隔中的最后2天"、"30米间隔中最后9天"、《12小时间隔中最后270天》和"144天间隔中最后177天"这四个周期中的每一个周期的"MIN"、"MAX"one_answers"AVERAGE"。

我已经知道如何使用rrdtool graph来生成一条趋势线,指示我的平均CPU使用情况。(为了简单起见,我们可以假装我在一个CPU系统上;在现实生活中,我有更多的代码来处理它。)

rrdtool graph /tmp/foo.png 
  --start -12w --end +24w 
  --lower-limit 0 --upper-limit 100 --rigid 
  --title 'cpu usage' --width 620 --height 200 --border 0 
  --vertical-label 'cpu usage' 
  DEF:idle=/var/lib/munin/mybox/mybox-cpu-idle-d.rrd:42:AVERAGE 
  DEF:iowait=/var/lib/munin/mybox/mybox-cpu-iowait-d.rrd:42:AVERAGE 
  CDEF:percent_used=100,idle,-,iowait,- 
  AREA:percent_used#00880077:'cpu usage' 
  VDEF:fit_m=percent_used,LSLSLOPE 
  VDEF:fit_b=percent_used,LSLINT 
  CDEF:trendline=percent_used,POP,fit_m,COUNT,*,fit_b,+ 
  LINE1:trendline#FFBB00:'Trend since 12w ago'

该图的问题在于,它只显示平均CPU使用趋势。但我的工作量很高:90%的时间使用率都很低,然后会出现短暂的峰值。我真正关心的是CPU使用率峰值的趋势。

所以我可以运行相同的命令,用MAX替换AVERAGE。。。但实际的最大值是如此随机分布(通常接近100%),以至于它们不会产生任何有用的趋势线。

所以我想,我真正想要的图表是第95个百分位数的图表(或者可能只有第75个百分位……理想情况下,我可以调整参数),其中"百分位数"接管了每个连续24小时的数据。

从概念上讲,我想把我们最后9天的数据(每天48个数据点)归结为9个数据点(每天1个数据点——代表当天48个原始点的第N个百分点)。

然后我用LSLSLOPELSLINT为数据拟合一条线,并将其显示在与其他数据相同的图形上。

但我不知道如何使用rrdtool的RPN功能以这种方式精简数据

我知道我可以使用PERCENTNAN来获得标量,它是我整个数据序列的第95个百分位数,但我想要一个由9个数字组成的数据序列,而不仅仅是一个标量。

我知道我可以使用TRENDNAN来获得一个数据系列,它是我的数据系列的滑动窗口的平均值,如果它给我中值(第50百分位)而不是均值,然后允许我将该参数从"50"调整到"95",那就足够了。。。但事实并非如此。


或者,我知道如何使用Python来计算我想要的序列,使用rrdtool firstrrdtool fetch,但没有简单的方法将该序列反馈到rrdtool中以创建图形。


我想也许我可以提取usage_todayusage_yesterdayusage_2dusage_3d,。。。分成九个独立的系列,分别对它们使用PERCENTNAN,然后以某种方式为其拟合一行。但这大多是绝望的手工;如果有人发布了一个答案,实际上使这种方法有效,我会接受它。

RRDTool内置了第95百分位功能。请注意,百分位计算的准确性将取决于请求时间段内可用数据的粒度,不过。。。所以1-dpp RRA越大越好。

因此,例如,要获得第95百分位的水平线,我们可以使用以下指令:

  DEF:idlehr=/var/lib/munin/mybox/mybox-cpu-idle-d.rrd:42:AVERAGE:step=1 
  VDEF:pctidle=idlehr,95,PERCENTNAN
  HRULE:pctidle#ff0000:95th_Percentile

DEF末端的step=1可确保选择可用的最高分辨率数据。如果你要绘制一整年的图形,并且在这个时间窗口可以获得高分辨率的数据,那么这可能是计算密集型的!

然而,问题是,你想要一张图来显示每天不同的值——实际上,这是一个百分比计算的滑动窗口,与TRED和PREDICT的工作方式相同,但步长为一天。RRDTool无法执行此操作。

所以,答案是,你可以显示一天的图表,其中有一天的百分位数。不能创建每天有一个数据点的图形,其中该数据点被计算为当天的百分比。

我能想到的实现这一点的唯一方法是反复迭代调用rrdtool xport,以计算一系列天数的百分位数,然后使用这些数据在另一个绘图包中生成条形图。

相关内容

  • 没有找到相关文章

最新更新