写点什么

高性能网络 SIG 双月度动态: 三年磨一剑,virtio-net AF_XDP 完成 Linux 主线零拷贝支持

  • 2025-01-26
    陕西
  • 本文字数:2486 字

    阅读完需:约 8 分钟

2024 年度总结

2024 年我们继续在 virtio-net 和 SMC 上做了大量优化和增强,提升了 virito-net 和 SMC 的可靠性、可用性和性能,包括但不限于以下特性及增强:

  • 经过 3 年努力,完成了 virtio-net AF_XDP 零拷贝的支持和上游化,为此完成 2 个 virtio spec 改动,累计上游贡献超 120+ 个补丁;

  • 完成 SMC IPPROTO_SMC 协议支持和上游化,并在此基础上提出基于 eBPF 的 TCP 透明替换方案,支持基于 IP、端口、进程等各种维度的替换策略;

  • 完成 SMC loopback-ism 设备支持和上游化,为此完成 SMCv2.1 Emulated-ISM 特性支持,进入 SMCv2.1 release 4 白皮书;

  • 完成 virtio-net NetDIM 能力支持和上游化,配合硬件中断聚合能力可以提升一些典型应用如 redis 场景下最高 15% 的性能;

  • 完成 virtio XDP csum 优化、virtio RSS context、设备统计信息、control vq timeout、队列重置能力等多个特性的支持或上游化,并推动 virtio flow director 提案进入 virtio 规范;

  • 完成 SMC 共享内存数量监控的支持和上游化,完成内存水位等特性的支持;

除此之外,SIG 组修复了大量的龙蜥内核的 bug 和 CVE,其中 CVE 191 个。 同时,SIG 组深度参与上游合作,积极活跃在 SMC、virtio-net、eBPF 等社区,为 Linux 开源社区演进贡献力量。

整体进展

本次双月报总结了 SIG 在 11 月和 12 月的工作进展,工作聚焦在实现 virtio-net 对 AF_XDP 零拷贝的支持和 RSS 功能的完善,推进 SMC 基于 eBPF 透明替换特性合入上游,以及修复 ANCK 网络安全和稳定性问题。

本月关键进展:

  1. 经过 3 年努力,终于完成了 virtio-net AF_XDP 零拷贝的上优化,这使得上游 virtio-net 驱动能够利用 AF_XDP 获得较内核 UDP 在数据包处理性能(PPS)上 3~7 倍的提升;

  2. 进一步在上游社区推进 SMC 基于 eBPF 灵活替换 TCP 的特性,弥补现有替换手段的不足,提升 SMC 易用性;

  3. 修复 ANCK 通用内核网络的多个安全及稳定性问题;

ANCK 通用内核网络协议栈

特性

ANCK 5.10 内核新增如下特性,已随 018 版本发布:

  • 为 bond 3ad 模式新增了 200G 和 400G 速率支持。(PR3992)

修复

ANCK 5.10 内核修复了若干稳定性问题。

以下问题已随 018 版本发布:

  • 修复 qdisc 潜在的 UAF 问题。(PR4094,PR4095)

以下问题预计随 019 版本发布:

  • 优化 erspan_opt 的初始化逻辑。(PR4352)

  • 修复一处 sockmap 的删除逻辑错误。(PR4353)

  • 修正 tbf 的统计计数逻辑。(PR4354)

  • 修正了 netem 的 qlen 计数逻辑,避免发包异常。(PR4358)

安全

ANCK 5.10 修复了如下 CVE,预计随 019 版本发布:

  • CVE-2024-26808(PR4350)

SMC

双月 SIG 在 SMC 上的工作主要集中在推进 eBPF 透明替换方案合入上游社区,以及稳定性修复上。

eBPF 透明替换

上游 SMC 仅提供了 smc_run 这一进程维度透明替换 TCP 的功能,但这种方式存在静态链接程序不可用以及替换维度单一的问题。SIG 向上游提交的基于 eBPF 的灵活替换方案[1]目前在 BPF 社区评审中,支持在容器隔离的多种维度下进行透明替换和基于 IP/端口等策略快速回退的能力。

[1] [PATCH bpf-next v3 0/5] net/smc: Introduce smc_ops

内存水位限制

SMC 使用共享内存完成通信,在追求大吞吐时会产生较大的内存开销。SIG 提出一种内存水位限制方案[1],提供整机或 net namespace 维度共享内存水位配置的功能。当共享内存用量超过水位时将触发新连接回退到 TCP。目前已进入龙蜥 5.10 内核。

[1] net/smc: Introduce smc_mem to limit memory usage

稳定性问题修复

修复 SMC 在竞争下 link refcnt use-after-free 和 __flush_work 警告的问题[1],修复 CLC 握手过程中潜在的非法内存访问和永久阻塞问题[2]。上述补丁集均已被上游社区采纳并回合到龙蜥社区 5.10 内核。

[1] [PATCH net v2 0/2] two fixes for SMC

[2] [PATCH net v2 0/6] several fixes for smc

virtio

双月 SIG 在 virtio 上的工作主要聚焦在上游和 ANCK 内核中 RSS 功能完善以及实现 virtio-net 对 AF_XDP 零拷贝的支持。

RSS 功能完善

virtio-net 的 RSS 配置存在与后端不统一的问题,队列数量配置也存在风险,用户修改相关参数时可能导致非预期的网络表现。为此 SIG 向上游 Linux 内核提交补丁[1]以解决上述问题,目前已合入。相关内核补丁也已回合至 ANCK 内核[2],从 5.10.134-18 版本开始支持。

[1] [PATCH net 0/4] virtio_net: Make RSS interact properly with queue number

[2] [5.10][fix] virtio_net: rss out of sync with backend

virtio-net 支持 AF_XDP 零拷贝

这是我们高性能网络兴趣小组在推动 Linux upstream 工作中的一项重要成就。AF_XDP 是一种新的绕过内核的收发包框架,它基于 XDP 技术,在驱动接收到数据包后,能够直接将用户关注的数据包传递到用户态,用户态可以进一步将数据包从用户空间传送至驱动,直接发送出去。与传统的内核级 UDP PPS 相比,AF_XDP 的性能提升可达到 3-7 倍。然而,AF_XDP 需要驱动具备 零拷贝 支持才能发挥其优势。


经过我们 SIG 多年的不懈努力,随着最后一组补丁集[1]的合并,virtio-net 对 AF_XDP 的支持终于完成。

为实现这一目标,最终合入的补丁数量达到了 120 多个,而在社区沟通过程中放弃的补丁数更是远超这个数字。经过长时间的坚持与努力,我们终于达成了这一重要目标,兑现了我们的承诺。


值得一提的是,更早之前,virtio-spec 社区中的 vq-reset 特性[2]也是为了实现这一功能而引入的。因此,为了这一目标,我们在 virtio-spec、QEMU 和 Linux kernel 等多个层面作出了极大的努力,并且在过程中遇到了无数的挑战。尽管如此,我们从未放弃,经过三年多的持续推进,终于克服了所有困难,完成了这一工作。在此,要特别感谢社区 Jason Wang 对本项工作的持续支持。


事实上 AF_XDP 零拷贝功能 3 年前就已经在 ANCK 实现了支持,并基于 ExpressUDP[3] 在阿里巴巴大规模落地,推动此项工作的上游化一方面降低 ANCK 的维护成本,另一方面也通过贡献社区共同进步。本次合入 Linux 主线的补丁,我们也将会回合到 ANCK-6.6 ,保持和上游实现的统一。


[1] [PATCH net-next v4 00/13] virtio-net: support AF_XDP zero copy (tx)

[2] https://groups.oasis-open.org/higherlogic/ws/public/ballot?id=3700

[3] OpenAnolis Express UDP

发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2021-07-20 加入

OpenAnolis龙蜥社区 由国内外头部企业联合建立的操作系统开源社区。加入我们,一起打造面向未来的开源操作系统。 社区官网:openanolis.cn|微信公众号:OpenAnolis龙蜥

评论

发布
暂无评论
高性能网络SIG双月度动态: 三年磨一剑,virtio-net AF_XDP 完成 Linux 主线零拷贝支持_操作系统_OpenAnolis小助手_InfoQ写作社区