在设置绑定接口之前,管理 NIC 环形缓冲区大小的 systemd 原生方法是什么?

在设置绑定接口之前,管理 NIC 环形缓冲区大小的 systemd 原生方法是什么?

使用 ethtool 管理 NIC 环形缓冲区大小很简单,例如:

ethtool -G eth0 rx 4096 tx 4096

(或者替换eth0为您需要管理的任何界面。)

现场做这件事很容易。

问题是,当您在属于绑定接口一部分的每个从属接口上执行此操作时,您会弄乱绑定。 (在许多情况下,聚合器 ID 之后将不会像之前那样匹配。) 编辑:我了解到这不是预期的行为。 (当我了解更多有关我观察到的案例中发生这种情况的原因时,我可能会进行更新。)

在 RHEL 7 中,您可以通过将值设置ETHTOOL_OPTS/etc/sysconfig/network-scripts/ifcfg-eth0(例如)ETHTOOL_OPTS="-G ${DEVICE} rx 4096 tx 4096"(根据访问红帽文章)。 (警告:我还没有测试过这实际上可以避免上面提到的聚合器 ID 不匹配。)

然而,对于 Ubuntu 18.04 来说,没有这样明显容易查找的地方。

我深入研究了 netplan 文档、systemd 网络文档和 networkd-dispatcher。

我的一位同事提出了一个使用网络调度程序的解决方案似乎工作,但尚不清楚是否仍然可能涉及竞争条件,以便它只能发生去工作,而不是成为保证在设置接口绑定之前设置环形缓冲区大小。我将在下面发布(稍后),但我不知道这是否是正确的答案。 (此外,任何 systemd 文档中都没有提及。)

所以问题是:

在绑定这些接口之前,在启动时管理以太网接口环形缓冲区大小的 systemd 本机方法是什么?

答案1

以下是适用于 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,它会在启动过程的早期生效。

答案2

systemd 设置参数的本机方法是使用文件.link(请参阅systemd.link 联机帮助页,但是目前还没有办法设置环形缓冲区参数。所以据我所知,没有一种原生的 systemd 方法可以做到这一点。当新的 systemd 出现时,这将会改变通配符的功能请求RxBufferSize与和选项一起发布TxBufferSize

如果您实际上要使用/etc/network/interfaces配置,那么只需pre-up在那里使用命令即可。这将是我的偏好,而不是为 systemd-networkd 烦恼。

您可以设置一些 udev 规则以在设备出现时匹配该设备,并在那里运行 ethtool。这应该在 systemd 获知有关设备的信息之前运行(并且在它对设备执行任何操作之前)。

您可以设置一个 systemd 服务(输入 oneshot,只需执行 ethtool),在任何服务设置您的绑定设备之前以及设备显示之后运行,并使用它。 systemd.device为以太网设备制作单元;用于systemctl list-units | grep sys-subsystem-net找到合适的服务(这样您就可以让您的服务成为“想要”/“之后”)。

相关内容