simple/traffic_monitor/traffic_monitor

54 lines
2.0 KiB
Perl
Executable File

#!/usr/bin/perl
# very simple traffic monitor using /proc/net/dev
use warnings;
use strict;
use Time::HiRes qw(time);
# Inter-| Receive | Transmit
# face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
# eth0:2986064583 116306335 0 0 0 0 0 102845 238806441 38719482 0 0 0 0 0 0
my %last;
my %hist;
for (;;) {
my $t = time;
open(my $fh, '<', '/proc/net/dev') or die "cannot open /proc/net/dev: $!";
my $dt = $t - $last{t};
while (<$fh>) {
if (my ($dev,
$inb, $inp, $ine, $ind, $infi, $infr, $incmp, $inmulti,
$outb, $outp, $oute, $outd, $outfi, $outcol, $outcar, $outcmp
)
= m/\s*(\w+):(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/) {
my $dinb = $inb - $last{$dev}{inb};
my $doutb = $outb - $last{$dev}{outb};
printf "%8s: ", $dev;
for my $period (60, 600, 3600) {
push @{ $hist{$dev}{$period} }, [$last{t}, $t, $dinb, $doutb];
if ($hist{$dev}{$period}[0][0] < $t - $period) {
shift @{ $hist{$dev}{$period} };
}
my $sinb;
my $soutb;
for (@{ $hist{$dev}{$period} }) {
$sinb += $_->[2];
$soutb += $_->[3];
}
if (@{ $hist{$dev}{$period} }) {
printf "%8.0f ", $sinb / ($hist{$dev}{$period}[-1][1] - $hist{$dev}{$period}[0][0]);
printf "%8.0f ", $soutb / ($hist{$dev}{$period}[-1][1] - $hist{$dev}{$period}[0][0]);
print " | ";
}
}
print "\n";
$last{$dev}{inb} = $inb;
$last{$dev}{outb} = $outb;
}
}
$last{t} = $t;
sleep(5);
}