Aquí hay algunas respuestas geniales, solo quería agregar algunas opciones más.
1. Sé que esto no es exactamente lo que pediste (sigue leyendo para otras formas). Pero si desea conocer el rendimiento del mundo real de su NIC , en lugar de lo que su computadora dice que debería ser, puede usar iperf. Usualmente hago esto, porque nunca se sabe. Compré una NIC de 1Gb recientemente que solo se transfirió a 672Mbps pero su enlace ascendente fue de 1Gb. Buena cosa que revisé.
Necesitarás dos computadoras.
En la computadora uno, ejecute iperf en modo servidor:
iperf -s
Por otro lado, ejecute iperf en modo cliente:
iperf -c 192.168.0.10
Si desea ver la velocidad dúplex completa, intente esto en su lugar:
iperf -d -c 192.168.0.10
Sustituya 192.168.0.10 por la dirección IP del servidor
2. En los sistemas Ubuntu, /var/log/kern.log
tiene un registro limitado de eventos del kernel. Registrará la velocidad del enlace y el estado de una NIC cuando cambie. Estoy seguro de que otras distribuciones probablemente hagan algo similar o se puedan configurar para hacerlo.
$ tail -n 300 /var/log/kern.log.1 | grep slave0
Aug 28 12:54:04 haze kernel: [ 9452.766248] e1000e: slave0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
Aug 28 12:54:41 haze NetworkManager[921]: <info> [1472403281.8486] device (slave0): link disconnected
Aug 28 12:54:41 haze kernel: [ 9489.898476] e1000e: slave0 NIC Link is Down
3. Probablemente nunca necesitarás llegar tan lejos, pero puedes escribir código c para obtener la velocidad. No se requiere trabajo probado y root.
https://stackoverflow.com/questions/2872058/get-link-speed-programmatic
#include <stdio.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <linux/sockios.h>
#include <linux/if.h>
#include <linux/ethtool.h>
#include <string.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
int sock;
struct ifreq ifr;
struct ethtool_cmd edata;
int rc;
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
if (sock < 0) {
perror("socket");
exit(1);
}
strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));
ifr.ifr_data = &edata;
edata.cmd = ETHTOOL_GSET;
rc = ioctl(sock, SIOCETHTOOL, &ifr);
if (rc < 0) {
perror("ioctl");
exit(1);
}
switch (ethtool_cmd_speed(&edata)) {
case SPEED_10: printf("10Mbps\n"); break;
case SPEED_100: printf("100Mbps\n"); break;
case SPEED_1000: printf("1Gbps\n"); break;
case SPEED_2500: printf("2.5Gbps\n"); break;
case SPEED_10000: printf("10Gbps\n"); break;
default: printf("Speed returned is %d\n", edata.speed);
}
return (0);
}