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.
-
1ethtool -h says: ethtool DEVNAME Display standard information about device– Ryan BabchishinCommented Oct 17, 2015 at 23:12
10 Answers
Just use a command like: ethtool eth0
to get the needed info. Ex:
$ sudo ethtool eth0 | grep Speed
Speed: 1000Mb/s
-
7If 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
Commented Nov 11, 2017 at 20:13 -
1If you get "Speed: Unknown!" you may be using the wrong ethXX name, worth a double check :) Commented Sep 24, 2018 at 16:00
-
2This 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 inethtool
.1000baseT
means gigabit ethernet, etc.– RufusCommented Nov 5, 2020 at 2:19 -
1
-
1
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
-
8
-
19
-
1@Christian Yes it is thanks, but only on some of my interfaces which I've read is expected so I'm all good– wi1Commented Sep 25, 2017 at 15:10
-
2What does it mean if cat /sys/class/net/eth1/speed shows 10000 but "ip a" does only show 1000. Can someone clarify?– jsterrCommented Feb 6, 2019 at 16:14
-
1It 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 withoutethtool
. Commented Dec 31, 2019 at 15:48
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
-
16For Debian based systems,
ethtool
is not installed by default. Butmii-tool
is, as part of the essential "net-tools" package. So this was the best solution for me.– mivkCommented Jul 6, 2014 at 13:20 -
2I 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." :| Commented Jun 28, 2017 at 16:13
-
1While
mii-tool
reports 'negotiated 100baseTx-FD flow-control, link ok', bothethtool
andcat /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). Commented Sep 24, 2018 at 10:11
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);
}
-
2What was your eventual resolution to the non expected performance? Commented Jan 22, 2019 at 0:39
-
2Using iperf as you stated is the answer if one wants to get current speed and not simply the nic potential speed. Commented Feb 23, 2019 at 2:50
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
Use below command
dmesg | grep -i duplex
Output: eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
refer this
-
1
-
useful when the log is not overwritten. I'm in the unfortunate situation. Commented May 5, 2016 at 6:01
-
this came in handy when I didn't have superuser privs on the box. thanks!– SankalpCommented Aug 24, 2017 at 8:07
-
If you don't know the name of your network adapter, you can run:
/sbin/ifconfig
. Then:dmesg | grep -F $nicname
Commented Apr 12, 2022 at 13:14 -
you can use this: sudo dmesg | grep -i enp4s0 << replace enp4s0 with your network adapter Commented Jun 14 at 4:16
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.
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
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
...
ethtool eth0
worked for me. Example:
$ethtool eth0 |grep -i speed
Speed: 1000Mb/s
-
4Please read other answers before answering. This has alread been said six years ago and is the accepted answer with 66 upvotes.– SvenCommented Jul 11, 2016 at 12:15
-
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.– dragonCommented Jul 19, 2016 at 16:00
-
3Your answer is the exact same as the accepted one and does not add value.– SvenCommented Jul 19, 2016 at 16:28
-
where is the ethtool command mentioned in previous options?– dragonCommented Aug 12, 2016 at 10:46
-
2look at the very top answer with the green tick beside it. This is the accepted answer and it very clearly uses
ethtool
.– SvenCommented Aug 12, 2016 at 11:17