Eth0 速度慢并产生错误

Eth0 速度慢并产生错误

我的一台 Linux 电脑的网络有点奇怪。连接到本地网络之外的任何电脑时,速度都非常慢(无论哪个服务器,速度都是 ~1.5 Kb/s)。同时,在本地网络内,速度很快(>4 Mb/s)。

Dmesg 没有报告与加载模块相关的任何错误,dns 正在运行,mtu 大小正常。我使用的是有线连接,而不是 wlan。我尝试过不同的电缆和路由器上的不同端口,问题仍然存在。

一些统计数据:

ip -s -s link
eth0 <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
RX: bytes  packets  errors  dropped  overrun  mcast
161453     227      49      0        0        0
RX errors: length   crc     frame    fifo     missed
           0        0       0        49       109

Tx没有错误。

ethtool 说:

ethtool eth0
Settings for eth0:
        Supported ports: [ TP MII ]
        Supported link modes:   10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Link partner advertised link modes:  10baseT/Half 10baseT/Full 
                                             100baseT/Half 100baseT/Full 
        Link partner advertised pause frame use: Symmetric
        Link partner advertised auto-negotiation: Yes
        Speed: 100Mb/s
        Duplex: Full
        Port: MII
        PHYAD: 32
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: pumbg
        Wake-on: d
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes


ethtool -S eth0
NIC statistics:
     tx_ok: 17330
     rx_ok: 24344
     tx_err: 0
     rx_err: 0
     rx_fifo: 1034
     frame_align: 0
     tx_ok_1col: 0
     tx_ok_mcol: 0
     rx_ok_phys: 24295
     rx_ok_bcast: 49
     rx_ok_mcast: 0
     tx_abort: 0
     tx_underrun: 0
     rx_frags: 0

好的,我只是通过另一台本地机器代理流量并设法关闭 xorg、firefox 等,然后我意识到:

  1. 如果我加载一个重量级的网页,一切都按预期进行,速度很好
  2. 如果我只 wget 一个文件,没有其他 tcp 连接运行,则该行为仍然存在

因此,这似乎与活动连接数较少有关(当只有一个连接时,我的 fifo 错误率也会更高)。这可能是驱动程序问题吗?

答案1

1.5Kb/s 是每秒一个数据包的合适大小。我见过 TCP 延迟确认不起作用的情况,数据包发送延迟为 200ms,但 1000ms 则完全是另一回事。这时我会打开数据包嗅探器,看看网络上发生了什么。

由于您看到的是网络内和网络外流量的不同行为,我会在三个方面进行捕获:

  1. 本地到本地流量
  2. 本地到远程流量,在边界设备内部(例如通过 TCPDump 在本地服务器本身)
  3. 本地到远程流量,在您的边界设备之外(好:在边界设备本身上,更好:在为边界设备的互联网连接提供信息的交换机上)。

2 和 3 非常重要,因为它可以帮助您确定您的边界设备是否以某种方式过滤了不该过滤的内容,或者远程端是否在做不该做的事情。您正在寻找异常,由于有很多方法可能导致这种失败,我无法为您提供有关如何识别存在的问题的具体指导。Wireshark 有一些非常好的错误突出显示功能,只需加载捕获即可告诉您发生了什么。

答案2

速度缓慢的原因可能包括:

  • NIC 双工和速度不兼容

  • 电缆不良

  • 电气干扰

ethtool eth0(以 root 身份运行)会显示什么?将其与另一台 PC 进行比较。ethtool -S eth0显示更详细的错误报告。

相关内容