Networking

在 FreeBSD 12 啟動時配置 NIC

  • April 14, 2019

我們需要配置 NIC 以在 FreeBSD 12 上獲得更好的應用程序性能。系統是 FreeBSD 12.0-RELEASE-p3 GENERIC amd64

首先,我想展示我們針對 Linux 系統的解決方案。為了在我們的多隊列 NIC 上設置 16 個 RX 和 16 個 TX 隊列,我們應用 command ethtool -L ens786f1 combined 16。我們正在尋找 FreeBSD 系統的替代呼叫。

在 FreeBSD 上,我們的 NIC 由ixl驅動程序驅動。我發現了一些核心變數應該做同樣的事情override_qs_enableoverride_nrxqsoverride_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.confusing loader_conf_files,所以我的引導文件應該正在執行。但是當我重新啟動並使用查看變數時sysctl,這些變數是預設值 (0),當我查看時dmesg,設備沒有按照我想要的方式設置(仍然顯示 8 個 RX 和 8 個 TX 隊列)。

/boot/loader.conf 可能沒有被呼叫;也許ethtool在 FreeBSD 上替換命令只是不好的方法。

一些日誌pastebin.com/YGTxqxdx


我還嘗試使用(也保存在文件中)設置變數kenv,但似乎重新啟動後選項沒有保存。


經過幾天的研究,我發現我可能必須使用iovctl. 當我呼叫時iovctl -S -d ixl1,有一個參數num-queues。有沒有人有這種配置的經驗?


問題出在載入程序 - GRUB 中的載入程序設置錯誤。儘管如此,如果您正在尋求有關使用相同驅動程序設置多個 RX/TX 隊列的幫助,下面的答案是一組非常好的資訊。

請參閱如何使 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 startor測試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): Update to use 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

你聲稱你以前做過這一切都無濟於事。

如果我們查看錯誤報告中的錯誤 230465 - ixl: not working in netmap mode,我們會得到Jeff Pieper的確認。Charles Goncalves進一步證實它對他有用。

這是在 FreeBSD 中設置事物的一種相當典型的方式,並且通常有效。與往常一樣,它可能是一個錯誤的驅動程序,但經過上述​​確認,我認為不是。我沒有 ixl 卡,所以很遺憾我無法確認任何事情。

你也提到kenvJeff Pieper確實證實了這一點是可以設置的。但請注意,您只能kenv在使用驅動程序模組而不是核心中的靜態驅動程序時使用!

因此,對於上述內容,我會聲稱它是“ShouldWork(tm)”,其設置loader.conf在 FreeBSD 12(或更高版本)中的核心驅動程序中。它提醒您幾乎總是添加uname -a任何與 FreeBSD 相關的問題😉。

絕望的時代 - 絕望的措施

你也舉報了dev.ixl.1.iflib.driver_version: 2.1.0-k。我假設這是驅動程序的靜態核心版本。根據ixl手冊頁,英特爾的上游驅動程序更新更頻繁,並在net/intel-ixl-kmod中提供。

如果您想走這條路 - 請確保您已填充/usr/src並擁有最新的樹。沒有可用的預建構包。

要安裝 kmod 驅動程序:

cd /usr/ports/net/intel-ixl-kmod/ && make install clean

確保/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
if_ixl_updated_load="YES"

重新啟動並查看 dmesg 和 sysctl 中的效果。

使用此模組化驅動程序時,您還可以使用 Jeff Pieper 描述的動態kenv設置環境kldunload使用和解除安裝和載入驅動程序kldload

中斷風暴

我注意到你有:

hw.intr_storm_threshold: 1000

但由於它只是 10GbE 的 X710,它可能不是問題。根據ixl手冊頁,您可能會看到 40GbE 的中斷風暴。然後你會設置:

/etc/sysctl.conf:

hw.intr_storm_threshold=0

(因此對這個參數感興趣)

韌體

最後我注意到:

dev.ixl.1.fw_version: fw 5.0.40043 api 1.5 nvm 5.05 etid 80002927 oem 1.261.0

該韌體已有兩年多的歷史了。英特爾(R) 乙太網控制器 X710有6.80 版可用

簡單的方法是使用sysutils/intel-nvmupdate。可以作為二進制包快速安裝(無需建構)。

引用自:https://unix.stackexchange.com/questions/510543