我正在尝试将我的本地网络设置升级到 40G,但我似乎遇到了障碍。我有从ebay上下来的 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
TL;DR自动协商在我的交换机上关闭,并且具有制造商推荐的 40G 连接设置。打开自动协商解决了这个问题。
我想用我在设置 40 Gb 网络的过程中的冒险细节来回答我的问题。这样,将来尝试此操作的其他任何人都有一些参考点。
我认为重要的是要注意我在以太网模式下使用了我的 40G NIC,而不是 Infiniband。以太网驱动程序似乎确实有效,但我结束了 OFED 驱动程序,因为它有效,我不想再弄乱它了。如果您打算进行这样的设置,请确保您的卡能够支持以太网模式!
我试过的
拿到交换机、NIC 和电缆后,我安装了 Mellanox/Nvidia 提供的 OFED(OpenFabrics Enterprise Distribution)驱动程序/软件。一旦那些未能建立链接,我就使用软件内置的工具来更新他们的固件。这很简单,我唯一遇到的问题是为我的特定卡找到最新的固件 .bin 文件。我使用的固件是 2.33.5000,仍然很旧,但比卡上的要新。
在那次失败之后,我认为电缆/收发器(一个单元)是罪魁祸首。我将最初获得的电缆换成了一对(56G 10m AOC + 56G 2m DAC > 40G 11m AOC + 40G 1m DAC)定制电缆,这些电缆是为我购买的特定 Mikrotik 开关设计的。由于这些都是定制的,所以他们花了一个月的时间才到货。一旦这些到达并且不起作用,我就被难住了,并继续在各种论坛上寻求帮助。不久之后,有人建议我从 FS.com购买一个工具,该工具允许我在收发器上重新编码供应商,以希望诱使 NIC 正常工作。
由于电缆是为交换机定制的,我认为是 NIC 不配合。将收发器设置为 IBM 或 Mellanox 均无效。在寻求进一步帮助后,一些人建议我找到有关 NIC 的文档并找到兼容的电缆/收发器。我确实找到了一个 PDF(虽然不是由 IBM/Mellanox 提供或制作),其中列出了 FS.com 提供的一些兼容部件号。所以我从 FS.com 购买了IBM 49Y7890 1m DAC。
一旦它到达,我发现这也不是解决方案。出于绝望,我发现一些人已经刷卡到真正的 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 上固件的驱动程序,并没有考虑太多,因为我使用的是最新版本。所以我重新刷了我原来安装的cross flashed版本。经过进一步测试,我们得出结论,22GBit/s 上行和 11GBit/s 下行的有限速度是系统之间各种瓶颈的结果。专门在具有 30 GB 文件的 RAM 磁盘上进行测试,我们得出结论,装有两倍 DIMM 的服务器能够以两倍的速度写入。由于兼容层是单线程的,尝试在测试系统上使用 NVMe 和 NTFS 文件系统效果不佳。在运行了十几个 iperf 测试后,一切运行顺利,即使服务器运行 Proxmox。
使用 OFED 驱动程序时需要注意,您将无法连接到 CIFS 网络共享。OFED 驱动程序卸载此模块,直到驱动程序不再运行。以太网驱动程序可以工作,但可能需要跨闪存到 mellanox 固件。
前面的路线
由于我的预算约为 1,500 美元,因此我不得不购买一些我能找到的最便宜的设备。因此,60 美元的网卡。当我发现这款售价 500 美元的新 Mikrotik 开关时,我被激怒了。它以我能找到的最优惠的价格提供了我所需要的一切,甚至击败了一些二手设备。它没有端口许可,并附带顶级软件许可之一。这真的是一个很难击败的交易。当然,一切都伴随着妥协。
尽管我真的不打算使用 10G SFP+ 端口,但我希望它们用于未来的扩展。我得到了一个 SFP+ 到 RJ45 适配器和一个 10G NIC,所以我在 40G 设备发货时有一些东西要测试。我能够在 10G NIC 上总共接收每秒 2 Gb 的数据。这是我可以在我的 1 Gb 互联网连接和配备 1 Gb 的服务器之间提供的所有数据。但是尝试从 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
配置,我必须将 post-up 命令添加到我的 NIC 以添加路由;你的路线应该是这样的;
显然,这些接口需要在不同的本地 IP 上,我建议将 IP 设置为 40G NIC 用于任何本地。如果需要端口转发,请使用千兆网卡。只要您一次发送的数据不超过 100MB,就可以在本地使用千兆网卡。如果您将 40 Gb/s 的本地数据发送到绑定到千兆端口的 IP,则此路由可以工作,但它并不总是一致的。
请务必注意,如果您正在修改路线,则应在删除旧版本之前添加修改后的版本。同样重要的是要注意,您的设置可能不需要与我上面发布的完全相同。例如,我的 Proxmox 安装已经为 ens18 添加了一条路由,所以我需要在添加我想要的路由后删除它。
就是这样!我终于以我想要的速度完成了我的设置。我能够以大约 1.7GB/s 和大约 1GB/s 的速度传输到我的服务器(限制是 NTFS 或 SSD 之一)。