编者按:当前内核网络协议栈有什么问题?新的协议栈是不是重新发明轮子?一个协议栈能否解决所有问题?适配所有场景?本文整理自 2022 年阿里巴巴开源开放周技术演讲,这里我们将自己的思考分享出来,和大家一起交流。
本文主要分为三部分:第一部分是我们为什么需要一个新的内核网络协议栈,我们是不是在重复发明轮子?第二部分是 SMC + ERDMA 的原理、优劣等等,快速为大家了解 SMC 技术。第三部分是 SMC-R 在网易 Curve 分布式系统的实践。
一、我们为什么需要一个新的内核网络协议栈?
当前内核网络协议栈有什么问题?新的协议栈是不是重新发明轮子?一个协议栈能否解决所有问题?适配所有场景?这里我们将自己的思考分享出来,和大家一起交流。
首先我想要抛出一个观点,没有一个网络栈是万能的,之于此没有银弹。要谈现状,离不开背景:
- 第一是 100G/400G 网络的普及,此时 CPU 是瓶颈。
- 第二是云、规模,当前越来越多的业务迁移到云上,云上支持传统 RDMA 网卡成本很高。
- 第三是 DPU,硬件卸载,承接第一点,CPU 成为瓶颈后,是否可以让网络栈将越来越多的逻辑卸载到网卡和 DPU 上,让 CPU 做更多更重要的事情。
我们如何平衡吞吐和时延?或者说如何用最少的 CPU 达到相同的吞吐,如何尽可能地降低时延。首先 Linux 内核的网络栈倾向于吞吐,而不是时延。提升吞吐很重的一点是,降低拷贝的开销。在大包吞吐的场景,我们很容易看到拷贝占据了 CPU 的绝大部分时间。而且内核网络栈的 context switch 开销,拷贝开销也会增加额外的时延。
那么这个问题变成了选择在内核态还是用户态实现一个网络栈?我想很多应用,或者说云上 99% 以上的应用使用的是 socket 接口,如果侵入性改造,对于用户态方案最大的壁垒。比如 DPDK 等,此时不仅仅是改造成本,也包括了运维成本、部署成本等等。当然用户态也可以劫持 socket 实现用户态协议栈,但此时 zero copy 等优势不在。并且同样需要改造,此处的改造是运维改造,调度改造和环境改造,这也是额外的成本。此时用户态的优势也不再显著。
软件 vs 硬件卸载?一开始 Linux 网络栈,例如 TCP 协议是从纯软件实现到越来越多的将功能卸载到网卡,甚至 TOE 完全卸载到网卡。如果提到卸载到网卡,是不是可以用一种更加成熟的硬件卸载方案?也就是 RDMA,也就是传统以太网卡 vs RDMA 网卡,部分卸载到成熟的完全卸载。RDMA 网络本身有规模的限制,我们可以在小规模把 RDMA 网络玩得很好。那是否有一种大规模 RDMA 的能力。我们现在看到的是阿里云发布的 ERDMA 网络,一种普惠、高性能、完全兼容 RDMA 的生态。我们借助 SMC + ERDMA 可以实现硬件卸载 RDMA 、大规模部署,二者相辅相成。