仅通过RRD获得第95百分位数

时间:2016-05-06 09:32:01

标签: perl rrdtool percentile rrd

是的,我知道,

"DEF:in=$rrd_file:traffic_in:AVERAGE:step=1",
"DEF:out=$rrd_file:traffic_out:AVERAGE:step=1",
'CDEF:bitin=in,8,*',
'CDEF:bitout=out,8,*',
'CDEF:total=bitin,bitout,+',
'VDEF:pct_total=total,95,PERCENT',
'VDEF:pct_in=bitin,95,PERCENT',
'VDEF:pct_out=bitout,95,PERCENT',

进入,退出和第95(进/出)。

但是第95(In + Out)虽然正确,但它不是我需要的总计第95位。

我需要传统的In值和Out值一起" flattened"并且第95次计算出来了。 因此,如果1个链接主要是Inbound with big In spikes,那么更好的第95个百分位将是更接近平均入站流量的数字,因为大多数/所有最高峰值将是入站流量出站不会影响总使用量。 类似地,链接2主要是出站,这个第95百分位数将是更接近出站平均流量的数字。

有没有办法单独使用RRDtools,类似于上面的命令参数?

在Perl中,我做过像这样的事情(脏),但我没有调整时间窗口(-a无法将rrdtool fetch识别为参数)并且持续时间更长一段时间(比如说一个月)我得到的样本很少,所以对我来说隐藏了一些和解;

my ($start, $end, $rrd_file) = @_;

my @series = `rrdtool fetch -s $start -e $end $rrd_file MAX`;

my @all;
foreach my $line (@series) {
    if ($line !~ m/nan/ig && $line =~ m/(\d+): (\S+) (\S+)/) {
        my ($time, $in, $out) = ($1, $2, $3);

        push(@all, $in * 8, $out * 8);
    }
}

@all = sort {$b <=> $a} @all;

my $index_all = int(scalar(@all) * 0.05) + 1;

return sprintf("%.2f", $all[$index_all] / 1000 / 1000);

其中

my $end = DateTime->now(time_zone => 'local')->truncate(to => 'minute');
my $start = $end->clone->subtract(hours => 168)->epoch();
$end = $end->epoch();

1 个答案:

答案 0 :(得分:1)

我不太清楚你的意思是什么&#39;被压扁的&#39;但也许你可以保留更大的那个?

"DEF:in=$rrd_file:traffic_in:AVERAGE:step=1",
"DEF:out=$rrd_file:traffic_out:AVERAGE:step=1",
'CDEF:bitin=in,8,*',
'CDEF:bitout=out,8,*'
'CDEF:bitmax=bitin,bitout,MAX',
'VDEF:pct_max=total,95,PERCENT',
'VDEF:pct_in=bitin,95,PERCENT',
'VDEF:pct_out=bitout,95,PERCENT'