Reading Interface Speed
Q : How do I get the interface speed?
A : On Linux:
$ ethtool eth0
Speed: 1000Mb/s
Not what I want at all,
Q How do I get interface throughput
A
iftop
does what top does for network interfaces:
$ iftop
interface: em0
IP address is: 192.168.204.4
MAC address is: ffffffec:ffffffb1:ffffffd7:34:ffffffa3:ffffffa1
pcap_open_live(em0): em0: You don't have permission to capture on that device ((cannot open device) /dev/bpf: Permission denied)
Annoying
$ sudo iftop
...cool ncurses display...
A
Besides iftop and iptraf, also check:
bwm-ng
$ bwm-ng
...cool ncurses display...
Not scriptable
$ bwm-ng --output csv
1479982871;em0;0.00;0.00;0.00;0;0;0.00;0.00;0.00;0;0;0.00;0.00;0;0
1479982871;lo0;0.00;0.00;0.00;0;0;0.00;0.00;0.00;0;0;0.00;0.00;0;0
1479982871;total;0.00;0.00;0.00;0;0;0.00;0.00;0.00;0;0;0.00;0.00;0;0
Q How do those commands gather their data?
A It is different everywhere
Getting a look a network rates is really easy on FreeBSD, the systat tool in ifstat ships with the base system. But if you want to do this programmatically there isn't a lot of information out there, I had to read source code to figure out how to do it.
The initial
iftop
error message indicates they are doing a capture of all the
traffic on all interfaces and working this stuff out on their own. That
requires root and I really don't want the hassle of doing it, surely the OS is
capturing these stats from the network stack?
On Linux, these stats are exposed via
/proc
:
/sys/class/net/eth0/statistics/rx_bytes
/sys/class/net/eth0/statistics/tx_bytes
There may actually be other interfaces for Linux, but I don't think it is worth digging any further.
On FreeBSD you can do what systat does and use a sysctl call to populate a struct. The bwm-ng man page has a heap of methods for finding these numbers on different platforms, for the BSD's and MacOS it suggests the getifaddrs interface.
For portable code not written in C I will probably set up a thread running
bwm-ng
outputting csv data.
Reading: Cibola Burn, Excession