在 FreeBSD 12 啟動時配置 NIC
我們需要配置 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_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
usingloader_conf_files
,所以我的引導文件應該正在執行。但是當我重新啟動並使用查看變數時sysctl
,這些變數是預設值 (0),當我查看時dmesg
,設備沒有按照我想要的方式設置(仍然顯示 8 個 RX 和 8 個 TX 隊列)。/boot/loader.conf 可能沒有被呼叫;也許
ethtool
在 FreeBSD 上替換命令只是不好的方法。我還嘗試使用(也保存在文件中)設置變數
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 start
or測試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 卡,所以很遺憾我無法確認任何事情。
你也提到
kenv
。Jeff 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。可以作為二進制包快速安裝(無需建構)。