rrdtool:在滑动窗口内计算第95百分位的数据

时间:2015-02-19 00:48:14

标签: rrdtool

我使用rrdtool来绘制Munin生成和存储的CPU使用率数据。 Munin(至少对我们来说)将每个数据系列存储在带有12个RRA的.rrd文件中:" MIN"," MAX"和" AVERAGE"在4个时段中的每个时段"最后2d以5m间隔","最后9d以30m间隔","最后270d以12h间隔"和"在144d的间隔中持续177y,#34;。

我已经知道如何使用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使用率中 spikes 的趋势。

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

所以我认为我实际上想要的图表将是第95百分位数的图表(或者可能只是第75百分位数...理想情况下我能够调整参数),其中"百分位数"在每个连续的24小时内接收数据。

从概念上讲,我想将我们最近9天的数据(每天48个数据点)归结为9个数据点(每天1个数据点 - 代表当天48个原始点的第N个百分点)。 / p>

然后我使用LSLSLOPELSLINT为这些数据添加一行,并将其显示在与其他内容相同的图表上。

但我无法通过rrdtool的RPN工具找出如何以这种方式归档数据。

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

我知道我可以使用TRENDNAN来获取数据系列,这是我的数据系列的滑动窗口的平均值,如果它只给了我中位数< / em>(第50百分位数)代替意思,然后允许我从&#34; 50&#34;中调整该参数直到&#34; 95&#34; ...但它没有。


或者,我知道如何使用Python来计算我想要的系列,使用rrdtool firstrrdtool fetch,但是没有简单的方法将该系列反馈回{{1创建图表。


我想我也许可以将rrdtoolusage_todayusage_yesterdayusage_2d,...提取到九个单独的系列中,使用{{1}在他们所有的单独,然后以某种方式适合一行。但这绝对是绝望的手淫;如果有人发布了实际使该方法正常工作的答案,我就接受了。

1 个答案:

答案 0 :(得分:1)

RRDTool具有内置的第95百分位功能。请注意,百分比计算的准确性将取决于所请求时间段内可用数据的粒度,但是......因此1-pdp 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来计算一系列天数的百分位数值,然后使用该数据在另一个图形包中生成条形图。 / p>