我使用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个百分点)。
然后我用LSLSLOPE
和LSLINT
为数据拟合一条线,并将其显示在与其他数据相同的图形上。
但我不知道如何使用rrdtool的RPN功能以这种方式精简数据
我知道我可以使用PERCENTNAN
来获得标量,它是我整个数据序列的第95个百分位数,但我想要一个由9个数字组成的数据序列,而不仅仅是一个标量。
我知道我可以使用TRENDNAN
来获得一个数据系列,它是我的数据系列的滑动窗口的平均值,如果它给我中值(第50百分位)而不是均值,然后允许我将该参数从"50"调整到"95",那就足够了。。。但事实并非如此。
或者,我知道如何使用Python来计算我想要的序列,使用rrdtool first
和rrdtool fetch
,但没有简单的方法将该序列反馈到rrdtool
中以创建图形。
我想也许我可以提取usage_today
、usage_yesterday
、usage_2d
、usage_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
,以计算一系列天数的百分位数,然后使用这些数据在另一个绘图包中生成条形图。