How can I get the current network interface throughput statistics on Linux/UNIX? [closed]
Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
This question does not appear to be about a specific programming problem, a software algorithm, or software tools primarily used by programmers. If you believe the question would be on-topic on another Stack Exchange site, you can leave a comment to explain where the question may be able to be answered.
Tools such as MRTG provide network throughput / bandwidth graphs for the current network utilisation on specific interfaces, such as eth0. How can I return that information at the command line on Linux/UNIX? Preferably this would be without installing anything other than what is available on the system as standard.
Too bad this question has been closed, because I wanted to add bmon which is helpful. github.com/tgraf/bmon#screenshots
15 Answers 15
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.
sigh Well, I guess this means I’m putting off learning to parse tcpdump output again. Thank you iftop and wireshark , for allowing me to be this lazy.
Note that the question asked for per-interface statistics, but iftop is more detailed, and gives per connection statistics.
For those without admin rights, note that iftop requires installation (you won’t even be able to build it without libpcap installed) and its homepage says it must be run under root .
Got sar? Likely yes if youre using RHEL/CentOS.
No need for priv, dorky binaries, hacky scripts, libpcap, etc. Win.
$ sar -n DEV 1 3 Linux 2.6.18-194.el5 (localhost.localdomain) 10/27/2010 02:40:56 PM IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s 02:40:57 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 02:40:57 PM eth0 10700.00 1705.05 15860765.66 124250.51 0.00 0.00 0.00 02:40:57 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 02:40:57 PM IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s 02:40:58 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 02:40:58 PM eth0 8051.00 1438.00 11849206.00 105356.00 0.00 0.00 0.00 02:40:58 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 02:40:58 PM IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s 02:40:59 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 02:40:59 PM eth0 6093.00 1135.00 8970988.00 82942.00 0.00 0.00 0.00 02:40:59 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: eth0 8273.24 1425.08 12214833.44 104115.72 0.00 0.00 0.00 Average: eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00
For kB/s Transmit and Receive: sar -n DEV 1 3 | grep $IFACE | tail -n1 | awk ‘
Sar is a lovely old tool. It it another binary or four and assorted cronjobs for collecting, though 🙂
I wrote this dumb script a long time ago, it depends on nothing but Perl and Linux≥2.6:
#!/usr/bin/perl use 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 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 eth0 rx_bytes : 74457040115259 4369093 4797875 4206554 364088 rx_packets : 91215713193 23120 23502 23234 17616 . tx_bytes : 90798990376725 8117924 7047762 7472650 319330 tx_packets : 93139479736 23401 22953 23216 23171 . eth0 : 15:22:09.002216 1s 5s 15s 60s ^ current reading ^-------- averages ---------^
If I understand right, to make the final result accurate (for example in live stats), it has to run every second on /proc/net/dev or calculate data on per/second basic somehow else?
nload is a great tool for monitoring bandwidth in real time and easily installed in Ubuntu or Debian with sudo apt-get install nload.
Device eth0 [10.10.10.5] (1/2): ===================================================================================== Incoming: . . | # ####| .. |#| . #####. .. Curr: 2.07 MBit/s ###.### #### #######|. . ## | Avg: 1.41 MBit/s ########|#########################. ### Min: 1.12 kBit/s . ################################### .### Max: 4.49 MBit/s .##########. |###################################|##### Ttl: 1.94 GByte Outgoing: ########## ########### ########################### ########## ########### ########################### ##########. ########### .########################### ########### ########### ############################# ########### ###########..############################# ############ ########################################## ############ ########################################## ############ ########################################## Curr: 63.88 MBit/s ############ ########################################## Avg: 32.04 MBit/s ############ ########################################## Min: 0.00 Bit/s ############ ########################################## Max: 93.23 MBit/s ############## ########################################## Ttl: 2.49 GByte
Another excellent tool is iftop, also easily apt-get’able:
191Mb 381Mb 572Mb 763Mb 954Mb └────────────┴──────────┴─────────────────────┴───────────┴────────────────────── box4.local => box-2.local 91.0Mb 27.0Mb 15.1Mb box.local 560b 26.8kb 27.7kb userify.com 0b 11.4kb 8.01kb b.resolvers.Level3.net 0b 58b 168b stackoverflow.com 0b 42b 21b 224.0.0.251 0b 0b 179b box-2.local 0b 0b 0b box.local 0b 0b 0b
Don't forget about the classic and powerful sar and netstat utilities on older *nix!
- dstat - Combines vmstat, iostat, ifstat, netstat information and more
- iftop - Amazing network bandwidth utility to analyse what is really happening on your eth
- netio - Measures the net throughput of a network via TCP/IP
- inq - CLI troubleshooting utility that displays info on storage, typically Symmetrix. By default, INQ returns the device name, Symmetrix ID, Symmetrix LUN, and capacity.
- send_arp - Sends out an arp broadcast on the specified network device (defaults to eth0), reporting an old and new IP address mapping to a MAC address.
- EtherApe - is a graphical network monitor for Unix modeled after etherman. Featuring link layer, IP and TCP modes, it displays network activity graphically.
- iptraf - An IP traffic monitor that shows information on the IP traffic passing over your network.
Thanks for the simple list and that these are mostly default utilities. In particular I was able to get very nice peak bandwidth out of iftop without installing anything.
You can parse the output of ifconfig
A bad bash one-liner that does exactly this (and makes me long for BSD netstat(1) behaviour): while true; do export `ifconfig p1p1 | grep packets | awk '
Parsing ifconfig output is error-prone, for instance the above one-liner results in -bash: export: overruns:0': not a valid identifier` for me on RHEL6. Parsing /sys/class/net/$dev/statistics (see the perl script in @ephemient answer) directly works much better.
should not be the accepted answer as it's error prone and not practical. there are utilities that do the job much better, Scroll down to find out.
I got another quick'n'dirty bash script for that:
#!/bin/bash IF=$1 if [ -z "$IF" ]; then IF=`ls -1 /sys/class/net/ | head -1` fi RXPREV=-1 TXPREV=-1 echo "Listening $IF. " while [ 1 == 1 ] ; do RX=`cat /sys/class/net/$/statistics/rx_bytes` TX=`cat /sys/class/net/$/statistics/tx_bytes` if [ $RXPREV -ne -1 ] ; then let BWRX=$RX-$RXPREV let BWTX=$TX-$TXPREV echo "Received: $BWRX B/s Sent: $BWTX B/s" fi RXPREV=$RX TXPREV=$TX sleep 1 done
It's considering that sleep 1 will actually last exactly one second, which is not true, but good enough for a rough bandwidth assessment.
Thanks to @ephemient for the /sys/class/net/ ! 🙂
If you want to format your numbers as MB/s, swap out the "echo" line with this: echo $BWRX $BWTX | awk '< rx = $1 / 1024 / 1024 ; tx = $2 / 1024 / 1024 ; print "Received " rx "MB/s, Sent " tx "MB/s" >'
@BuddyCasino I'm sure you could do it directly in the let BWRX=($RX-$RXPREV)/1024 (though I don't have anything to test it now)
It seems you are right, it didn't work for some reason when I tried to do it that way, so I settled for awk, but I guess it was just a typo.
Besides iftop and iptraf, also check:
I use it for years already and in most use cases I find its interface much clearer than for example iftop's.
If you want just to get the value, you can use simple shell oneliner like this:
S=10; F=/sys/class/net/eth0/statistics/rx_bytes; X=`cat $F`; sleep $S; Y=`cat $F`; BPS="$(((Y-X)/S))"; echo $BPS
It will show you the average "received bytes per second" for period of 10 seconds (you can change period by changing S=10 parameter, and you can measure transmitted BPS instead of received BPS by using tx_bytes instead of rx_bytes ). Don't forget to change eth0 to network device you want to monitor.
Of course, you are not limited to displaying the average rate (as mentioned in other answers, there are other tools that will show you much nicer output), but this solution is easily scriptable to do other things.
For example, the following shell script (split into multiple lines for readability) will execute offlineimap process only when 5-minute average transmit speed drops below 10kBPS (presumably, when some other bandwidth-consuming process finishes):
#!/bin/sh S=300; F=/sys/class/net/eth0/statistics/tx_bytes BPS=999999 while [ $BPS -gt 10000 ] do X=`cat $F`; sleep $S; Y=`cat $F`; BPS="$(((Y-X)/S))"; echo BPS is currently $BPS done offlineimap
Note that /sys/class/. is Linux specific (which is ok as submitter did choose linux tag), and needs non-archaic kernel. Shell code itself is /bin/sh compatible (so not only bash, but dash and other /bin/sh implementations will work) and /bin/sh is something that is really always installed.