关注了就能看到更多这么棒的文章哦~
Auto-tuning the kernel
By Daroc Alden
December 11, 2024
Gemini-1.5-flash translation
https://lwn.net/Articles/998576/
Linux 内核(Linux kernel)拥有许多可调参数(tunable parameters)。尽管网络上充斥着大量关于如何设置这些参数的建议,但很少有人有时间去研究这些常常相互矛盾的解释并选择合适的值。解决这个问题的一种方法是bpftune项目,这是一个使用 BPF(Berkeley Packet Filter)跟踪运行系统各种指标并相应调整 sysctl 参数的程序。该程序由 Oracle 开发,并以 GPLv2 许可证发布。目前,bpftune 主要集中于优化网络设置,但作者希望该系统足够灵活,可以扩展到涵盖其他设置。
bpftune 围绕着被称为“调谐器”(tuners)的动态链接模块库构建。每个调谐器处理一组不同的 sysctl 设置。它们通过对从 bpftune 安装在内核中的各种性能钩子(performance hooks)通过BPF环形缓冲区(BPF ring buffer)发送的性能数据做出反应来实现这一点。该项目已有八个现有的调谐器,但其结构使得为新的用例添加更多调谐器相当容易。可用的调谐器包括:
ip_frag,管理 IP 分片设置;
net_buffer,管理非 TCP 缓冲区大小;
route_table,管理路由设置;
tcp_buffer,管理 TCP 缓冲区大小;
neigh_table,管理邻居(ARP)表;
netns,管理网络命名空间;
tcp_conn,为每个连接选择 TCP 拥塞控制算法;
sysctl,对 sysctl 设置的更改做出反应。
bpftune 只有针对 Oracle Linux 的官方软件包,尽管有一个Arch用户存储库软件包。为了自己尝试 bpftune,我不得不从源代码编译——这是一个相对轻松的过程。唯一的问题是我不得不调整一个头文件才能从自定义位置加载调谐器,因为我的根分区是只读的。bpftune 需要 v5.6 或更新的内核,以便使用带有 BPF 类型格式(BTF)调试信息的 BPF 环形缓冲区。
启动后,bpftune 向我保证它已成功加载,并且能够支持我的系统上的网络命名空间——除了 route_table 调谐器未能加载之外。一旦运行,它几乎立即将我的 net.ipv4.tcp_rmem
设置增加了 25%。几分钟后,它又增加了 25%,然后在大约 15 分钟后又增加了两次。该设置控制 TCP 接收缓冲区的最小、默认和最大大小。使用更大的缓冲区使计算机能够一次接收更多数据,并避免丢包,但代价是使用更多内存。除了认为我的 TCP 接收缓冲区太小之外,bpftune 对我的配置很满意,没有做任何其他调整。
我可能在高负载服务器(heavily-loaded server)而不是相对安静的笔记本电脑上会看到更显著的结果。然而,一个特定的调谐器——TCP 连接调谐器——没有出现在日志中。它可以被设置为在选择特定的 TCP 拥塞控制算法时记录日志,但这会导致极其嘈杂的日志。相反,调谐器在程序退出时打印它做出决定的次数的摘要。该调谐器为计算机连接到的每个远程主机选择 TCP 拥塞控制算法,以最大限度地减少延迟并最大限度地提高吞吐量。Alan Maguire,该项目的主要维护者,撰写了一篇文章描述了该调谐器的设计。
简而言之,连接调谐器使用强化学习(reinforcement learning)来确定哪种拥塞控制算法在实践中表现最佳。由于网络状况会随时间变化,它会偶尔随机选择不同的算法,以查看其性能是否更好。根据 Maguire 的性能测量结果,使用 bpftune 选择最佳拥塞控制算法在完美的网络条件下会带来(轻微的)性能开销,但在存在非零丢包量时,可以提供显著的改进。由于我们很少能享受到拥有完美网络的奢侈,这可能是一个可以接受的权衡。
由于 bpftune 是一个旨在简化 Linux 系统配置的项目,因此它提供的配置选项不多。它提供的一个选项是学习率(learning rate)(即,尝试不同算法的频率)的配置,用于使用强化学习的模块。但是,文档建议默认值通常就足够了。还可以选择使用哪些调谐器——尽管理论上启用所有调谐器也没有什么坏处。
bpftune 在设置和忘记方面做得很好。当调谐器更改配置设置时,它会记录有关更改内容和原因的信息,以便管理员更容易进行故障排除。该程序还会自动检测管理员何时设置配置值,并停止尝试管理该特定配置部分——因此管理员也不应该发现自己与程序对抗。文档没有明确说明这是否也适用于在系统的 sysctl.conf
文件中配置的设置。
此外,bpftune 可以附加到特定的控制组(control group),以便将可能受配置设置影响的进程与不应该受影响的进程隔离开来。尽管如此,任何偶尔在没有人为监督的情况下更改配置设置的工具最终都会出错。在我短暂的实验中,这没有造成任何问题,但最好还是避免在一致性和可靠性比吞吐量更重要的服务器上使用 bpftune。
bpftune 似乎可能是一个有用的工具,但目前它的适用性相当有限。Linux 内核有数千个配置选项,但目前 bpftune 只处理其中的一小部分——这不可避免地是由于该项目只有四个贡献者,并且只存在了一年多一点的结果。如果 bpftune 获得了普及,并且 Linux 社区的成员为非网络相关的设置贡献了调谐器,它最终可能会变得更广泛地适用。
然而,并非每个人都会乐于为该项目做出贡献,因为这样做需要同意Oracle贡献者协议(Oracle Contributor Agreement)。其中,这允许 Oracle 将其自己的用途再许可贡献。该公司承诺除了任何自身用途外,还将以 FSF 或 OSI 批准的许可证提供贡献。bpftune 的架构也使得可以独立于项目本身开发和分发兼容的调谐器——但这增加了最终用户的复杂性。
无论如何,对于那些管理大量 Linux 服务器并希望获得更高性能网络的人来说,bpftune 可能已经是不错的选择。或者,对于那些想要一个简单的工具来添加到其现有服务器以提高性能,而无需学习 Linux 网络配置的来龙去脉的人来说,这也是一种选择。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
欢迎分享、转载及基于现有协议再创作~
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~