Raspberry PI计算模块4上的5Gbps以太网

2020-10-31 03:06:50

TL;DR:我成功地让Intel I340-T4 4x千兆网卡运行在Raspberry PI计算模块4上,结合所有接口(包括内部PI接口),我可以获得高达3.06 Gbps的最大持续吞吐量。

在我第一次尝试让GPU与PI一起工作时未能点亮显示器后,我想这一次我应该尝试一些更实际的东西。

为此,我向大家展示英特尔推出的这款四接口千兆网卡--久负盛名的I340-T4:

此卡通常用于需要多个网络接口的服务器,但为什么会有人首先需要这么多网络接口?

在我的例子中,我只是想探索未知的事物,看看在我的PI上可以得到多少个接口,每个接口都有最高千兆位的速度。

但有些人可能希望将PI用作路由器,可能使用流行的OpenWRT或pfSense软件,并且拥有多个快速接口对于构建自定义路由器至关重要。

其他人可能想要多个接口用于网络隔离、冗余或具有多个IP地址用于流量路由和计量。

不管是哪种情况,如果卡不起作用,所有这些都不重要了!所以,让我们把它插上电源吧。

我想把卡插到Compute Module 4 IO板上,但发现了第一个障碍:卡有一个4x插头,但IO板只有一个1x插槽。不过,使用1x到16x的PCI Express适配器可以非常容易地克服这一问题。

插入后,我使用最新的PI OS版本启动了Compute Module,并运行了lspci:

$lspci00:00.0PCI网桥:Broadcom Limited Device 2711(20版)01:00.0以太网控制器:英特尔公司82580千兆网卡(01版)01:00.1以太网控制器:英特尔公司82580千兆网卡(01版)01:00.2以太网控制器:英特尔公司82580千兆网卡(01版)01:00.3以太网控制器:英特尔公司82580千兆网卡(01版)。

主板被找到并列出,但我从GPU测试中学到了不要太乐观-至少现在还不是。

下一步是检查dmesg日志并向上滚动到PCI Initialization部分,并确保bar地址注册都是正确的……。对我来说幸运的是他们是!

[0.983329]PCI0000:00:00.0:BAR 8:已分配[内存0x600000000-0x6002fffff][0.983354]PCI0000:01:00.0:BAR 0:已分配[MEM 0x600000000-0x60007ffff][0.983379]PCI0000:01:00.0:BAR 6:已分配[MEM 0x600080000-0x6000fff首选项][0.983396]PCI0000:01:00.1:BAR 0:已分配[MEM 0x600100000-0x60017ffff][0.983419]PCI0000:01:00.2:BAR 0:已分配[MEM 0x60018000-0x6001fff。[0.983442]]PCI0000:01:00.3:BAR 0:已分配[内存0x600200000-0x60027ffff][0.983465]PCI0000:01:00.0:BAR 3:已分配[MEM 0x600280000-0x600283fff][0.983487]PCI0000:01:00.1:BAR 3:已分配[MEM 0x600284000-0x600287fff][0.983510]PCI0000:01:00.2:BAR 3:已分配[MEM 0x600288000-0x60028bfff][0.983533]PCI0000:01:00.3:BAR 3:已分配[MEM 0x60028000-0x600287ffff]。

这张卡使用的酒吧地址空间几乎不像GPU那么多,所以它至少可以在PI OS上开箱即用地正确初始化自己。

所以现在我知道卡已经在公交车上被识别和初始化了.。真的有那么简单吗?它已经起作用了吗?

我运行了命令ip link show,它列出了Linux看到的所有网络接口,但我只看到了内置接口:

找不到网卡的其他四个接口。我插上网线只是想看看会发生什么,ACT LED亮起了绿色,但LNK LED没有亮起来。

由于我没有在dmesg日志中看到任何其他错误,这让我相信默认情况下PI OS上没有安装该卡的驱动程序。

我获得驱动程序的第一次尝试是克隆Raspberry Pi Linux源代码,并检查make menuconfig在Linux源代码树中搜索任何英特尔网络驱动程序。不过,我没有找到任何驱动程序,所以我转向下一个想法,在英特尔的网站上搜索一些驱动程序。

我进入的第一个页面是Intel Ethernet Adapter Complete Driver Pack,它看起来很有前途。但我注意到它超过600MB,被列为独立于操作系统,在我查看驱动程序包中的内容后,多年来似乎有一半的英特尔芯片都得到了支持。

我只想让I340正常工作,但我真的不在乎所有的Windows驱动程序和可执行文件,所以我一直在寻找。

最后,我登陆了Intel Gigabit Ethernet Network Connections的Linux基础驱动程序页面,这个页面看起来更针对Linux和较小的设备集。

因此,我下载了igb驱动程序,使用tar xzf解压存档文件,然后进入源代码目录,按照英特尔的说明运行make install。

安装过程说找不到内核头文件,所以我用sudo apt install raspbercrypi-kernel-headers安装了它们,然后再次运行make install。

这一次,它花了一些时间进行构建,但是最终构建出错了,我看到了一个关于函数隐式声明的错误';isdigit&39;。我将错误消息复制并粘贴到Search中,幸运降临在我身上,因为第一个结果提到问题是缺少ctype.h头文件的include。

有了这些知识,我编辑了igb_main.c文件,将以下行添加到其他文件中,包括:

这一次,当我运行make install时,它似乎成功了,但是在最后,当它尝试将东西复制到适当的位置时,我得到了一个权限错误,所以我用sudo再次尝试,它编译成功了!

我本来可以使用modProbe尝试立即加载新的内核模块,但我选择了重新启动PI并祈祷,在重新启动之后,当我运行ip link show时,我惊讶地看到所有四个接口都出现了,这让我非常高兴:

$IP link show1:LO:<;Loopback,Up,Low_Up>;mtu 65536 qdisk无队列状态未知模式默认组默认组默认qlen 1000 link/loopback 00:00:00:00:00:00:002:eth0:<;广播,多播,up,low_up>;mtu 1500 qdisk MQ状态默认组默认组default qlen 1000 link/ether b8:27:EB:5c:89:43 brd:ff3:eth1:<;无载波,广播,组播,上行&>MTU 1500 qdisk mq状态下行模式默认组默认组默认qlen 1000 link/ether 90:E2:BA:33:72:64 brd ff:ff4:eth2:<;无载波,广播,组播,up>;MTU 1500 qdisk mq状态下行模式默认组默认组默认qlen 1000 link/ether 90:E2:ba:33:72:65 brd ff:f5:eth3:<;无载波,广播,组播,上行>;MTU 1500 qdisk mq状态关闭模式默认组默认qlen 1000链路/以太90:E2:ba:33:72:66 brd ff:ff6:eth4:<;无载波,广播,多播,向上>;MTU 1500 qdisk mq状态关闭模式默认组默认qlen 1000链路/以太90:E2:ba:33:72:67 brd ff:ff7:wlan0:<;广播,多播>;MTU 1500 qdisk noop状态关闭模式休眠组默认qlen 1000链路/以太网b8:27:eb:74:f2:6c brd ff:ff。

因此,下一步是看看PI是否可以同时全速支持所有5个千兆以太网接口。

我已经对内置的以太网控制器进行了940 Mbps左右的测试,所以我预计这四个新接口单独使用时至少会有这么高的速度。但真正的问题是,我可以同时从所有五个接口获得多少带宽。

但我遇到了一个问题:我的家庭网络只有1Gbps。即使我设置了5台计算机,使用iperf网络基准测试工具尽可能快地将数据传输到PI,网络也最多只能通过1 Gb。

所以我得有点创意。我有我的家庭网络和我的MacBook Pro,我可以用来作为其中一个接口,但我需要另外四台完全独立的计算机,才能用它们自己的全千兆接口与Compute Module交谈。

所以我心想,我需要四台计算机,它们都需要千兆网络接口……。我在哪里可以找到四台电脑来做这件事?我记得,啊哈,Raspberry Pi Dramble!它有四个PI 4,如果我把每一个都连接到Intel卡上的一个端口上,我就会有五个完整的千兆连接,我就可以进行测试了。(注:黑莓PI Dramble!#34;Raspberry Pi Dramble!";Raspberry Pi Dramble!)。

因此,我抓起集群,收集了一堆USB-C充电电缆(我通常通过1 Gbps的PoE开关供电,但在这里我不能使用)。我将每个PI插入英特尔网卡的一个端口。在这一点上,我的办公桌变得有点凌乱:

为了让我可以远程控制PI并配置他们的网络,我对他们进行了设置,使他们的无线接口连接到我家的WiFi网络,这样我就可以从我的Mac连接到他们并控制他们。

此时,我可以看到有线链路处于连接状态,但它们使用的是自分配的IP地址,因此我无法在Dramble PI和Compute Module之间传输任何数据。

因此,我必须为所有PI和接口设置静态IP地址。因为联网有一半是巫术,所以我不会详细介绍让5个不同的网段在CM4上运行的试验细节,但如果你想要所有的血淋淋的细节,可以看看这期GitHub的问题:测试4接口英特尔网卡I340-T4。

我在每个PI的/etc/dhcpcd.conf中分配了静态IP地址,以便它们都可以独立通信。

然后,我在所有PI上安装了iperf来测量带宽。我在Compute Module上运行了5个iperf--server实例,每个实例都绑定到不同的IP,并且我同时在每个PI和我的Mac上运行iperf,每个接口都连接一个实例。

总共有5个独立的千兆网络接口,我获得了3.06Gbps的吞吐量。我单独测试了每个接口,以确保它们的速度都在940 Mbps左右,而且当它们自己测试时都是这样做的……。因此,从理论上讲,5Gbps是可能的。

我还一起测试了三个接口,这三个接口都能用大约3Gbps的吞吐量使PCIe总线饱和。

不过,我还试着测试了三个接口和PI的内置以太网……。并且注意到我仍然只有大约3Gbps!我尝试了不同的组合,比如三个英特尔接口和板载接口,两个英特尔接口和板载接口,在每种情况下,最大吞吐量都在3Gbps左右。

我真的希望能够突破到4Gbps,但似乎我在PI的网络堆栈中遇到了一些其他限制。也许我遗漏了什么背景?请在评论中让我知道!

无论如何,基准测试是很棒的,但比知道您可以在PI上获得多个千兆接口更好的是,您现在可以使用PI来执行一些智能联网操作,如充当路由器或防火墙!

我想尝试的下一件事是安装OpenWRT或pfSense,并设置一个完全自定义的防火墙……。但是现在我需要在这个项目上放一个大头针,为我正在做的其他几个项目和我正在测试的卡节省一些时间-比如一个10 GbE网卡!

说到这里,所有英特尔I340-T4以及所有其他PCIe卡测试的详细信息都可以通过我的Raspberry PI PCI Express卡数据库获得。

我会尽快发布更多来自其他卡片的结果,只要我能让他们接受测试!