我们需要配置 NIC,以便我们的应用程序在 FreeBSD 12 上获得更好的性能。系统是
FreeBSD 12.0-RELEASE-p3 GENERIC amd64
首先,我想展示一下我们针对 Linux 系统的解决方案。对于在多队列 NIC 上设置 16 个 RX 和 16 个 TX 队列,我们应用命令ethtool -L ens786f1 combined 16
。我们正在寻找 FreeBSD 系统的替代调用。
在FreeBSD上,我们的网卡是由ixl
驱动程序驱动的。我发现一些内核变量应该做同样的事情,比如override_qs_enable
,override_nrxqs
和override_ntxqs
(这里是联机帮助页)。设置它们的命令看起来像sysctl dev.ixl.1.iflib.override_qs_enable="1"
等等(ens786f1
并且ixl1
是同一设备在不同系统上具有不同接口)。
我想每次启动时设置这些变量。手册页说,必须在ixl
加载驱动程序(使用加载程序)之前在启动时设置这些变量,因此我将设置行添加到/boot/loader.conf
.该文件之前是空的,所以现在看起来像:
#Setup NIC#
dev.ixl.1.iflib.override_qs_enable="1"
dev.ixl.1.iflib.override_nrxqs="16"
dev.ixl.1.iflib.override_ntxqs="16"
/boot/defaults/loader.conf
包括/boot/loader.conf
使用loader_conf_files
,所以我的引导文件应该正在运行。但是当我重新启动并使用查看变量时sysctl
,这些变量是默认值 (0),当我查看时dmesg
,设备未按照我想要的方式设置(仍然显示 8 个 RX 和 8 个 TX 队列)。
可能 /boot/loader.conf 没有被调用;也许ethtool
在 FreeBSD 上替换命令只是一个糟糕的方法。
我还尝试使用(也保存在文件中)设置变量kenv
,但似乎选项在重新启动后不会保存。
经过几天的研究,我发现我可能必须使用 来设置新的/编辑我的 NIC 的旧 VF iovctl
。当我调用时iovctl -S -d ixl1
,有一个参数num-queues
。有人有这种配置的经验吗?
问题出在加载程序上 - GRUB 中的加载程序设置错误。不过,如果您正在寻求有关使用相同驱动程序设置多个 RX/TX 队列的帮助,下面的答案是一组非常好的信息。
答案1
看如何使 kern.ipc.somaxconn 的设置持久化?
删除引号“
dev.ixl.1.iflib.override_qs_enable=1
dev.ixl.1.iflib.override_nrxqs=16
dev.ixl.1.iflib.override_ntxqs=16
用/etc/rc.d/sysctl start
或进行测试service sysctl restart
更新:
在 FreeBSD 的早期版本中,您通常会设置hw.ixl.max_queues
.但 ixl 驱动程序似乎已更改为在 FreeBSD 12 中使用 iflib。
当sysctl -d dev.ixl
我们确实可以确认驱动程序正在使用iflib
dev.ixl.1.iflib.override_qs_enable: permit #txq != #rxq
dev.ixl.1.iflib.override_nrxqs: # of rxqs to use, 0 => use default #
dev.ixl.1.iflib.override_ntxqs: # of txqs to use, 0 => use default #
网络搜索证实了这一点,因为我们可以找到将其添加到驱动程序的差异(rS335338:ixl(4):更新以使用 iflib)。
当前设置为默认设置:
dev.ixl.1.iflib.override_qs_enable: 0
dev.ixl.1.iflib.override_nrxqs: 0
dev.ixl.1.iflib.override_ntxqs: 0
这应该将队列数量设置为核心数量(在本例中为 8)。这iflib手册页指出必须设置这些前加载驱动程序。 Sysctl restart 将无法帮助我们——只能重新启动。
然后我们必须设置/boot/loader.conf
:
dev.ixl.1.iflib.override_qs_enable=1
dev.ixl.1.iflib.override_nrxqs=16
dev.ixl.1.iflib.override_ntxqs=16
设置此选项后,您应该重新启动并使用dmesg | grep ^ixl
和进行验证sysctl dev.ixl.1.iflib
。
您当前的输出dmesg
是:
ixl0: pxm cpus: 8 queue msgs: 128 admincnt: 1
ixl0: using 8 rx queues 8 tx queues
ixl1: pxm cpus: 8 queue msgs: 128 admincnt: 1
ixl1: using 8 rx queues 8 tx queues
您声称您以前已经做过所有这些工作,但没有效果。
如果我们在错误报告中查找Bug 230465 - ixl:无法在网络映射模式下工作不过我们确实得到了确认杰夫·皮珀。查尔斯·贡萨尔维斯进一步证实这对他有用。
这是 FreeBSD 中一种相当典型的设置方式,并且通常有效。一如既往的它可以是一个越野车司机,但根据上述确认,我认为不是。我没有 ixl 卡,因此很遗憾我无法确认任何事情。
你kenv
也提到了。和杰夫·皮珀确实确认可以设置。但请注意,您只能kenv
在使用驱动程序模块时使用,而不能在内核中使用静态驱动程序!
因此,根据上面的内容,我会声称它“ShouldWork(tm)”,并loader.conf
在 FreeBSD 12(或更高版本)中的内核驱动程序中进行设置。它提醒您几乎总是添加uname -a
任何与 FreeBSD 相关的问题