我的一台 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 等,然后我意识到:
- 如果我加载一个重量级的网页,一切都按预期进行,速度很好
- 如果我只 wget 一个文件,没有其他 tcp 连接运行,则该行为仍然存在
因此,这似乎与活动连接数较少有关(当只有一个连接时,我的 fifo 错误率也会更高)。这可能是驱动程序问题吗?
答案1
1.5Kb/s 是每秒一个数据包的合适大小。我见过 TCP 延迟确认不起作用的情况,数据包发送延迟为 200ms,但 1000ms 则完全是另一回事。这时我会打开数据包嗅探器,看看网络上发生了什么。
由于您看到的是网络内和网络外流量的不同行为,我会在三个方面进行捕获:
- 本地到本地流量
- 本地到远程流量,在边界设备内部(例如通过 TCPDump 在本地服务器本身)
- 本地到远程流量,在您的边界设备之外(好:在边界设备本身上,更好:在为边界设备的互联网连接提供信息的交换机上)。
2 和 3 非常重要,因为它可以帮助您确定您的边界设备是否以某种方式过滤了不该过滤的内容,或者远程端是否在做不该做的事情。您正在寻找异常,由于有很多方法可能导致这种失败,我无法为您提供有关如何识别存在的问题的具体指导。Wireshark 有一些非常好的错误突出显示功能,只需加载捕获即可告诉您发生了什么。
答案2
速度缓慢的原因可能包括:
NIC 双工和速度不兼容
电缆不良
电气干扰
ethtool eth0
(以 root 身份运行)会显示什么?将其与另一台 PC 进行比较。ethtool -S eth0
显示更详细的错误报告。