Linux 7.0 网络变动:WiFi 8 落地,单流 CPU 占用降低 30%
就在前两天,Linux 网络子系统的维护者 Paolo Abeni 给 Linus Torvalds 发去了一封包含大量更新的邮件。这封邮件的内容是关于 Linux 7.0 版本的网络子系统代码合并请求。
我仔细看了这封发在 linux-kernel 邮件列表中的说明,这次的更新量非常大,而且涉及到底层的性能优化非常“硬核”。
根据 Paolo Abeni 提交的描述,这次核心协议栈有一个极其明显的性能提升。开发团队在内存管理上动了刀子,加入了对大于 4KB 的接收缓冲区的支持。这个改动配合硬件层的 GRO 功能,能让数据包在穿越协议栈时减少缓冲区的数量。
根据邮件中的数据,这种优化能让单流的 CPU 占用率降低大约 30%。对于高吞吐的服务器来说,这相当于白捡了算力。
在代码编译层面,开发团队也做了一轮大扫除。他们花了很大力气去引导编译器在内联代码时做出更正确的选择。这么做的目的是为了避免在快速路径中调用不必要的辅助函数,减少栈保护带来的开销。
结果就是生成的代码跑得更快了,而且代码体积几乎没怎么增加,甚至在某些情况下,内联后的代码比原来调用的函数代码还要少。
传输层协议也有几个值得关注的点。AccECN 的实现现在已经功能完备了,并且允许用户空间按网络命名空间来开启,这给了容器环境更大的灵活性。另外,Big TCP 的 GSO 数据包现在不再添加 HBH头部。
去掉这个头部简化了接收和发送路径,网卡驱动处理起来也更省事。当然,这也是因为现在的用户空间工具已经能够正确识别这种没有 HBH 提示的数据包了。
对于经常做流量控制的朋友,sch_cake 调度器现在支持多队列了。现在它可以跨多个 CPU 扩展速率整形,同时还能保持接口上的全局单一速率限制。
在系统运维方面,Netconsole引入了 nbcon 基础架构。简单说就是一种基于优先级且无锁的控制台操作,在系统崩溃这种极端场景下会更安全。
而且 Netconsole 现在支持自动目标恢复,底层接口上线后它能自己重新建立连接,不用人工干预。
还有一个比较有意思的改动是 vsock 增加了命名空间支持。这意味着在不同的网络命名空间里,vsock 可以完全隔离,这对于虚拟化和容器安全是个好消息。
接下来看看硬件驱动方面的变化,这也是很多人关心的。
无线网络方面有一个重磅消息:Linux 7.0 开始初步支持 WiFi 8。虽然现在只是 cfg80211/mac80211 层面的初步支持,但这意味着下一代无线标准已经开始在 Linux 内核中铺路了。
在有线网卡驱动方面,华为提交了 hinic3 PF 以太网驱动。另外,老旧的并口以太网驱动在这一版中被彻底移除了,时代的眼泪又少了一个。
Nvidia 的 Mellanox (mlx5) 驱动也有不错的优化。他们使用静态内存区域来存储硬件 GRO 的头部信息,这个改动直接带来了 12% 的接收吞吐量提升。Broadcom 的 bnxt 驱动增加了固件接口更新,支持 FEC 统计直方图。
Intel 的 ice 驱动则重新组织了发送和接收环的布局,以优化缓存行的局部性,并引入了同步以太网的支持。
对于嵌入式和消费级硬件,RealTek 的 r8169 驱动增加了对 RTL8127ATF(10G 光纤 SFP)的支持。蓝牙子系统方面,btusb 驱动新增了对 MediaTek7920、Realtek RTL8761BU 和 8851BE 的支持。
Paolo Abeni 在邮件最后表示,虽然为了 netconsole 修改了一些 printk 的代码,但他目前没有发现与其他代码树有冲突。
这次 Linux 7.0 的网络更新,给我的感觉是更注重实打实的性能压榨,特别是在 4KB+ 缓冲区和编译器优化这块,可能会对未来的发行版性能产生直接影响。
信息来源:
- • https://lore.kernel.org/lkml/20260211173015.327542-1-pabeni@redhat.com/