Ci sono alcune ottime risposte qui, volevo solo aggiungere qualche altra opzione.
1. So che non è esattamente quello che hai chiesto (continua a leggere per altri modi). Ma se vuoi conoscere le prestazioni del tuo NIC nel mondo reale , piuttosto che ciò che il tuo computer dice che dovrebbe essere, puoi usare iperf. Di solito lo faccio, perché non lo sai mai. Di recente ho acquistato una scheda NIC da 1 Gb che si è trasferita solo a 672 Mbps ma il suo uplink era di 1 Gb. Per fortuna ho controllato.
Avrai bisogno di due computer.
Sul computer uno, esegui iperf in modalità server:
iperf -s
Dall'altro, esegui iperf in modalità client:
iperf -c 192.168.0.10
Se vuoi vedere la velocità full duplex, prova invece:
iperf -d -c 192.168.0.10
Sostituire 192.168.0.10 per l'indirizzo IP del server
2. Sui sistemi Ubuntu, /var/log/kern.log
ha una registrazione limitata degli eventi del kernel. Registra la velocità e lo stato del collegamento di una scheda NIC quando cambia. Sono sicuro che altre distribuzioni probabilmente fanno qualcosa di simile o possono essere configurate per farlo.
$ 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. Probabilmente non dovrai mai e poi andare così lontano, ma puoi scrivere codice c per ottenere la velocità. Non è richiesto il funzionamento testato e il root.
https://stackoverflow.com/questions/2872058/get-link-speed-programmatically
#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);
}