我正在尝试将我的本地网络设置升级到 40G,但似乎遇到了麻烦。我有 Mellanox ConnectX-3 VPI CX353A 网卡,我已将其卸载易趣,更新了固件并安装了驱动程序。在更换收发器/电缆并购买工具重新编码电缆后,我仍然找不到问题所在。我认为问题出在驱动程序上,他们看到收发器已连接,但似乎不愿意使用它。
我的硬件:
MLNX OFED 驱动程序版本:4.9-3.1.5
网络电缆/收发器:
https://www.fs.com/products/30775.html
https://www.fs.com/products/69907.html
定制以与我的 MikroTik CRS354-48G-4S+2Q+RM 交换机配合使用。我可以更改电缆应使用的供应商,我有 FS 电缆的重新编码工具。
我发现的各种 InfiniBand 命令的输出:https://pastebin.com/8ZWb7wjb
ethtool -m 的输出
root@testserver:/home/test# ethtool -m enp1s0
Identifier : 0x0d (QSFP+)
Extended identifier : 0x00
Extended identifier description : 1.5W max. Power consumption
Extended identifier description : No CDR in TX, No CDR in RX
Extended identifier description : High Power Class (> 3.5 W) not enabled
Connector : 0x23 (No separable connector)
Transceiver codes : 0x08 0x00 0x30 0x00 0x40 0x00 0x80 0xd5
Transceiver type : 40G Ethernet: 40G Base-CR4
Transceiver type : SAS 6.0G
Transceiver type : SAS 3.0G
Transceiver type : FC: short distance (S)
Transceiver type : FC: Twin Axial Pair (TW)
Transceiver type : FC: 1200 MBytes/sec
Transceiver type : FC: 800 MBytes/sec
Transceiver type : FC: 400 MBytes/sec
Transceiver type : FC: 200 MBytes/sec
Transceiver type : FC: 100 MBytes/sec
Encoding : 0x00 (unspecified)
BR, Nominal : 10300Mbps
Rate identifier : 0x00
Length (SMF,km) : 0km
Length (OM3 50um) : 0m
Length (OM2 50um) : 0m
Length (OM1 62.5um) : 0m
Length (Copper or Active cable) : 1m
Transmitter technology : 0xa0 (Copper cable unequalized)
Attenuation at 2.5GHz : 8db
Attenuation at 5.0GHz : 11db
Attenuation at 7.0GHz : 0db
Attenuation at 12.9GHz : 0db
Vendor name : FS
Vendor OUI : 00:40:20
Vendor PN : QSFP-PC01
Vendor rev : A
Vendor SN : MT1422VS08180
Date code : 190228
Revision Compliance : Revision not specified
Module temperature : 0.00 degrees C / 32.00 degrees F
Module voltage : 0.0000 V
ethtool 的输出:
root@testserver:/home/test# ethtool enp1s0
Settings for enp1s0:
Supported ports: [ FIBRE ]
Supported link modes: 1000baseKX/Full
10000baseKX4/Full
10000baseKR/Full
40000baseCR4/Full
40000baseSR4/Full
56000baseCR4/Full
56000baseSR4/Full
Supported pause frame use: Symmetric Receive-only
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 1000baseKX/Full
10000baseKX4/Full
10000baseKR/Full
40000baseCR4/Full
40000baseSR4/Full
Advertised pause frame use: Symmetric
Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Speed: Unknown!
Duplex: Unknown! (255)
Port: FIBRE
PHYAD: 0
Transceiver: internal
Auto-negotiation: off
Supports Wake-on: d
Wake-on: d
Current message level: 0x00000014 (20)
link ifdown
Link detected: no
答案1
总结我的交换机上的自动协商功能已关闭,并具有制造商针对 40G 连接的建议设置。打开自动协商功能解决了这个问题。
我想用我在这方面的冒险经历来回答我的问题,以了解我如何设置 40 千兆位网络。这样,将来尝试此操作的其他人就可以有一些参考点。
我认为需要注意的是,我在以太网模式下使用了 40G NIC,而不是 Infiniband。以太网驱动程序似乎确实有效,但我最终选择了 OFED 驱动程序,因为它有效,我不想再弄乱它了。如果您打算获得这样的设置,确保您的卡支持以太网模式!
我尝试过
拿到交换机、网卡和电缆后,我安装了 Mellanox/Nvidia 提供的 OFED(OpenFabrics Enterprise Distribution)驱动程序/软件。一旦它们无法建立链接,我就使用软件内置的工具来更新固件。这相当简单,我遇到的唯一问题是找到特定卡的最新固件 .bin 文件。我使用的固件是 2.33.5000,仍然很旧,但比卡上的要新。
失败后,我以为是电缆/收发器(一个单元)出了问题。我把原来买的电缆换成了一对(56G 10米有源光缆+56G 2米DAC>40G 11米有源光缆+40G 1米DAC) 定制电缆,这些电缆是为我购买的特定 Mikrotik 交换机设计的。由于这些电缆是定制的,所以需要一个月的时间才能到货。这些电缆到货后,却无法使用,我感到很困惑,于是开始在各种论坛上寻求帮助。不久之后,有人建议我购买工具来自 FS.com,这将允许我重新编码收发器上的供应商,以期诱使 NIC 工作。
由于电缆是为交换机定制的,我猜是网卡不配合。将收发器设置为 IBM 或 Mellanox 不起作用。在寻求进一步帮助后,有几个人建议我查找有关网卡的文档并找到兼容的电缆/收发器。我确实找到了一份 PDF(虽然不是 IBM/Mellanox 提供或制作的),其中列出了 FS.com 提供的一些兼容部件号。所以我购买了IBM 49Y7890 1米DAC来自FS.com。
收到后,我发现这也不是解决办法。出于绝望,我找到了几个人的帖子,他们已经将他们的卡刷入了真正的 Mellanox 固件。我决定尝试一下。在对更新程序进行一些故障排除后,我成功地刷入了固件版本 2.42.5000,新的 PSID 为 MT_1100120019(有关这会如何搞砸事情的详细信息,请参阅“这不是结束”第 4 段)。请参阅此处了解如何越过闪光灯)。在这次尝试失败后,就这个问题进行了进一步的讨论,最终得出结论,我应该测试直接连接到彼此的 NIC。将 NIC 连接在一起并设置它们的子网后,我使用几个 iperf 测试看到了 36.5GBit/s 的速度(因为 iperf 和 iperf3 是单线程的,因此您需要设置多个才能达到这些速度。我设置了 16 个每组以使用 10 个线程)。一旦我从罪魁祸首列表中删除了 NIC,我开始怀疑交换机上的自动协商设置是否会成为问题。将其重新打开后,我立即看到“链接正常”。
事情还没有结束
我已经让设置工作正常,结果发现没有兼容性问题,我可能永远不需要更换电缆或购买 IBM 电缆。我欣喜若狂,但这还远远没有结束。我原本打算在我的服务器上使用 Proxmox 运行此设置,并在 Windows 上作为客户端计算机。这两个系统都将配备 40G。
由于我知道我会多次搞砸 Proxmox 安装,所以我首先将所有内容备份到另一个驱动器。完成后,我继续在 Proxmox 上安装 Mellanox OFED 驱动程序。尝试此操作时会出现几个问题,OFED 驱动程序会尝试从 Proxmox 中删除非常关键的软件包,因为它们会“干扰”驱动程序(但不会)。因此,我编辑了 mlnxofedinstaller 脚本并注释掉了对“remove_old_packages”函数的所有调用。这可以防止安装程序对 Proxmox 进行脑叶切除术。
此时,大多数事情都正常了,我遇到的唯一问题是将数据发送到服务器。它接受的数据不超过每秒几兆字节,远远低于我应该得到的。我尝试了许多不同版本的软件,尝试了 Ubuntu 20.04,19.XX 不起作用,因为 Proxmox 没有依赖项,但这两个安装有。我被迫安装 Ubuntu 18.04 驱动程序,因为这些是最新的驱动程序,没有依赖性问题。安装驱动程序通常不能解决速度问题。所以我尝试仅使用--kernel-only
安装程序上的标志来安装内核包。在某个时候,我得到了我想要的速度,但这只是侥幸,因为我后来无法复制它们。我决定尝试一些 Debian 10 驱动程序的变体,速度稍快,为 20MB/s。在与其他人交流了一段时间的想法后,我尝试将 40G 网络设置为 9000 MTU。这导致了一些非常奇怪的结果。尽管整个设置的 MTU 为 9000,但速度却只有 1 GB。我将其切换回 1500,以便在 Ubuntu 而不是 Proxmox 上进行进一步测试,因为我在 Ubuntu 上的速度很好。这没有成功,我最初进行的速度测试一定是侥幸。
我决定交换系统中的 NIC,取出后将它们标记为 1 和 2,这样就不会混淆了。在运行更多速度测试后,结果发现问题出在 Proxmox 系统中的卡上。我能够全速发送,但无法全速接收。我记得驱动程序更新了该 NIC 上的固件,但我没有多想,因为我使用的是最新版本。所以我重新刷新了最初安装的交叉刷新版本。经过进一步测试,我们得出结论,上传速度限制为 22GBit/s,下载速度限制为 11GBit/s,这是系统之间各种瓶颈造成的。特别是在使用 30 千兆字节文件的 RAM 磁盘上进行测试时,我们得出结论,安装了两倍 DIMM 的服务器能够以两倍的速度写入。由于兼容层是单线程的,尝试在测试系统上使用带有 NTFS 文件系统的 NVMe 效果不佳。在运行了十几个 iperf 测试之后,一切都运行顺利,即使服务器运行的是 Proxmox。
使用 OFED 驱动程序时需要注意的是,您将无法连接到 CIFS 网络共享。OFED 驱动程序会卸载此模块,直到驱动程序不再运行。以太网驱动程序可以工作,但可能需要跨闪存到 Mellanox 固件。
未来之路
由于我的预算约为 1,500 美元,我不得不选择一些我能找到的最便宜的设备。因此我买了 60 美元的网卡。当我发现这款 Mikrotik 交换机新品只需 500 美元时,我非常兴奋。它拥有我需要的一切,而且价格最低,甚至比一些二手设备还要便宜。它没有端口许可,但附带顶级软件许可证之一。这真是一笔难以超越的交易。当然,一切都有妥协。
尽管我并不打算使用 10G SFP+ 端口,但我希望它们可用于未来的扩展。我已购买了 SFP+ 转 RJ45 适配器和 10G NIC,因此在 40G 设备运输期间,我可以测试一些东西。我能够在 10G NIC 上接收每秒总共 2 千兆位的数据。这是我在 1 千兆位互联网连接和配备 1 千兆位的服务器之间可以传输的所有数据。但尝试从 10G 卡运行千兆位上传到互联网时,速度比我预期的要低得多。尽管能够非常可靠地达到 900Mbps,但我只能获得大约 300Mbps。我继续四处询问,结论是交换机没有足够的缓冲区大小来将 10G 降至 1G。通过将路由器的 1G 上行链路切换到 10G 端口并尝试从 40G 系统以千兆位上传(仅下降 4 倍,而不是 10 倍),将速度降至约 1mbps,进一步证实了这一理论。这表明 48 个 1G 端口具有共享缓冲区。
对于我的 Windows 机器来说,这其实不是什么问题,因为我从来没用过这种速度上传。但对于我的服务器来说,这是一件大事。上传带宽减少到三分之一可能会成为一个真正的问题。经过一番研究,我发现我可以使用路由指标强制流量通过 40G NIC 或 1G NIC,具体取决于流量的去向。虽然这个解决方案不是 100% 完美,但它仍然非常有效。
使用该route -n
命令,我能够看到当前的路由路径。目标是修改路由,以便本地连接优先使用 40G,互联网连接优先使用 1G。路由上的度量越高,使用成本就越高,因此系统将使用成本最低的路由。
Proxmox 默认附带 ifupdown,它更稳定,功能更多。Netplan 可以添加路由,但不能删除或修改路由。它也不允许您在接口启动之前、启动时或启动之后运行命令。您能使用 netplan,但您需要设置单独的服务来删除/修改其他路线。
这是我当前的/etc/network/interfaces
配置,我必须将发布命令添加到我的 NIC 中以添加路由;
auto ens18 # 1 Gigabit NIC
iface ens18 inet static
...
post-up /usr/sbin/route add -net 192.168.0.0/24 metric 1000 ens18
auto ens19 # 40 Gigabit NIC
iface ens19 inet static
...
post-up /usr/sbin/route add -net 0.0.0.0/0 gw 192.168.0.1 metric 1000 ens19
post-up /usr/sbin/route add -net 192.168.0.0/24 metric 1 ens19
post-up /usr/sbin/route del -net 192.168.0.0/24 metric 0 ens19
您的路线应该是这样的;
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 1 0 0 ens18
0.0.0.0 192.168.0.1 0.0.0.0 UG 1000 0 0 ens19
192.168.0.0 0.0.0.0 255.255.255.0 U 1 0 0 ens19
192.168.0.0 0.0.0.0 255.255.255.0 U 1000 0 0 ens18
显然,这些接口需要位于不同的本地 IP 上,我建议将 IP 设置为 40G NIC 以用于任何本地。如果需要端口转发,请使用千兆位 NIC。只要您一次发送的数据不超过 100MB,在本地使用千兆位 NIC 应该没问题。如果您以 40 千兆位/秒的速度向绑定到千兆位端口的 IP 发送本地数据,此路由就可以工作,但它并不总是一致的。
需要注意的是,如果您要修改路由,则应在删除旧版本之前添加修改后的版本。还需要注意的是,您的设置可能不需要与我上面发布的完全相同。例如,我的 Proxmox 安装已经为 ens18 添加了一条路由,因此在添加我想要的路由后,我需要删除该路由。
就这样!我终于完成了设置,速度也达到了我想要的速度。我能够以大约 1.7GB/s 的速度向服务器传输数据,从服务器传输数据的速度大约为 1GB/s(限制是 NTFS 或 SSD 之一)。