[rrd-users] Percentile off-by-one
Joshua Keroes
joshua at keroes.com
Fri Aug 14 03:17:57 CEST 2009
How is percentile calculated? We've been calculating this manually, since
before rrdtool offered a PERCENT function. We discovered that our manual
calculation and the one supplied by rrdtool differ by one index. For example
(percentile.pl program attached):
[Thu Aug 13, 19:58:41 | 692] $ percentile.pl -v --cf=AVERAGE --ds=ingress
--dsi=0 --start=1242864000 --end=1245542399 etkfgl624456ubielg01g.rrd
percentile.pl using RRDs-1.2019
etkfgl624456ubielg01g.rrd:
main::ptile_fetch()
start = 05/21/09
end = 06/20/09
rows = 31
95% of 31 = 29.45
95th %-ile row index = 29
discarded rows of -NaN's = 0
row 28 = *1126767.40*
row 29 = *1521699.32*
row 30 = 4132277.36
manual calculation using fetch() = *1521699.32*
PERCENT calculation using graph() = *1126767.40*
difference ~ 394931 (26%)
Our manual calculation is grabbing row 29 and PERCENT is grabbing row 28.
>From rrdgraph.c:
case VDEF_PERCENT:{
rrd_value_t *array;
int field;
if ((array = malloc(steps * sizeof(double))) == NULL) {
rrd_set_error("malloc VDEV_PERCENT");
return -1;
}
for (step = 0; step < steps; step++) {
array[step] = data[step * src->ds_cnt];
}
qsort(array, step, sizeof(double), vdef_percent_compar);
* field = (steps - 1) * dst->vf.param / 100; /* <======= array index */*
dst->vf.val = array[field];
dst->vf.when = 0; /* no time component */
free(array);
}
Should the noted line perhaps read as follows?
field = steps * dst->vf.param / 100;
If not, what am I missing?
Many thanks,
Joshua
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.oetiker.ch/pipermail/rrd-users/attachments/20090813/5fd8edda/attachment.html
-------------- next part --------------
A non-text attachment was scrubbed...
Name: percentile.pl
Type: application/octet-stream
Size: 5077 bytes
Desc: not available
Url : http://lists.oetiker.ch/pipermail/rrd-users/attachments/20090813/5fd8edda/attachment.obj
More information about the rrd-users
mailing list