How can I get the current network interface throughput statistics on Linux/UNIX? [closed]
iftop does for network usage what top(1) does for CPU usage
-- http://www.ex-parrot.com/~pdw/iftop/
I don't know how "standard" iftop is, but I was able to install it with yum install iftop
on Fedora.
Got sar? Likely yes if youre using RHEL/CentOS.
No need for priv, dorky binaries, hacky scripts, libpcap, etc. Win.
$ sar -n DEV 1 3Linux 2.6.18-194.el5 (localhost.localdomain) 10/27/201002:40:56 PM IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s02:40:57 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.0002:40:57 PM eth0 10700.00 1705.05 15860765.66 124250.51 0.00 0.00 0.0002:40:57 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.0002:40:57 PM IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s02:40:58 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.0002:40:58 PM eth0 8051.00 1438.00 11849206.00 105356.00 0.00 0.00 0.0002:40:58 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.0002:40:58 PM IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s02:40:59 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.0002:40:59 PM eth0 6093.00 1135.00 8970988.00 82942.00 0.00 0.00 0.0002:40:59 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00Average: IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/sAverage: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00Average: eth0 8273.24 1425.08 12214833.44 104115.72 0.00 0.00 0.00Average: eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00
I wrote this dumb script a long time ago, it depends on nothing but Perl and Linux≥2.6:
#!/usr/bin/perluse strict;use warnings;use POSIX qw(strftime);use Time::HiRes qw(gettimeofday usleep);my $dev = @ARGV ? shift : 'eth0';my $dir = "/sys/class/net/$dev/statistics";my %stats = do { opendir +(my $dh), $dir; local @_ = readdir $dh; closedir $dh; map +($_, []), grep !/^\.\.?$/, @_;};if (-t STDOUT) { while (1) { print "\033[H\033[J", run(); my ($time, $us) = gettimeofday(); my ($sec, $min, $hour) = localtime $time; { local $| = 1; printf '%-31.31s: %02d:%02d:%02d.%06d%8s%8s%8s%8s', $dev, $hour, $min, $sec, $us, qw(1s 5s 15s 60s) } usleep($us ? 1000000 - $us : 1000000); }}else {print run()}sub run { map { chomp (my ($stat) = slurp("$dir/$_")); my $line = sprintf '%-31.31s:%16.16s', $_, $stat; $line .= sprintf '%8.8s', int (($stat - $stats{$_}->[0]) / 1) if @{$stats{$_}} > 0; $line .= sprintf '%8.8s', int (($stat - $stats{$_}->[4]) / 5) if @{$stats{$_}} > 4; $line .= sprintf '%8.8s', int (($stat - $stats{$_}->[14]) / 15) if @{$stats{$_}} > 14; $line .= sprintf '%8.8s', int (($stat - $stats{$_}->[59]) / 60) if @{$stats{$_}} > 59; unshift @{$stats{$_}}, $stat; pop @{$stats{$_}} if @{$stats{$_}} > 60; "$line\n"; } sort keys %stats;}sub slurp { local @ARGV = @_; local @_ = <>; @_;}
It just reads from /sys/class/net/$dev/statistics
every second, and prints out the current numbers and the average rate of change:
$ ./net_stats.pl eth0rx_bytes : 74457040115259 4369093 4797875 4206554 364088rx_packets : 91215713193 23120 23502 23234 17616...tx_bytes : 90798990376725 8117924 7047762 7472650 319330tx_packets : 93139479736 23401 22953 23216 23171...eth0 : 15:22:09.002216 1s 5s 15s 60s ^ current reading ^-------- averages ---------^