User Tools

Site Tools


Monitoring 95-percentile

Burstable Bandwidth/95th Percentile Billing

AboveNet bandwidth monitoring system measures each customer’s connectivity every 5 minutes. AboveNet bills clients for bandwidth usage with a Kbps granularity. Clients are billed on the 95th percentile in time of the higher of in/out traffic at the committed bandwidth price. The 95th percentile model removes 5% of the highest burst traffic from your bill, effectively removing 36 hours of your highest bandwidth usage per month.

The actual usage – 95th percentile

AboveNet uses the industry standard tool, the Multi-Router Traffic Grapher (MRTG) to provide customers with real-time usage statistics and to calculate customers’ invoices on a (calendar) monthly basis. Using MRTG AboveNet publishes inbound and outbound traffic every five minutes. Invoicing is based on the 95th percentile rule: in a 30-day month there are then 8640 samples for each of inbound and outbound. AboveNet discards either the inbound or outbound samples depending on which one is lower. With the remaining sample set AboveNet then removes the highest 432 samples - 5% of 8640 - and then invoices at the next highest sample which is your 95th percentile.

Example RRD-Perl code for 95th percentile

#! /bin/sh
[ "x$MONTH" = 'x' ] && MONTH=`date +%-m`
YEAR=`date +%-Y`
if [[ $MONTH -gt `date +%-m` ]]; then
YEAR=`echo "$YEAR - 1" | bc`;
LASTDAY=`cal $MONTH $YEAR | grep -v "^$" | tail -1 | awk '{print $NF}'`
#MONTHNAME=`cal $MONTH $YEAR | head -n 1 | awk '{print $1}'`
#echo $MONTH
# OK, we need to fetch the start dates from MONTH...
rrdtool fetch interface.rrd AVERAGE \\
 --start "00:00 $MONTH/01/$YEAR" \\
 --end "23:55 $MONTH/$LASTDAY/$YEAR" | \\
 grep -v nan | \\
 perl -e ' \\
  my $last = 0; my $month = '$MONTH';  \\
  my @days = (0,31,28,31,30,31,30,31,31,30,31,30,31);  \\
  while (<>) {  \\
   next unless /^(\d{10}):\s+([\d\.\+e]+)\s+([\d\.\+e]+)\s+ \\
   ([\d\.\+e]+)\s+([\d\.\+e]+)\s+([\d\.\+e]+)\s+([\d\.\+e]+)/; \\
   if ($last != 0 and $1 != $last + 300) {  \\
    print STDERR "Bad jump: $last -> $1\n" }; \\
   push (@sample, (($2>$3?$2:$3) * 8 / 1000 / 1000));$last = $1;}; \\
   @sorted = sort {$b <=> $a} @sample; print "95th so far: ", \\
   @sorted[int(@sorted/20)-1], "\n", "95th of month so far: ", \\



Bandwidth is measured on the connected port on a switch or router and is recorded in a log file. This is done every 5 minutes. At the end of the month, the samples are sorted from highest to lowest, and the top 5% (which equal to approximately 36 hours of a 30-day billing cycle) of data is thrown away. The next highest measurement becomes the billable utilization for the entire month.


Het gemiddelde bandbreedtegebruik wordt gemeten volgens de 95e percentiel methode. Dit wordt ook wel “Burstable Billing” genoemd. De gebruikte bandbreedte up/down op de netwerkverbinding wordt gemeten en opgeslagen in een log-file. Dit wordt gedaan met een interval van 5 minuten. Aan het einde van de maand worden alle meetwaarden gesorteerd van hoog naar laag en de top 5% (wat neer komt op 36 uur van een maand van 30-dagen) van de meetwaarden wordt weggelaten. De eerstvolgende meetwaarde geldt als de gemiddelde gebruik van de maand. Van de gemiddelde up/down bandbreedte wordt de hoogste genomen voor de afrekening.


/var/www/html/ · Last modified: 2019/03/06 07:33 (external edit)