20
2024
06
18:25:58

ESXI->SR-IOV->Openwrt 一张万兆网卡引发的惨案



推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

序言:

早在之前笔者自己买了一台二手的戴尔R730xd服务器,笔者本来开始是设想,搞linux开发的时候可以用服务器编译,会方便很多,大概长的像下面这个样子:

image-20230724183405395

个把月前呢,笔者购买了两张万兆网卡就是英特尔的X550网卡,外加一个8口的万兆交换机,噩梦就此到来了。。。

image-20230724183449535

这个网卡呢,是支持虚拟化的,就是可以利用SR-IOV,它呢是一种虚拟化的技术,可以将一个硬件设备虚拟化成多个虚拟设备分配给esxi中的hyper-v虚拟机,当虚拟机里面的OS进行访问的时候,可以直接操作这个设备,对于网卡来说,笔者使用的是esxi,它可以虚拟化出几种类型的虚拟网卡,分别是E1000e,VMXNET3还有SR-IOV等等,前两个是完全软件模拟的网卡,当我们进行数据传输的时候,这个虚拟网卡会占用一定的CPU性能,如果我们使用SR-IOV的话,CPU就可以解脱出来,网络传输完全由物理网卡去计算,当然了笔者这个X550支持SR-IOV,所以价格比较的贵。

image-20230724183518405

正常情况呢,我们需要先将网卡安装到服务器中,并且我们需要开启主板的bios的相关配置,一个是开启SR-IOV,还有开启IOMMU功能,最后还有CPU虚拟化VT-x/VT-d等开关。

我们需要去down一个esxi的镜像,安装一下,就是下面这个样子了:

image-20230724183540047

然后我们需要在esxi中开启SR-IOV:

image-20230724183601535

从图中我们可以看到一个网口可以虚拟化出63个虚拟网卡,笔者这个网卡是双网口的,所以可以乘以2。

这个时候我们将这个SR-IOV给到openwrt系统:

image-20230724183625503

这样就算配置好了,然后进了系统,笔者发现这个没有驱动,是的linux下它没有驱动。笔者一顿无语。。。于是笔者openwrt->make menuconfig准备看一下openwrt下有没有这个驱动:

image-20230724183655663

就是kmod-ixgbe和kmod-ixgbevf带vf的表示是虚拟化的,不带是物理网卡驱动,嗯,看起来没有问题,笔者勾上了,然后make,经过漫长的等待,linux终于编译完成了,笔者呢顺带将iperf3 测速软件也给安排上了,这样方便测试,结果漫长的编译然后烧录运行,结果真的是大跌眼镜。。。

image-20230724183719926

绝了。。。万兆的速度跑不到一半,什么鬼。。。这钱花的心塞。。。

于是有映射了一个到windows下测试看了一下,又是一顿吐血。。。

image-20230724183746183

这个速度也是超过一半的感觉,而且还是windwos虚拟机<->windwos虚拟机,绝了,这钱花的亏大了,最后发现windows下是因为这个中断裁决的问题导致的,关闭它,在进行测试:

image-20230724183813536

image-20230724183836504

这下速度是正常了,而且还是我外面的台式机和服务器里面的虚拟机的速度,现在问题只剩下这个openwrt了速度极度不正常,于是我就效仿了windows设置成0关闭它,在inter的文档中有介绍:

image-20230724183905497

image-20230724183923393

结果没有什么用,让人一顿心塞,难道就这样了?于是我又去看了一下这个网卡驱动源码,会不会是因为驱动的原因呢?

image-20230724183947616

发现居然是Linux驱动包自带的,而且还是2018年的代码了,。。。难道是因为源码不是新版版本,这个x550卡也是新出的,并不是很老的卡,毕竟这个卡多少有点强。

image-20230724184010139

于是去了官网,看了一下当前官网的驱动:

image-20230724184033968

这个驱动是新的离谱啊,先不管了下载下来,

image-20230724184055062

源代码形式的,linux下都是喜欢直接给源码,然后自己编译它在集成到系统中,不像windows直接给exe安装程序,安装就完事了,linux下很多时候其实是编译不过去的,是的,这个源码用它官方的makefile是编译不过去的,还有什么鬼签名就是intel_public_key_ixgbevf.zip这个包,还有说明:

image-20230724184115824

然后呢,我们将一个物理驱动和虚拟网卡两个驱动源代码先下载下来解压到这个文件夹下,因为发现linux内核中也有这两个驱动,怕编译的时候有歧义,我就添加了一个头new_xxx:

image-20230724184147506

然后我们在ubuntu下执行:

  1. Run ./scripts/feeds update -a

  2. Run ./scripts/feeds install -a

  3. Run make menuconfig

    然后我们在界面下就可以看到了,勾上它两,

    image-20230724184211071

然后我们要记得将上面两个自带的驱动去掉,防止冲突,好了开始make,嗯 不出意外根本编译不成功,唉,难受的一笔,我还要去重新写makefile文件?是的,编译这个内核驱动文件ko并不容易,硬着头皮写一下吧:

image-20230724184300409

我们只要src的目录其他的全部删除,然后准备一份makefile文件,内容如下:

image-20230724184348481

就是上面这个了,需要注意的是编译的make位置不能是空格必须是tab,不然一顿突突的报错,有的折腾了,然后我们进入src目录,删除原来的makefile文件和Kconfig文件,自己写一个新的:

image-20230724184414929

image-20230724184435377

写一个上面这个内容的文件,如果写错了又是一顿突突,编译不过去,我。。。无比心塞。new_ixgbevf也是一样的,我直接贴出来:

image-20230724184501912

image-20230724184515736

好了,接下来就是重新进行编译了,

image-20230724184540246

然后等,是的,等多久看运气,

image-20230724184559047

可以看到ko已经生成了,它还给我们生成了一个ipk的安装包,nice,我们只要在make menuconfig界面下选中是*号而不是M那么,我们make整个系统就会被添加到内核中,会随着linux启动设备树而自动加载启动的。

make吧。。。

编译,烧录,启动,测试:

image-20230724184621565

我们可以从linux启动日志看到:

[ 10.889637] ixgbevf: Copyright(c) 1999 - 2023 Intel Corporation.

包括输出的版本号,来确定驱动已经编译成功并且也加载了,测试了一下网络是通的,接下来继续开始测速,

。。。。。。。。。。。。。

一口老血,折腾了半天,居然还是这样,速度依旧没有跑到一半。。。此时心中一阵草泥马在奔腾啊。。。于是我在怀疑是不是因为Bridge网桥的原因?因为在openwrt的lan网络内是用网桥进行连接的,这样我们可以将多网口的机器做成一个内网都在lan的交换机,有没有可能网桥有性能问题?

image-20230724184646301

于是我把br-lan网桥给删除了,直接用eth1这个虚拟网卡,发现测速openwrt->PC主机 的速度从3Gbps提升到了6Gbps,这起码也是提升了一半吧,PC主机->openwrt最后最后发现我将网卡gro开启后就正常了。。。这是什么鬼。。。。。。。。

就是执行这个命令 ethtool -K eth1 gro on

最后附上最终测速截图:

openwrt->PC

image-20230724184711390

image-20230724184725350

PC->Openwrt

image-20230724184746407

image-20230724184802617

目前就这样吧。。。万兆确实快的一塌糊涂,而MCU还在纠结上百兆还是上千兆,MCU就那么点资源,为什么大家感觉上了以太网后,就能起飞了呢?我这80个CPU的服务器跑个以太网都不是很理想,别说那1,2M主频的MCU了,ram小的可怜,上千兆?估计一瞬间就塞满了。。。。哈哈


本文链接:https://hqyman.cn/post/6763.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

您的IP地址是: