在設置綁定介面之前,管理 NIC 環形緩衝區大小的 systemd-native 方法是什麼?
使用 ethtool 管理 NIC 環形緩衝區大小很簡單,例如:
ethtool -G eth0 rx 4096 tx 4096
(或替換
eth0
為您需要管理的任何界面。)現場直播很容易。
麻煩的是,當您在屬於綁定介面的每個從屬介面上執行此操作時,您會弄亂綁定。(聚合器 ID 在許多情況下不會像以前那樣匹配。) 編輯:我了解到這不是預期的行為。(當我了解更多關於我觀察到的案例中發生這種情況的原因時,我可能會更新。)
ETHTOOL_OPTS
在 RHEL 7 中,您可以通過將值設置/etc/sysconfig/network-scripts/ifcfg-eth0
為(例如)ETHTOOL_OPTS="-G ${DEVICE} rx 4096 tx 4096"
(根據訪問 Red Hat 文章)來設置在引導時出現的環形緩衝區大小。(警告:我沒有測試過這實際上避免了上面提到的聚合器 ID 不匹配。)但是,對於 Ubuntu 18.04,沒有這麼明顯的容易查看的地方。
我已經深入研究了 netplan 文件、systemd 網路文件和 networkd-dispatcher。
我的一位同事提出了一個使用 networkd-dispatcher 的解決方案,該解決方案似乎可行,但尚不清楚是否可能仍然涉及競爭條件,因此它只是碰巧起作用,而不是保證在介面綁定建立。我將在下面發布(稍後),但我不知道這是否是正確的答案。(此外,任何 systemd 文件中都沒有提到它。)
所以問題是:
在綁定這些介面之前,在啟動時管理乙太網介面的環形緩衝區大小的 systemd 本機方法是什麼?
設置參數的 systemd 本機方法是使用
.link
文件(請參閱systemd.link 手冊頁,但是它目前沒有設置環形緩衝區參數的方法。所以 AFAIK 沒有本機 systemd 方法可以做到這一點。這個當帶有萬用字元功能請求RxBufferSize
的新 systemd 與和TxBufferSize
選項一起發佈時,將發生變化。如果您實際上是
/etc/network/interfaces
用來配置的,那麼只需在pre-up
那裡使用一個命令。這將是我的偏好,而不是打擾 systemd-networkd。您可以設置一些 udev 規則以在設備出現時匹配它,並在那裡執行 ethtool。這應該在 systemd 被告知設備之前執行(並且在它對它做任何事情之前)。
您可以設置一個 systemd 服務(鍵入 oneshot,只需 exec ethtool)在任何服務設置您的綁定設備之前和設備出現之後執行,然後使用它。systemd
.device
為乙太網設備製作單元;用於systemctl list-units | grep sys-subsystem-net
找到正確的(這樣您就可以讓您的服務成為想要/之後的服務)。
這是適用於 Ubuntu 18 的 udev 規則:
ACTION=="add|change", SUBSYSTEM=="net", KERNEL=="eth*|en*", RUN+="/sbin/ethtool -G $name rx 4096 tx 4096"
把它放進去
/etc/udev/rules.d/59-net.ring.rules
,它會在啟動過程的早期生效。