How do I verify the speed of my NIC?

534,853

Solution 1

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

$ sudo ethtool eth0 | grep Speed

Speed: 1000Mb/s

Solution 2

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

Solution 3

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

Solution 4

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

Solution 5

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
Share:
534,853

Related videos on Youtube

User1
Author by

User1

Updated on September 17, 2022

Comments

  • User1
    User1 almost 2 years

    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.

    • Ryan Babchishin
      Ryan Babchishin over 8 years
      ethtool -h says: ethtool DEVNAME Display standard information about device
  • mivk
    mivk almost 10 years
    For Debian based systems, ethtool is not installed by default. But mii-tool is, as part of the essential "net-tools" package. So this was the best solution for me.
  • mehdix
    mehdix about 8 years
    Useful when you don't have root access.
  • zhaorufei
    zhaorufei about 8 years
    Note: Only available since 2.6.33 version
  • zhaorufei
    zhaorufei about 8 years
    useful when the log is not overwritten. I'm in the unfortunate situation.
  • FooBee
    FooBee almost 8 years
    Please read other answers before answering. This has alread been said six years ago and is the accepted answer with 66 upvotes.
  • dragon
    dragon almost 8 years
    one can still post his answer regardless. Given answers might not work for someone, so just wanted to add another option that suited me in my situation.
  • FooBee
    FooBee almost 8 years
    Your answer is the exact same as the accepted one and does not add value.
  • dragon
    dragon almost 8 years
    where is the ethtool command mentioned in previous options?
  • FooBee
    FooBee almost 8 years
    look at the very top answer with the green tick beside it. This is the accepted answer and it very clearly uses ethtool.
  • dragon
    dragon almost 8 years
    it doesnt show the use of the command, yes it mentions the command but doesnt demonstrate how to use it, thats what I tried to fill in, thats all no offense.
  • Giraffe
    Giraffe almost 7 years
    I see this in the man page for mii-tool "This program is obsolete. Valid media are only 100baseT4, 100baseTx-FD,100baseTx-HD, 10baseT-FD and 10baseT-HD ethernet cards. For replace-ment check ethtool." :|
  • Sankalp
    Sankalp almost 7 years
    this came in handy when I didn't have superuser privs on the box. thanks!
  • wi1
    wi1 almost 7 years
    Getting "Invalid argument"
  • Christian
    Christian almost 7 years
    @wi1: Added an example to clarify the usage. Is it now working?
  • wi1
    wi1 almost 7 years
    @Christian Yes it is thanks, but only on some of my interfaces which I've read is expected so I'm all good
  • Code-Source
    Code-Source over 6 years
    If you want to have the full list of all your interfaces with theyr speed, you can use this command: for i in $(netstat -i | cut -f1 -d" " | tail -n+3) ; do echo "$i: $(ethtool "$i" | grep Speed | sed 's/Speed://g')" ; done
  • Dan Pritts
    Dan Pritts over 6 years
    RHEL6 has backported this into their 2.6.32 kernel.
  • Anton Samsonov
    Anton Samsonov almost 6 years
    While mii-tool reports 'negotiated 100baseTx-FD flow-control, link ok', both ethtool and cat /sys/class/net/eth…/speed agree on '1000Mb/s Full duplex'. This is for a USB 3.0 controller, namely ASIX AX88179 ('ax88179_178a' driver for Linux).
  • Giraffe
    Giraffe almost 6 years
    If you get "Speed: Unknown!" you may be using the wrong ethXX name, worth a double check :)
  • Giraffe
    Giraffe over 5 years
    What was your eventual resolution to the non expected performance?
  • jsterr
    jsterr over 5 years
    What does it mean if cat /sys/class/net/eth1/speed shows 10000 but "ip a" does only show 1000. Can someone clarify?
  • droid-zilla
    droid-zilla over 5 years
    Using iperf as you stated is the answer if one wants to get current speed and not simply the nic potential speed.
  • user643011
    user643011 over 4 years
    Warning: In my case this solution here reports a speed of 100 with cat /sys/class/net/eth0/speed. However mii-tool eth0 reports eth0: negotiated 1000baseT-HD flow-control, link ok.
  • user643011
    user643011 over 4 years
    It seems /sys/class interface was right. Dmesg also lists 100Mbit/s # dmesg|grep duplex [ 5.417536] smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1. I am running on a special purpose OS build without ethtool.
  • Luc
    Luc about 4 years
    Note: speed is in mbps, so 1000 is gigabit (as expected, but I figured it was good to make sure)
  • Rufus
    Rufus over 3 years
    This only gives you the negotiated speed of your current network configuration (hence your ethernet port must be connected). The speed indicated also depends on the cable and the other end of the connection. This does NOT give the max supported speed of the NIC on your PC. For that, you need to look under Supported link modes also shown in ethtool. 1000baseT means gigabit ethernet, etc.
  • Bim
    Bim over 3 years
    I think this should be the accepted answer. It shows the speed the NIC is currently running at / the negotiated speed, NOT the maximum possible speed.
  • Timo
    Timo about 3 years
    apt install ethtool on debian.
  • grin
    grin almost 3 years
    @jsterr you may see queue length in ip a, not line negotiated speed.
  • grin
    grin almost 3 years
    Um that seems to be the maximal speed, not the negotiated (actual) speed, unfortunately for me. :-(
  • Raymo111
    Raymo111 over 2 years
    No sudo required!
  • kevinarpe
    kevinarpe about 2 years
    If you don't know the name of your network adapter, you can run: /sbin/ifconfig. Then: dmesg | grep -F $nicname