关于cpu:性能透明提升-50SMC-ERDMA-云上超大规模高性能网络协议栈

40次阅读

共计 5244 个字符,预计需要花费 14 分钟才能阅读完成。

编者按:以后内核网络协议栈有什么问题?新的协定栈是不是从新创造轮子?一个协定栈是否解决所有问题?适配所有场景?本文整顿自 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、大规模部署,二者相辅相成。

开箱即用 vs 利用革新?下面曾经提到一部分,云上 99% 的利用应用的是 socket 接口编程,TCP 进行通信。绝大部分利用不可能投入大量老本革新适配新的网络栈,其中包含开发成本,测试老本(新的协定栈可能会有各种问题),部署和运维老本(例如 DPDK 环境,额定软件包的保护)等。此时还会让利用牢牢绑定在某个网络栈之上,后续迁徙,或者遇到环境不反对的状况下,老本更高。所以咱们剖析后,得出的论断是,以后须要一个兼容 socket 接口,能够通明替换传统 TCP 利用的,硬件卸载的网络栈。利用云上大规模部署、DPU 硬件卸载、达成 100G/400G 网络的全新网络栈。

二、共享内存通信 SMC

有一点很重要,后面咱们没有探讨,也就是所谓的数据通信模型。IPC 过程间通信,TCP 也是过程间通信的一种。咱们依照第一性原理,拆分成不同的不可拆分的数据通信模型。比照这几种模型最佳实际下可能的性能数据。

常见的是基于包的通信模型,例如最典型的 TCP,TCP loopback 性能不是特地现实,然而易用性毋庸置疑。咱们之前有提到,绝大多数利用应用的是 socket 编程,其次是共享内存,这个在本机维度的 IPC 通信中,也是一种十分常见的形式。共享内存实现千差万别,然而总体来看,性能远远超过下面几种形式,然而易用性堪忧,第一是提到的实现形式不同、库不同、接口不同,和语言和运行时绑定,导致大部分共享内存的实现不具备逾越利用的普适性。

咱们疾速回顾一下共享内存通信的模型:

右边的图中,上面不同色彩的方块代表不同的内存,别离分成 sender 和 reciver 角色。首先发送方写入数据到这一块共享内存,之后通过某种形式,告诉接管方数据写到了哪里、偏移量是多少,其次接管方依照游标位置读取或者拷贝走这一块内存上的数据,之后告诉发送方,本地曾经读取实现,下次写数据能够从某某地位开始。这样一次简略的数据通信就实现,同时是 zero copy,这里是单向,如果是双向,只须要保护两个内存区域即可。那么是否有一种技术能够帮忙咱们搬运内存,让上面两个方框的内存放弃同步,从单机共享内存到远端共享内存?答案也就是之前提到的 RDMA,RDMA 自身就是远端间接内存计划的缩写。

后面 4 步咱们能够实现本地的共享内存通信,基于 RDMA,咱们的数据模型只须要一个比拟小的改变,也就是在第二步,通过 RDMA write 实现内存从本地同步到远端。这样本地和远端保护内存上的数据能够保持一致,同时通过 RDMA send 作为音讯告诉机制、告诉游标更新。同时也能够实现 zero copy 硬件卸载。

基于下面的剖析,咱们是不是能够基于共享内存同时兼容 socket,基于 RDMA 硬件卸载实现这样一个可能高性能的网络栈呢?答案是必定的,通过 SMC + ERDMA 构建云上高性能网络栈,为什么说 SMC + ERDMA 能够满足下面咱们的论断呢?首先,咱们疾速理解一下 SMC。

SMC 是 IBM 开源到 Linux 代码中,同时 IBM 也一起提出了 IETF RFC 7609,作为形容 SMC-R 协定是如何实现的。首先在上游社区中,龙蜥社区为上游奉献的补丁数排第二,其次,SMC 自身也是一种协定,Linux 下为 AF_SMC,能够间接在 socket 中制订应用,没有其余非凡的 hack 或者 tricky 的实现,和 TCP 等价。模型采纳了共享内存技术,联合 RDMA 能够实现一次拷贝,硬件卸载的性能。同时最为重要的是,SMC 自身是一种混合协定,SMC 协定自身,须要借助某种更通用的协定建设 RDMA 链接,同时还须要提供一种 fallback 回退机制,如果没有 RDMA 反对,能够通明回退到 TCP。

最初,SMC 兼容 socket,能够通明替换所有的 TCP 利用,利用无需革新,也无需配置,即可享受 SMC 带来的性能减速。通过上述个性,最大化兼顾性能和生态。SMC 能够在云上高性能和大规模部署,也离不开阿里云的 ERDMA。ERDMA 齐全兼容 RDMA 生态,兼容 verbs 接口,verbs 利用能够无需革新。同时云上的 ERDMA 具备超大规模部署的能力,解决了传统 RDMA 网络的部署难题。

SMC 应用 verbs 接口,能够在云上间接应用 ERDMA,从而实现硬件卸载,高性能的网络栈 SMC 是如何应用 RDMA 的?

SMC 首先应用 TCP 带完建连,使整个 RDMA 链路可用,此时 TCP 链接能够用于回退,任何 RDMA 的问题都能够顺利回退到 TCP,确保 SMC 链接的可用。其次 RDMA 负责整个数据的通信,在内核态是 zero copy。SMC 有一次用户态 - 内核态拷贝。RDMA 技术的另一个问题是链接的规模,特地是 RC 模式下,链接的规模不是很大。SMC 通过 linkgroup,将 N 个链接映射到 1 个或多个 RDMA QP 之上,充沛复用 QP 资源,也放慢了管制门路创立 QP 慢的问题,最重要也具备了 linkgroup 多 QP 的容灾高可用的能力。最初 SMC 反对 RoCE v1/v2,龙蜥版本还反对 ERDMA,确保 SMC 既能够应用在云上,也能够应用在数据中心外部。咱们屡次提到了 SMC 基于 TCP 链接建连,那么 SMC 是怎么做的?

首先 SMC 自身是一种混合协定,协定底层包含 TCP 和 RDMA,充分运用 TCP 通用、兼容、可达率高、RDMA 高性能的劣势。同时这一条 TCP 链接也能够帮忙 RDMA 不可用或者建连谬误后,疾速回退到 TCP 模式,对于利用齐全通明。SMC 通过 TCP SYN 包中的特定的 TCP options 标注是否反对 SMC 能力。如果反对会接下来替换 RDMA 建连所需的信息,SMC 兼容 socket 之后,是如何通明替换 TCP?

首先 AF_SMC 和 AF_INET 是在同一层级。对外裸露的接口和性能完全一致,利用能够在创立 socket 的时候间接应用 AF_SMC,与应用 TCP 时完全一致。利用不仅能够显示的制订 AF_SMC,也能够应用 smc_run 命令,疾速将 TCP 替换成 SMC,如左图所示,任何利用都能够通明革新,无需任何适配,SMC 模块也会主动载入到内核。其次反对 netns 维度的替换,反对容器场景下的减速。也反对 eBPF 的策略替换,通过 eBPF 编写规定匹配所需的利用特色,选择性的替换成 SMC。对于一些不重要,不想要占用 SMC 资源,或者不适宜 SMC 的场景,能够应用这种形式。

SMC 回退机制,也是 SMC 为什么可能替换 TCP 重要的一个个性。

上图右边能够看到,SMC 首先创立 TCP 链接,通过 TCP 的握手后,才会进行 SMC 握手。如之前所提到的是,SMC 是混合协定,在 RDMA 建连失败后,能够疾速通明的切回到 TCP。同时也提供了各种错误码,帮忙利用排查问题,例如 RDMA 网卡问题,还是资源问题等。谈了这么多 SMC 本身的个性,那么 SMC 的性能如何?上面的测试是在阿里云上 ERDMA 网卡和 SMC 比照 TCP 的性能。

例如常见的 netperf microbenchmark 有一倍以上的性能晋升。Redis 和 Netty 这种常见的根底组件有 30% 到 50% 的 QPS 晋升,时延也显著降落。NGINX 也有 40% 左右的性能晋升。这些性能晋升,都是在利用无需任何革新,通明替换成 SMC 下进行的测试。接下来咱们聊一下咱们龙蜥社区在 SMC 上所做的工作。

2021 年 11 月开始在社区亲密参加开发和稳定性工作,以后奉献共计 70 多个补丁,排在 IBM 之后为第二。首先咱们从头到尾优化了 SMC 的性能,包含短链接性能,包含吞吐和一些 syscall,CQ 中断打散等优化,最终 microbenchmark 综合性能晋升了 357%,这里是比照的 SMC 之前的版本,比照 TCP 能够参考方才的数据。其次是更多的场景反对,包含云原生、ERDMA、容器网络等等,拓宽了上游社区 SMC 的应用场景。最重要的是,极大地晋升了稳定性,咱们始终在继续看护上有社区,解决了数十个 panic 问题,彻底解决了遗留的 link 和 linkgroup 问题,同时也在继续看护 SMC。龙蜥社区咱们有 CI/CD 继续一直的测试,可能成为一个产品级别的协定栈。大家能够拜访咱们的仓库(地址见文末),应用 HPN 中咱们一直优化的 SMC 版本。

接下来咱们谈一谈 SMC 的将来。回到分享的开始,SMC 同样也不是银弹。SMC 基于 RDMA 技术,自身也有 RDMA 引入的各种各样的问题。第一是内存耗费,SMC 自身须要统一保护一块比拟大的间断内存区域,用来实现共享内存通信,内存耗费显著大于 TCP。其次是 SMC 的建连性能,还是会受制于 RDMA RC 模式的建连性能,这一块咱们会继续一直的优化,相干优化咱们会陆续推送到社区。其次是稳定性,SMC 不同于 TCP 在业界宽泛应用多年。有很多问题没有被发现,咱们以后也在借助 SMC CI/CD 帮忙咱们发现问题。

三、SMC-R 在网易 Curve 存储系统的实际

首先介绍一下 Curve。Curve 是一个开源分布式存储系统,可对接 OpenStack 平台为云主机提供高性能块存储服务,可对接 Kubernetes 为其提供长久化存储卷,可对接 PolarFS 作为云原生数据库的高性能存储底座。Curve 在性能、运维、稳定性、工程实际品质上都优于 Ceph。上面介绍 Curve 的网络通信:

通信过程为由 leader 向 follower 发动 RPC 进行数据拷贝。特点是:网络通信频繁、网络通道稳固、网络传输时延小、RPC 时延占比不低。因而咱们调研了几种网络减速选型:

其中 SMC-R 能够实现通明替换,无侵入,并且提供较好的性能。

咱们应用 SMC-R 革新了 Curve 并使能。同时扩大了黑名单、资源监控和读取速度监控等能力。

咱们应用 Curve E2E 测试,在 3 Volume 256 depth randwrite case 下,比照 TCP 晋升了 18.5% 的性能。

最初,以上为大家介绍了咱们为什么须要 SMC,SMC 的原理和性能以及 SMC 在网易 Curve 的最佳实际。对于 SMC 而言最重要的是社区和生态,在此欢送大家应用并参加龙蜥社区和 SMC 社区,一起打造 SMC 高性能网络协议栈。

相干链接地址:

高性能网络 SIG 地址:

https://openanolis.cn/sig/hig…

SMC 代码仓库链接:

https://gitee.com/anolis/hpn-…

—— 完 ——

正文完
 0