我有两台机器,它们通过 7 英尺长的 Cat6a 以太网电缆(包含在 NIC 卡包装盒中)直接连接在一起。我购买的两台机器上的 PCIe x4 NIC 如下:https://www.amazon.com/gp/product/B07CW2C2J1
我正在尝试调试为什么这两台机器之间的传输速度几乎正好是 2500Mbps。有什么技巧或明显的错误可以让我接近 10Gbps?
以下是我测试过的内容:
配置(机器 A)
机器 A ifconfig
:
enp7s0 Link encap:Ethernet HWaddr 24:5e:be:2c:c1:53
inet addr:2.0.0.20 Bcast:2.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::265e:beff:fe2c:c153/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:17225416 errors:0 dropped:0 overruns:0 frame:0
TX packets:7021731 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:25712055299 (25.7 GB) TX bytes:9701557546 (9.7 GB)
机器 A ip link
:
3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 24:5e:be:2c:c1:53 brd ff:ff:ff:ff:ff:ff
机器 A ethtool enp7so
:
Settings for enp7s0:
Supported ports: [ TP ]
Supported link modes: 100baseT/Full
1000baseT/Full
10000baseT/Full
Supported pause frame use: Symmetric
Supports auto-negotiation: Yes
Advertised link modes: 100baseT/Full
1000baseT/Full
10000baseT/Full
Advertised pause frame use: Symmetric
Advertised auto-negotiation: Yes
Speed: 10000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: external
Auto-negotiation: on
MDI-X: Unknown
Supports Wake-on: g
Wake-on: g
Link detected: yes
配置(机器 B)
机器B ifconfig
:
enp101s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 2.0.0.10 netmask 255.255.255.0 broadcast 2.0.0.255
inet6 fe80::265e:beff:fe2c:c0dc prefixlen 64 scopeid 0x20<link>
ether 24:5e:be:2c:c0:dc txqueuelen 1000 (Ethernet)
RX packets 2332894765 bytes 3532248694886 (3.5 TB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 107128853 bytes 32005739542 (32.0 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
机器B ip link
:
3: enp101s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 24:5e:be:2c:c0:dc brd ff:ff:ff:ff:ff:ff
机器B ethtool enp101s0
:
Settings for enp101s0:
Supported ports: [ TP ]
Supported link modes: 100baseT/Full
1000baseT/Full
10000baseT/Full
2500baseT/Full
5000baseT/Full
Supported pause frame use: Symmetric
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 100baseT/Full
1000baseT/Full
10000baseT/Full
2500baseT/Full
5000baseT/Full
Advertised pause frame use: Symmetric
Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Speed: 10000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
MDI-X: Unknown
Link detected: yes
到目前为止的调试步骤
/dev/zero
我在一台机器上对/dev/null
另一台机器执行了 netcat (B -> A):
3.15GiB 0:00:09 [ 353MiB/s]
我还使用两种窗口大小(默认的 64k 和低于 256k)运行了 ifperf,看到了相同的结果:
iperf -s -w 256k
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 416 KByte (WARNING: requested 250 KByte)
------------------------------------------------------------
[ 4] local 2.0.0.10 port 5001 connected with 2.0.0.20 port 55364
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.0 sec 2.85 GBytes 2.45 Gbits/sec
只是为了测试以确保并删除传输中的网络变量:
cat /dev/zero | pv > /dev/null
21.0GiB 0:00:04 [5.18GiB/s]
答案1
我记得我曾经遇到过同样的问题。这全都与 LRO 和 GRO 有关。您可能需要在两端禁用 large-receive-offload 和 generic-receive-offload,看看它是否会产生变化。
运行以下命令暂时禁用这些:
大型接收卸载
ethtool -K enp101s0 lro off
ethtool -K enp7s0 lro off
通用接收卸载
ethtool -K enp101s0 gro off
ethtool -K enp7s0 gro off
通过运行以下命令,您将实际检查更改:
ethtool -k enp7s0
请注意 -k -K,大写字母会进行更改,小写字母仅输出值
我总是在 10 个 NIC 上禁用 GRO 和 LRO。
你可以在这里阅读更多:https://lwn.net/Articles/358910/
但是尝试禁用它并查看它是否会改变速度,如果会,那么我将为您提供在 /etc/network/interfaces 中进行永久更改的步骤。
答案2
还可能存在其他导致传输缓慢的因素。我偶然发现了一个案例研究,其中指出 ssh 是导致传输缓慢的原因。请参阅https://www.intel.com/content/dam/support/us/en/documents/network/sb/fedexcasestudyfinal.pdf
答案3
运行 iperf,256k 窗口根本不足以饱和 10G 链路。
计算如下:256 kB * 8 位/字节 / 2.56 Gbit/s = .8 ms
因此,如果 RTT 为 0.8 毫秒(对于直接连接的 10GBASE-T 来说相当合理),那么吞吐量就不可能超过 2.56 Gbit/s,无论带宽.尝试将窗口扩大四倍。
另外,请确保你放置这些网卡的 PCIe 插槽具有足够的带宽。机械尺寸有时会产生误导,你需要检查电气尺寸。NIC 支持 PCIe 3.0 x4,因此您至少需要 PCIe 2.0 x4 或 PCIe 3.0 x2 才能获得不折不扣的速度。
卸载功能实际上应该可以加快连接速度(通过降低 CPU 开销),但它们可能无法正常工作,这取决于硬件实现和驱动程序。