为什么我只能通过两台机器之间的 10Gbe 直接连接实现 2.5Gbps?

为什么我只能通过两台机器之间的 10Gbe 直接连接实现 2.5Gbps?

我有两台机器,它们通过 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 开销),但它们可能无法正常工作,这取决于硬件实现和驱动程序。

相关内容