高性能网络 SIG(Special Interest Group) :在云计算时代,软硬件高速发展,云原生、微服务等新的应用形态兴起,让更多的数据在进程之间流动,而网络则成为了这些数据流的载体,在整个云时代扮演者前所未有的重要角色。在这个万物互联的时代,云上的网络通信效率对各种服务至关重要,高性能网络兴趣组致力于利用 XDP、RDMA、VIRTIO 等新高效通信技术,结合软硬件一体化的思想,打造高性能网络协议栈,提升云计算时代数据中心应用的网络的性能。
01 本月 SIG 整体进展
本月高性能网络 SIG 的主要工作聚焦在 Anolis OS 内核网络、SMC 和 virtio 上。
本月关键进展:
- SIG 成员 Xuan Zhuo 成为上游 Linux kernel 社区 virtio core/virtio-net 子系统的 reviewer。Xuan Zhuo 过去三年在 virtio 社区的投入得到了广泛的认可。
- SIG 本月完成了上游 virtio-net 对 XDP socket 零拷贝的支持,可以大幅提升 virtio 下 XDP socket 的发包性能。该特性在龙蜥的 ANCK 内核上已经支持了一年多的时间,现在,我们将该特性贡献到 Linux 上游社区,目前社区已完成 virtio-net XDP 重构部分的 review,预计 5.8 窗口期后合入。
02 ANCK 内核网络
本月网络方向新增安全漏洞修复:CVE-2023-1074 (SCTP 相关)。
03 高性能网络协议栈 SMC
本月高性能网络 SIG 在 SMC 领域的工作,主要聚焦在推动本机高性能通信,以及基于 eBPF 的策略替换两个方案在 Linux 上游社区的讨论。
本机高性能通信方案
本机的 loopback 和容器间(跨 netns)通信已经是一种常见的数据路径,在数据处理和云原生场景有着非常广泛的使用。例如云原生场景下,service mesh 通过 proxy 进程与业务进程、sidecar 进行通信。SMC 提供了本机(loopback 和容器间)的高性能通信方案,对比传统的用户态 IPC、以及内核的 TCP loopback 或者 UNIX domain socket 等方案,除了性能具有优势之外(详细数据可参考 LWN 链接),同时对于应用透明无侵入、无修改。
在之前版本的 review 中,社区给出了一些积极的反馈:s390 PCI maintainer Niklas 认可了使用 64bit 随机 GID + 64 bit token 组成的 loopback 协商流程。从概率上看,要达到 10^(-15) 的冲突概率,需要尝试 8.2×10^11 次,因此随机 GID 可以接受。我们与 IBM 的协议所有者 Jerry 进行了充分的沟通,接下来等待社区讨论完成并确定最终的方案。
本月 SIG 发送了 SMC loopback 的方案 v5 版本至 Linux 上游社区,新版本中增加 SEID 的选择逻辑,修复 unregister_dmb 的潜在问题,修复在 s390 架构下运行异常的问题。
基于 eBPF 策略替换方案
SMC 提供了动态回退 TCP 的能力,当前的回退策略的决策因素主要是由 RDMA / ISM 连接建立是否成功。由于 SMC 短链接性能不如 TCP,为了让 SMC 更加通用,因此计划给 SMC 增加基于策略的回退 TCP 的能力,帮助 SMC 更好的适配不同应用模型和场景。
本月发送了 RFC 和正式的替换补丁到 Linux bpf 和 net 社区,得到了 eBPF maintainer 的反馈,包括一些模块符号到处、文件名等问题,我们正在修改并继续推动 SMC 和 bpf 社区接受方案。
04 virtio
社区影响力
本月高性能网络 SIG 成员 Xuan Zhuo 成为 linux kernel 社区 virtio core/virtio-net 子系统的 reviewer。Xuan Zhuo 过去三年在 virtio 社区的投入得到了社区的广泛认可。
本月 SIG 还修复一个 virtio net 的在 xdp 场景下的 bug:[PATCH net] virtio_net: bugfix overflow inside xdp_linearize_page() - Xuan Zhuo。
virtio-net 支持 AF_XDP zerocopy
AF_XDP 是一个 bypass 内核协议栈的新收发包框架。它可以把驱动的收包直接传递到用户态, 也可以把包直接从用户态传递到驱动发送出去。它的性能相比于内核的 UDP 协议栈可以提升 3-7 倍 PPS。但是它依赖驱动进行 zerocopy 的支持。这个工作分成几个部分:
- virtio core 支持 DMA premapped
这部分是让 virtio core 框架支持提交 DMA address 操作。目前的实现中所有的 DMA 操作都在 virito core 里面完成,我们要让驱动支持传递 DMA address 给 virtio core,因为 AF_XDP 会提前完成所有的地址的 DMA 操作以及一些 virtqueue reset 相关的操作。
这部分涉及到了 virtio 的 DMA 相关的 API 使用问题。由于 virtio 在一些场景下不能使用 DMA API,我们希望 DMA API 或 AF_XDP 可以支持 virtio 这一场景。这引发了相对广泛的讨论,目前的结论是:
- AF_XDP 在未来可能会转向使用 dma-bufs 来处理 DMA API。
- DMA API 不支持 virtio 这样的特殊场景。
这些因素导致我们的推进工作陷入了非常大的困难。经过考虑与讨论, 我们考虑暂时不支持 virtio 没有 VIRTIO_F_ACCESS_PLATFORM 的场景,这通常出现在一些旧的 virtio 设备上。
- virtio-net XDP 重构
这部分已经完成 review,将会在 5.8 窗口期之后再提交一个版本。
virtio-net inner header hash
隧道协议有时会将不同流的数据包封装成外头部五元组相同的数据流,这些数据流会被散列到相同的接收队列,进而损失 RSS 的性能。为了让 virtio 对隧道协议支持内头部哈希,高性能网络 SIG 发起了 virtio_net: support inner header hash 的提案,希望将其在 virtio 中标准化下来。
本月 v12->v13 和 virtio 社区讨论了之前 inner header hash 的设计把设备侧支持的隧道类型放置在 PCI device-specific 的配置空间的问题,这种设计的优点是作为设备常驻能力可以在初始化时只被驱动读取一次,但是随着 virtio 现在越来越多新特性的增加,让设备特定的配置空间越来越臃肿对一些 tiny 设备是十分不友好的,因此讨论之后将从设备配置空间移到 control queue(新方法的缺点是每次用户的 GET 查询都会返回 configured 和 supported 两种字段,但是可接受的)。
另外,inner header hash 支持的隧道类型的数量社区仍在质疑,社区更加倾向于对 legacy 协议的支持,以让 legacy 协议享受到熵增加带来的 rss 性能提升,例如 GRE-2784 等,但是我们想支持更多的 modern 隧道协议,例如 VXLAN/GENEVE 等,以让这些协议可以基于内头部来做对称哈希,在某些场景下获取到 less locking,warm cache 等性能提升,这块仍需讨论。
以上为 4 月高性能网络 SIG 月度动态,欢迎大家加入共建(入群方式见文末)。更多 SIG 动态前往龙蜥官网获取:
相关链接:
高性能网络 SIG 主页:
https://openanolis.cn/sig/high-perf-network
—— 完 ——
加入龙蜥社群
加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;加入钉钉群:扫描下方钉钉群二维码。