215

I just installed a new gigabit network interface card (NIC) in Linux. How do I tell if it is really set to gigabit speeds? I see ethtool has an option to set the speed, but I can't seem to figure out how to report its current speed.

User1
  • 2,786

10 Answers10

295

Just use a command like: ethtool eth0 to get the needed info. Ex:

$ ethtool eth0 | grep Speed

Speed: 1000Mb/s
Zhe
  • 103
Khaled
  • 37,789
193

It is possible to use the information from the kernel when ethtool is missing:

cat /sys/class/net/<interface>/speed

Example for interface named eth0:

cat /sys/class/net/eth0/speed
Christian
  • 2,041
45

There are some great answers here, I just wanted to add a few more options.

1. I know this is not quite what you asked (read on for other ways). But if you want to know the real world performance of your NIC, rather than what your computer says it should be, you can use iperf. I usually do this - because you never know. I bought a 1Gb NIC recently that that only transferred at 672Mbps but it's uplink was 1Gb. Good thing I checked.

You'll need two computers.

On computer one, run iperf in server mode:

iperf -s

On the other, run iperf in client mode:

iperf -c 192.168.0.10

If you want to see the full duplex speed, try this instead:

iperf -d -c 192.168.0.10

Substitute 192.168.0.10 for the servers IP address

2. On Ubuntu systems, /var/log/kern.log has limited logging of kernel events. It will record link speed and status of a NIC when it changes. I'm sure other distributions probably do something similar or can be setup to do so.

$ 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. You'll probably never, ever need to go this far, but you can write c code that to get the speed. Tested working and root is not required.

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);
}
44

NOTE: the man page for mii-tool has this disclaimer:

This program is obsolete. For replacement check ethtool.

Use mii-tool to watch the negotiated network speed.

Ex.

eth0: no link
eth1: negotiated 100baseTx-FD, link ok
slm
  • 8,010
24

As Khaled mentioned, you should be able to run ethtool with just the interface as an argument. This will list the supported speeds, the advertised speeds, the current speed, and a bunch of other things too:

Settings for eth0:
    Supported ports: [ TP ]
    Supported link modes:   10baseT/Half 10baseT/Full 
                            100baseT/Half 100baseT/Full 
                            1000baseT/Full 
    Supports auto-negotiation: Yes
    Advertised link modes:  10baseT/Half 10baseT/Full 
                            100baseT/Half 100baseT/Full 
                            1000baseT/Full 
    Advertised auto-negotiation: Yes
    Speed: 1000Mb/s
    Duplex: Full
    Port: Twisted Pair
    PHYAD: 0
    Transceiver: internal
    Auto-negotiation: on
    Supports Wake-on: d
    Wake-on: d
    Current message level: 0x00000007 (7)
    Link detected: yes

You can also run dmesg, and grep for your interface, but this might not work if your system has been running for a long time and the current buffer no longer has that information (in that case, you'll have to grep the older /var/log/dmesg.* files):

dmesg |grep eth0
[    2.867481] e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection
[   19.429444] ADDRCONF(NETDEV_UP): eth0: link is not ready
[   19.431555] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
[   19.449341] ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[   26.972379] e1000: eth0: e1000_set_tso: TSO is Enabled
[   29.920458] eth0: no IPv6 routers present
Jed Daniels
  • 7,452
  • 2
  • 37
  • 43
15

Use below command

 dmesg | grep -i duplex
 Output: eth0: link up, 100Mbps, full-duplex, lpa 0x45E1

refer this

Vikas Hardia
  • 303
  • 6
  • 15
4

If you are using network manager:

nmcli -f CAPABILITIES.SPEED dev show <interface>

For example:

$ nmcli -f CAPABILITIES.SPEED dev show enp0s31f6 
CAPABILITIES.SPEED:                     100 Mb/s
4

With systemd-networkd, you can use the networkctl command:

$ networkctl status enp37s0
● 2: enp37s0                                                                   
                     Link File: /usr/lib/systemd/network/99-default.link
                  Network File: /etc/systemd/network/enp37s0.network
                         State: routable (configured)
                  Online state: online                                         
                          Type: ether
...
                         Speed: 1Gbps
...
flaviut
  • 213
3

Also for future reference I've noticed that the speed field in ethtool gives the maximum speed supported by the NIC and mii-tool give the actual speed on which the NIC is running.

[ root @  ]# mii-tool
eth0: negotiated 100baseTx-FD, link ok
[ root @  ]# ethtool eth0
Settings for eth0:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Speed: 1000Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 2
        Transceiver: internal
        Auto-negotiation: on
        MDI-X: off (auto)
        Supports Wake-on: pumbg
        Wake-on: g
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes

UPDATE: After a while a found out the mii-tool wasn't returning the right speed as it was outdated and deprecated and ethtool was returning the negotiated speed.

maco1717
  • 131
-10

ethtool eth0 worked for me. Example:

$ethtool eth0 |grep -i speed
Speed: 1000Mb/s
dragon
  • 7