配备 Apple M1 和 Linux 的超快速 Thunderbolt NAS

2021-08-05 21:04:24

在这篇文章中,我将讨论如何通过添加 Thunderbolt 3 以实现 20 或 40Gbps 的闪电般快速连接来升级 NAS 服务器。此特定实现特定于 Apple Mac Mini M1 和旧 Supermicro X10SRL-F 主板上的 Linux NAS 服务器,但在类似架构和操作系统上的原理应该相同。 Linux nas-04 5.13.4-1.el7.elrepo.x86_64 #1 SMP Wed Jul 21 23:02:00 EDT 2021 x86_64 x86_64 x86_64 GNU/Linux 我应该注意这个配置的一个主要警告是它是点对点通过 Thunderbolt 4 电缆在两台计算机之间连接。 NAS 的网络功能没有被破坏或取代,它只是通过两台附近计算机之间的另一种通信介质进行了增强。 Thunderbolt 支持桥接模式,因此可以串联多个设备。这种实现并不是特别新颖。然而,它相对较新,许多可能不知道这种快速存储方法的人可能会觉得它很有趣。特别是拥有不可升级的较小系统磁盘的人进行视频编辑,在他们的家庭实验室中洗牌虚拟机的人等。有很多现有的 Thunderbolt Direct Attach (DAS) 外壳(OWC 制造了一些不错的 - 没有附属关系),但根据我的粗略研究,我无法找到深入研究使用 Thunderbolt 的网络功能连接到现有的NAS 服务器(虽然是点对点)。我喜欢通过 PtP Thunderbolt 通过 NAS 拥有伪 DAS 的想法。 Thunderbolt 4 规格包括光纤,因此最终电缆距离不会成为限制因素。因为我找不到很多关于 linux Thunderbolt 接口的文档,而且目前没有很多用户空间工具可用(2021 年第三季度),我决定在这里编译我的想法和输出捕获。我是一个数据囤积者,我仍然拥有几十年前的各种数据。我的数据包括 90 年代后期的电子邮件、旧硬盘图像、文档、源代码、数据库、图片和我多年来创建或收集的其他数字内容。其中大部分都在档案中(旧的 MIDI 文件、DOS 游戏等),但偶尔我会寻找一些通常需要安装磁盘映像或搜索大文件索引的东西。因此,我一直在探索改善家庭计算机实验室的方法。另外,我只是喜欢挑战性能的极限。将我的 homelab 网络升级到 10Gbps(约 1,250 MB/s)后,我对整体性能感到非常满意。但是,我很快发现自己使用 NVMe 磁盘升级 NAS,甚至将其中的几个条带化以获得最佳性能。随着 NVMe 磁盘和接口变得越来越快,我发现自己的 10Gb 以太网网络已经饱和。 Thunderbolt 令人兴奋有几个原因,但对我来说最值得注意的是绝对的速度和带宽能力。

将单个 4 通道 PCIe 3.0 卡添加到 SOHO 中现有的 NAS 服务器是一个相对简单的过程。由于以下几个原因,我不确定我选择的卡是否有效:我不知道 Thunderbolt 是否需要现代 CPU 架构。英特尔正在即将推出的 Ice Lake 处理器的 CPU 中包含 Thunderbolt(我认为),但目前它仍然是一个外部附加芯片组。我的 NAS,因为我怀疑许多其他 Homelabbers 和业余爱好者没有最先进的处理器或主板芯片组。我合理地得出结论,最新的 Linux 内核和相应的模块/代码将支持 Thunderbolt,但我不确定兼容性的程度和/或我的特定硬件/软件组合和用例可能产生的任何“X 因素”。我把我的恐惧放在一边,决定试一试。没有胆量就没有空气勋章,对吧?在较旧的主板上实施此卡涉及硬件“黑客”。幸运的是,这很容易,而且卡供应商几乎提供了包装盒中所需的一切。我还没有深入研究软件覆盖功能,所以这种硬件修改可能根本没有必要,YMMV。此配置值得注意的是,主板没有 Thunderbolt(tbt_3 或 tbt_4)接头,并且没有特殊的 CPU / 芯片组要求。它只是一个基于 Intel Xeon 的主板/cpu 组合与 Gigabyte GC 2.0 Titan Ridge PCIe Thunderbolt 3 卡。

我在上面轻轻地使用了作品“hack”。要让没有专用 Thunderbolt 接头的服务器看到 PCIe 卡,您需要像这样将引脚 3 和 5 短接在一起:实际上,这告诉卡它已插入。“Thunderbolt™ Enabled”主板上的 THB_C 端口可以提供额外的 DisplayPort 功能。除了有关供应商锁定的理论之外,我无法找到 tbt 标头连接的决定性原因。我确定它在 Intel Thunderbolt 白皮书 (GPIO) 中,但我还没有看过。我所知道的是,如果你拿到这张卡并且它没有出现在你的设备列表中,你可能需要短接这两根线。如果您这样做并且发生了不好的事情,我对发生的任何事情概不负责 - 请进行相应的研究。现在卡已安装且内部电缆已连接,是时候启动 NAS 服务器了。该主机是 Linux 服务器。它在配备 Intel Xeon CPU 的 Supermicro X10SRL-F 主板上运行。机箱是两个 Supermicro 836A。一个机箱是 NAS 服务器,另一个是连接到 NAS 的 DAS(磁盘架),总共有 32 个以上的可移动磁盘托架。给 NAS 服务器加电后我们可以看到 Titan Ridge 卡使用 lspci: 02:00.0 PCI bridge: Intel Corporation JHL7540 Thunderbolt 3 Bridge [Titan Ridge 4C 2018] (rev 06) 03:00.0 PCI bridge: Intel Corporation JHL7540 Thunderbolt 3 Bridge [Titan Ridge 4C 2018] (rev 06) 03:01.0 PCI 桥:英特尔公司 JHL7540 Thunderbolt 3 桥 [Titan Ridge 4C 2018](修订版 06)03:02.0 PCI 桥:英特尔公司 JHL7540 Thunderbolt 3 桥 [Titan Ridge] (修订版 06)03:04.0 PCI 桥接器:英特尔公司 JHL7540 Thunderbolt 3 桥接器 [Titan Ridge 4C 2018](修订版 06)04:00.0 系统外设:英特尔公司 JHL7540 Thunderbolt 3 NHI [Titan Ridge 4C 2018](修订版 06:06) 00.0 USB 控制器:Intel Corporation JHL7540 Thunderbolt 3 USB 控制器 [Titan Ridge 4C 2018] (rev 06) 我们可以在 /sys/bus/thunderbolt 内核系统路径中看到更多信息。这是将 Thunderbolt 电缆连接到另一台主机之前的输出: root@nas-04:/sys/bus/thunderbolt # tree 。 ├──设备│ ├── 0-0 -> ../../../devices/pci0000:00/0000:00:01.1/0000:02:00.0/0000:03:00.0/0000:04: 00.0/domain0/0-0 │ ├── 0-3 -> ../../../devices/pci0000:00/0000:00:01.1/0000:02:00.0/0000:03:00.0/0000 :04:00.0/domain0/0-0/0-3 │ └── domain0 -> ../../../devices/pci0000:00/0000:00:01.1/0000:02:00.0/0000: 03:00.0/0000:04:00.0/domain0 ├──驱动程序│ └── Thunderbolt-net │ ├── bind │ ├── module -> ../../../../module/thunderbolt_net │ ├── 事件

root@nas-04:/sys/bus/thunderbolt # 树。 ├──设备│ ├── 0-0 -> ../../../devices/pci0000:00/0000:00:01.1/0000:02:00.0/0000:03:00.0/0000:04: 00.0/domain0/0-0 │ ├── 0-3 -> ../../../devices/pci0000:00/0000:00:01.1/0000:02:00.0/0000:03:00.0/0000 :04:00.0/domain0/0-0/0-3 │ ├── 0-3.0 -> ../../../devices/pci0000:00/0000:00:01.1/0000:02:00.0/ 0000:03:00.0/0000:04:00.0/domain0/0-0/0-3/0-3.0 │ └── domain0 -> ../../../devices/pci0000:00/0000:00 :01.1/0000:02:00.0/0000:03:00.0/0000:04:00.0/domain0 ├──驱动程序│ └── Thunderbolt-net │ ├── 0-3.0 -> ../../.. /../devices/pci0000:00/0000:00:01.1/0000:02:00.0/0000:03:00.0/0000:04:00.0/domain0/0-0/0-3/0-3.0│ ├─ ─ bind │ ├── module -> ../../../../module/thunderbolt_net │ ├── uevent │ └── unbind ├── drivers_autoprobe ├── drivers_probe └── uevent ...我们可以使用 dmesg 查看相关内核消息缓冲区行(日志):[Sun Jul 25 16:24:56 2021] Thunderbolt-net 0-3.0 Thunderbolt0: ThunderboltIP login timed out [Sun Jul 25 16:50:04 2021] Thunderbolt 0- 3:主机断开连接 [Sun Jul 25 16:50:16 2021] Thunderbolt 0-3:发现新主机,vendor=0xa27 device=0xa [Sun Jul 25 16:50:16 2021] Thunderbolt 0-3:Apple Inc. Macmini9,1 [Sun Jul 25 16:50:22 2021] IPv6: ADDRCONF(NETDEV_CHANGE): Thunderbolt0: 链接就绪 有趣的是,我们还可以看到 Mac Mini 立即被自动发现,并且 Thunderbolt0 网络接口已经可用。我以为我必须为 Thunderbolt-net 启动内核模块(驱动程序),但看起来它是自动发生的。您可以检查是否使用 lsmod 加载了 Thunderbolt 和 Thunderbolt-net 内核模块。如果您没有看到它们列出,您可以使用 modprobe Thunderbolt 和 modprobe Thunderbolt-net 手动加载它们。在网络设备可用后,我们可以使用标准用户空间工具对其进行寻址和配置。我使用旧的 ifconfig 为接口设置非本地链接(不是自动 169.254.xx)IP 地址。使用 ip addr 或其他用户空间工具 (GUI) 应该可以正常工作。 root@nas-04:~ # ifconfig Thunderbolt0 10.1.1.2 root@nas-04:~ # ifconfig Thunderbolt0 Thunderbolt0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.10.2 netmask.0.0505 broadcast.0505. 255.255 inet6 fe80::7b8c:bc15:a8f1:93f5 prefixlen 64 scopeid 0x20<link> ether 12:e2:e9:5f:d5:4b txqueuelen 1000 (Ethernet) RX 数据包 103 字节 (B RX 5452) 107 字节 5452 RX 错误溢出 0 帧 0 TX 数据包 31 字节 8602 (8.4 KiB) TX 错误 0 丢弃 0 溢出 0 载波 0 冲突 0 现在接口有一个 IP,我们必须添加一个静态主机路由条目以便它进行通信:

# 添加静态主机路由 root@nas-04:~/bolt # route add -host 192.168.10.4 dev Thunderbolt0 # 查看路由表 root@nas-04:~/bolt # route -n 内核 IP 路由表 Destination Gateway Genmask Flags Metric参考使用 Iface 0.0.0.0 192.168.6.1 0.0.0.0 UG 101 0 0 eno1 192.168.6.0 0.0.0.0 255.255.255.0 U 101 0 0 eno1.0.05.05 linux .0.05.05 linux .0.5 0 5 linux .0 5 0 2 5 0 5 linux听说过:root 用户的命令提示符是一个标签 (#),因此如果有人从这样的网站复制和粘贴命令,它将作为注释运行,而不实际执行粘贴缓冲区(如果有人有源为此,请在下面发表评论)。此设置中的另一台主机是 Mac Mini。此设置不需要 Thunderbolt 4,Apple Silicon 也不需要。 Thunderbolt 是 Intel™ 规范,任何获得 Intel 许可的硬件都应该同样好用。该主机运行 MacOS Big Sur / Monterey。在这里我们可以看到在机器之间连接 Thunderbolt 电缆后出现的新网络服务 - Thunderbolt Ethernet Slot 1 和 Thunderbolt Bridge: mini-01:~ cbergeron$ networksetup -listallnetworkservices 星号 (*) 表示网络服务被禁用。 Ethernet Ethernet Adapter (en4) Ethernet Adapter (en5) USB 10/100/1000 LAN Wi-Fi Bluetooth PAN Thunderbolt Ethernet Slot 1 iPhone USB Thunderbolt Bridge 就像我们在 Linux 主机上设置 IP 的方式一样,我们将在 Linux 主机上做同样的事情麦克。您可以随意设置 TB 接口的 IP。通过 posix 工具的命令行: root@nas-04:~ # ifconfig Thunderbolt0 10.1.1.2 root@nas-04:~ # ifconfig Thunderbolt0 Thunderbolt0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168 .10.2 网络掩码 255.0.0.0 广播 10.255.255.255 inet6 fe80::7b8c:bc15:a8f1:93f5 prefixlen 64 scopeid 0x20<link> ether 12:e2:e9:5f:d5:4b1t0x3netqueues (54.0 KiB) RX 错误 0 丢弃 0 溢出 0 帧 0 TX 数据包 31 字节 8602 (8.4 KiB) TX 错误 0 丢弃 0 溢出 0 载波 0 冲突 0

或 macos 命令: mini-01:~ cbergeron$ networksetup -getinfo "Thunderbolt Bridge" 手动配置 IP 地址:192.168.10.4 子网掩码:255.255.255.0 路由器:192.168.10.4 IPv6:自动 IPv6 IP 地址:无 IPv6 路由器:无对我使用 iperf3 的连接速度进行基准测试,以便磁盘 I/O 不是变量。尽管我在 NAS 服务器上使用分层存储,包括 NVMe,但此时我只对连接功能感兴趣。以下是 iperf3 -s 在 Mac mini 上的结果: ------------------------------------- ---------------------- 服务器监听 5201(测试 #2)-------------------- ---------------------------------------- 已接受来自 192.168.10.2、端口 43732 的连接 [ 5] 本地 192.168.10.4 端口 5201 连接到 192.168.10.2 端口 43734 [ID] 间隔传输比特率 [5] 0.00-1.00 秒 1.95 GBytes 16.7 Gbits/sec [5] 1.013-Gbits/s [5] 1.013-Gbits/GBytes/G 2.00-3.00 sec 2.01 GBytes 17.2 Gbits/sec [ 5] 3.00-4.00 sec 2.00 GBytes 17.2 Gbits/sec [ 5] 4.00-5.00 sec 2.01 GBytes 17.3 Gbits/sec.0.00 sec.70sec.70sec6.00 sec.0.00.00 17.3 Gbps 5] 6.00-7.00 sec 2.01 GBytes 17.3 Gbits/sec [ 5] 7.00-8.00 sec 1.98 GBytes 17.0 Gbits/sec [ 5] 8.00-9.00 sec 1.98 GBytes 17.01007sec/17.0105Gbits. sec [ 5] 10.00-10.00 sec 2.18 MBytes 16.5 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - [ ID] 间隔传输比特率 [5] 0.00- 10.00 秒 19.9 GBytes 17.1 Gbits/秒接收者 - - - - - - - - - - - - - - - - - - - - - - - - - ---------- 服务器监听 5201 ( 测试 #3) ------------------------------- ---------------------------- ^Ciperf3: 中断 - 服务器已经终止 不错。虽然不是我所期待的。我最初以为我会看到接近 35Gbps(40Gbps 减去 10-15% 的开销)。这更符合 20 Gbps 的 85%。有趣的。这几乎是我预期的一半。可能是它以半双工模式运行吗?让我们检查一下 PHY 链接速度 (NAS):啊哈。每个方向为 20Gb/s。 20 个发送 (tx),20 个接收 (rx)。呵呵,TIL。为了深入挖掘,我决定尝试同时发送和接收。理论上,我应该从每台服务器获得约 17Gbps 作为发送方和接收方,以获得大约 34 Gbps 的链路饱和度。让我们看看发生了什么:

该死的。我不太确定该怎么做。 (如果您有任何见解,请在下面发表评论)为了进一步减少等式,我尝试通过 Thunderbolt(两个 M1 处理器,两个 Thunderbolt 4)测试两台 Mac 之间的速度,以查看 PCIe Ridge Titan 卡或电缆是否存在问题。一个是 2020 Macbook Air,另一个是 2020 Mac Mini。 bash-3.2$ sudo iperf3 -s ------------------------------------------ ----------------- 服务器监听 5201(测试 #1)------------------------ --------------------------------- 接受来自 10.10.10.2、端口 60489 [5] 本地 10.10 的连接。 10.7 端口 5201 连接到 10.10.10.2 端口 60490 [ ID] 间隔传输比特率 [ 5] 0.00-1.00 秒 2.27 GBytes 19.5 Gbits/sec [ 5] 1.00-2.00 sec 2.43.00-2.00 秒 2.40.00.00 秒 2.40.00.00 秒 2.00-1.00 秒 [5] GBytes 20.4 Gbits/sec [ 5] 3.00-4.00 sec 2.36 GBytes 20.2 Gbits/sec [ 5] 4.00-5.00 sec 2.33 GBytes 20.1 Gbits/sec [ 5] 5.00-6.0323.0sec 5.00-6.032.00sec秒 2.34 GBytes 20.1 Gbits/sec [ 5] 7.00-8.00 sec 2.35 GBytes 20.2 Gbits/sec [ 5] 8.00-9.00 sec 2.33 GBytes 20.0 Gbits/sec [ 5] 9.02004 Gbits/sec [5] 9.0201sec-Gbits/sec [5]. -10.00 秒 576 KB 19.6 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - [ID] 间隔传输比特率 [5] 0.00-10.00 秒 23.4 GBytes 20.1 Gbits/sec 接收器更好,但不是很多。它是 20Gbps,而不是 34Gbps。 Thunderbolt 是 40Gbps,但我只看到了一半。我知道我没有 PCIe 瓶颈,因为 Thunderbolt 使用 4 条 PCIe 3.0 通道,它有(专用)。当我查看链接速度时,我可以看到两台 Mac 之间通过 Thunderbolt 的链接是 40Gbps:我突然想到 Thunderbolt 4 保证 40Gbps。 Thunderbolt 3 不是。还记得我在本文开头提到的标准化是 TB4 和 TB3 之间唯一的主要区别吗?也许总吞吐量也是如此。我已经订购了另一条 Thunderbolt 4 电缆,因此我可以在 Mac 和 NAS 之间创建一个双链路 Thunderbolt Bridge。不幸的是,它们并不便宜,甚至还不是纤维。但是,即使我不在这里永久使用它们,我手头也会有额外的 USB4 或其他 USB-C 用途。

为了解决 Mac 和 Linux 服务器之间不均匀的同步 TX / RX 速度,我将尝试在两台 Mac 之间进行测试,看看我是否在那里获得了更一致的双边速度。我还将检查 CPU 和内存压力,看看它们如何受到传输 500GB 的影响。我会用我的发现更新这篇文章。我将查看 Linux 内核驱动程序代码,看看是否有任何可能受到限制的内容。 Thunderbolt 应该有一个 10Gbps 的带宽限制以允许 DisplayPort 和 USB,但它似乎已被非正式取消(或者 Apple 在主机之间做一些专有的事情)。使用 Thunderbolt 3/4 电缆而不仅仅是任何 USB-C 电缆很重要,因为有多种类型的 USB-C 电缆。 USB-C 是连接器的外形尺寸。而已。连接器。它甚至不兼容电线。某些电缆仅连接电源线(充电电缆)。 Thunderbolt 4 是一个严格的设计规范。与 Thunderbolt 3 相比,Thunderbolt 4 的主要优势不是性能,而是标准化。如果您购买了 Thunderbolt 4 设备,则它只有在符合所有*协议规范的情况下才能获得官方的 Intel™ Thunderbolt™ 4™ Certification™。我对众多商标符号 (™) 开玩笑,但英特尔和苹果在这里帮了大家一个忙。 Thunderbolt 4 旨在减少 USB 3 和 USB4 的混淆。目前,在 USB-C 外形中,有 USB-C 充电电缆、数据传输电缆、多用途电缆、低速电缆以及 10Gbps 和 20Gbps 电缆。如果您曾经在 Smile.amazon.com 等热门网站上购买过 USB-C 任何东西,您会看到营销条形图显示 USB-C 的速度有多快。嗯,USB 3.0 是。好吧,USB 3 Gen 1,而不是 USB 3.0。实际上 - USB 3 Gen 2 (USB-C) 更快。如果电缆未用于 USB 集线器。或者,如果是,则必须将其连接到 Powered USB 3.x Dock。 Thunderbolt 4 有望消除所有这些(但价格更高)。 USB 3.whatever 和 USB4 协议可以在 Thunderbolt 上运行,但反过来不行。

如果您的主板没有 Thunderbolt 接头,并且您使用我上面指出的解决方法(短接 3 和 5 针),您可能会失去功能。具体来说,能够从 Linux 循环卡电源,因为我们正在强制板“打开”。非常感谢 Mika Westerberg @ Intel 与 LKML 的每个人一起为 Linux 内核工作。 Christian Kellner - 因为他在 Thunderbolt Linux 用户空间实用程序和演示方面的出色工作。如果您对 Linux 上的 Thunderbolt 感兴趣,请访问他的博客并喜欢或关注他。 https://christian.kellner.me/2018/04/23/the-state-of-thunderbolt-3-in-fedora-28/ 当然还有 Apple™ 和 Intel™ 用于加入此规范的资源 - 即使只是在很短的时间内。如果您喜欢这篇文章,请在 twitter 上关注我和/或在下面发表评论。有什么我应该尝试的吗?也许增加传输MTU?或者你可能知道为什么当我同时 TX 和 RX 时我会得到奇怪的速度......