如何验证网卡的速度?

Use*_*er1 153 linux gigabit-ethernet ethtool

我刚刚在 Linux 中安装了一个新的千兆网络接口卡 (NIC)。我如何判断它是否真的设置为千兆速度?我看到ethtool有一个设置速度的选项,但我似乎无法弄清楚如何报告其当前速度。

Kha*_*led 209

只需使用如下命令:ethtool eth0获取所需信息。前任:

$ sudo ethtool eth0 | grep Speed

Speed: 1000Mb/s
Run Code Online (Sandbox Code Playgroud)

  • 如果你想以他们的速度获得所有接口的完整列表,你可以使用这个命令:`for i in $(netstat -i | cut -f1 -d" " | tail -n+3) ; 做 echo "$i: $(ethtool "$i" | grep Speed | sed 's/Speed://g')" ; 完成` (6认同)
  • 这只会为您提供当前网络配置的[协商速度](https://superuser.com/questions/1410862/types-of-ethernet-link-modes-from-ethtool)(因此您的以太网端口必须已连接) 。指示的速度还取决于电缆和连接的另一端。这并没有给出您 PC 上 NIC 支持的最大速度。为此,您需要查看“ethtool”中也显示的“支持的链接模式”。`1000baseT` 表示[千兆位以太网](https://en.wikipedia.org/wiki/Gigabit_Ethernet#1000BASE-T),等等。 (2认同)

Chr*_*ian 123

当缺少 ethtool 时,可以使用内核中的信息:

cat /sys/class/net/<interface>/speed
Run Code Online (Sandbox Code Playgroud)

名为 eth0 的接口示例:

cat /sys/class/net/eth0/speed
Run Code Online (Sandbox Code Playgroud)

  • 获取“无效参数” (13认同)
  • 注意:仅从 2.6.33 版本开始可用 (6认同)
  • 如果 cat /sys/class/net/eth1/speed 显示 10000 但“ip a”只显示 1000,这是什么意思。有人可以澄清一下吗? (2认同)

小智 43

注意:手册页mii-tool有这个免责声明:

This program is obsolete. For replacement check ethtool.
Run Code Online (Sandbox Code Playgroud)

使用mii-tool观看协商网络速度。

前任。

eth0: no link
eth1: negotiated 100baseTx-FD, link ok
Run Code Online (Sandbox Code Playgroud)

  • 对于基于 Debian 的系统,默认情况下不安装 `ethtool`。但是`mii-tool` 是必不可少的“net-tools”包的一部分。所以这对我来说是最好的解决方案。 (15认同)
  • 我在 mii-tool 的手册页中看到这一点“该程序已过时。有效媒体仅为 100baseT4、100baseTx-FD、100baseTx-HD、10baseT-FD 和 10baseT-HD 以太网卡。更换检查 ethtool。” :| (2认同)

Rya*_*hin 33

这里有一些很好的答案,我只是想添加更多选项。

1.我知道这不是你问的(阅读其他方式)。但是如果你想知道你的 NIC 的真实世界性能,而不是你的计算机所说的应该是什么,你可以使用 iperf。我通常这样做 - 因为你永远不知道。我最近买了一个 1Gb 网卡,它只能以 672Mbps 的速度传输,但它的上行链路却是 1Gb。还好我查过了。

你需要两台电脑。

在计算机一上,在服务器模式下运行 iperf:

iperf -s
Run Code Online (Sandbox Code Playgroud)

另一方面,在客户端模式下运行 iperf:

iperf -c 192.168.0.10
Run Code Online (Sandbox Code Playgroud)

如果您想查看全双工速度,请尝试以下操作:

iperf -d -c 192.168.0.10
Run Code Online (Sandbox Code Playgroud)

将服务器 IP 地址替换为 192.168.0.10

2.在 Ubuntu 系统上,/var/log/kern.log内核事件的日志记录有限。当网卡改变时,它会记录网卡的链接速度和状态。我确信其他发行版可能会做类似的事情,或者可以设置为这样做。

$ 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
Run Code Online (Sandbox Code Playgroud)

3.你可能永远、永远都不需要走这么远,但你可以编写 c 代码来获得速度。测试工作和 root 不是必需的。

/sf/ask/201044091/

#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);
}
Run Code Online (Sandbox Code Playgroud)

  • 对于非预期的表现,您最终的解决方案是什么? (2认同)
  • 如果您想获得当前速度而不仅仅是网卡潜在速度,那么使用您所说的 iperf 就是答案。 (2认同)

Jed*_*els 19

正如 Khaled 所提到的,您应该能够仅使用接口作为参数来运行 ethtool。这将列出支持的速度、广告速度、当前速度以及其他一些内容:

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
Run Code Online (Sandbox Code Playgroud)

您也可以dmesg为您的界面运行, 和 grep ,但如果您的系统已经运行了很长时间并且当前缓冲区不再具有该信息(在这种情况下,您将不得不 grep 旧的 /var /log/dmesg.* 文件):

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
Run Code Online (Sandbox Code Playgroud)


小智 12

使用下面的命令

 dmesg | grep -i duplex
 Output: eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
Run Code Online (Sandbox Code Playgroud)

参考这个