关于tcp-ip:系列解读-SMCR-二融合-TCP-与-RDMA-的-SMCR-通信-龙蜥技术

37次阅读

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

文 / 龙蜥社区高性能网络 SIG

一、引言

通过上一篇文章《系列解读 SMC-R:通明无感晋升云上 TCP 利用网络性能(一)》咱们理解到,RDMA 绝对于 TCP 具备旁路软件协定栈、卸载网络工作到硬件的特点,能无效减少网络带宽、升高网络时延与 CPU 负载。而内核网络协议 SMC-R 在利用 RDMA 技术的同时、又进一步完满兼容了 socket 接口,可能通明无感的为 TCP 利用带来网络性能晋升。因而,龙蜥社区高性能网络 SIG 认为 SMC-R 将成为下一代数据中心内核协定的重要组成,对其进行了大量优化,并踊跃将这些优化回馈到上游 Linux 社区。

本篇文章作为 SMC-R 系列的第二篇,将聚焦一次残缺的 SMC-R 通信流程。通过具体的建连、传输、销毁过程,使读者进一步领会到 SMC-R 是一个交融了通用 TCP 与高性能 RDMA 的 “hybrid” 解决方案。

二、通信流程

如前篇所述,应用 SMC-R 协定有两种办法。其一,是在应用程序中显式创立 AF_SMC 族的 socket;其二,是利用 LD_PRELOAD 或 ULP + eBPF 的形式通明的将应用程序中的 AF_INET 族 socket 替换为 AF_SMC 族 socket。咱们默认应用 SMC-R 通信的节点曾经加载了 SMC 内核模块,并通过上述形式将利用程序运行在 SMC-R 协定上。接下来,咱们以 first contact (通信两端建设首个连贯) 场景为例,介绍 SMC-R 通信流程。

2.1 确认对端能力

应用 SMC-R 通信时,咱们首先须要确认对端是否同样反对 SMC-R 协定。因而,SMC-R 协定栈为应用程序创立 SMC 类型 socket (smc socket) 的同时,还会在内核创立并保护一个与之关联的 TCP 类型 socket (clcsock),并基于 clcsock 与对端建设起 TCP 连贯。

(图 /TCP 握手确认对端 SMC-R 能力)

在 TCP 连贯三次握手中,应用 SMC-R 协定的一端发送的 SYN/ACK 中携带了非凡的 TCP 选项 (Kind = 254,Magic Number = 0xe2d4),用于表明本身反对 SMC-R。通过查看对端发送的 SYN/ACK,通信节点得悉其 SMC-R 能力,进而决定是否持续应用 SMC-R 通信。

(图 / 三次握手携带非凡 TCP 选项[1])


(图 / 代表 SMC-R 的 TCP 选项)

2.2 协定回退

若在上述 TCP 握手过程中,通信两端其一示意无奈反对 SMC-R,则进入协定回退 (fallback) 流程。

协定回退时,应用程序所持有的 fd 对应的 smc socket 将被替换为 clcsock。从此,应用程序将应用 TCP 协定通信,从而确保数据传输不会因为协定兼容问题而中断。

须要留神的是,协定回退仅产生在通信协商过程中,如前文提到的 TCP 握手阶段,或是下文提到的 SMC-R 建连阶段。为便于跟踪诊断,SMC-R 协定具体分类了潜在的回退可能,用户能够通过用户态工具 smc-tools 观测到协定回退事件及起因。

(图 /smc-tools 观测回退景象)

2.3 建设 SMC-R 连贯

若在 TCP 握手中,两端均示意反对 SMC-R,则进入 SMC-R 建连流程。SMC-R 连贯的建设依赖 TCP 连贯传递管制音讯,这种管制音讯被称为 Connection Layer Control (CLC) 音讯。

(图 / 应用 CLC 音讯建设 SMC-R 连贯)

CLC 音讯的主要职责是同步通信两端的 RDMA 资源以及共享内存等信息。应用 CLC 音讯建设 SMC-R 连贯的过程与 SSL 握手相似,次要蕴含 Proposal、Accept、Decline、Confirm 等语义。在建连过程中,若遇到不可复原的异样 (如 RDMA 资源生效) 导致后续 SMC-R 通信无奈持续,也将触发前文所述的协定回退流程。

(图 /SMC-R 握手过程[1])

First contact 场景下,因为通信两端首次接触,两者间尚不存在应用 RDMA 通信的条件。所以,在建设首个 SMC-R 连贯时,还将创立 SMC-R 通信所需的 RDMA 资源,建设 RDMA 链路,申请 RDMA 内存。

2.3.1 创立 RDMA 资源

SMC-R 建连初期,两端依据应用程序传递的 IP 地址在本地寻找可用 (如雷同 Pnet ID) 的 RDMA 设施,并基于找到的设施创立必要的 RDMA 资源,包含 Queue Pair (QP),Completion Queue (CQ),Memory Region (MR),Protect Domain (PD) 等等。

其中,QP 与 CQ 是 RDMA 通信的根底,提供了一套 RDMA 使用者 (如 SMC 内核协定栈) 与 RDMA 设施 (RNIC) 之间的异步通信机制。

QP 实质是寄存工作工作 (Work Request, WR) 的工作队列 (Work Queue, WQ)。负责发送工作的 WQ 称为 Send Queue (SQ),负责接管工作的 WQ 称为 Receive Queue (RQ),两者总是成对呈现,称为 QP。用户将心愿 RNIC 实现的工作打包为工作队列元素 (Work Queue Element, WQE),post 到 QP 中。RNIC 从 QP 中取出 WQE,实现 WQE 中定义的工作。

CQ 实质是寄存工作实现信息 (Work Completion, WC) 的队列。RNIC 实现 WR 后,将实现信息打包为实现队列元素 (Completion Queue Element, CQE) 放入 CQ 中。用户从 CQ 中 poll 出 CQE,获悉 RNIC 曾经实现某个 WR。

(图 /RDMA 工作队列模型)

2.3.2 建设 RDMA 链路

通信两端将已创立的 RDMA 资源通过 CLC 音讯同步到对端,进而在两端之间建设起基于 RC (Reliable Connection) QP 的 RDMA 链路。SMC-R 中将这种点对点逻辑上的 RDMA 链路称为 SMC-R Link。一条 SMC-R Link 承载着多条 SMC-R 连贯的数据流量。

(图 /SMC Link)

若通信节点之间存在不止一对可用的 RNIC,则会建设不止一条 Link。这些 Link 在逻辑上组成一个小组,称为 SMC-R Link Group。

(图 /SMC-R Link Group)

在 Linux 实现中,每个 Link Group 具备 1-3 条 Link,最多承载 255 条 SMC-R 连贯。这些连贯被平衡的关联到 Link Group 的某一 Link 上。应用程序通过 SMC-R 连贯发送的数据将由关联的 Link (也即 RDMA 链路) 传输。

同一个 Link Group 中,所有的 Link 相互“平等”。这个“平等”体现在同一 Link Group 中的 Link 具备拜访 Group 中所有 SMC-R 连贯收发缓冲区 (下文提到的 sndbuf 与 RMB) 的权限,具备承载任意 SMC-R 连贯数据流的能力。因而,当某一 Link 生效时 (如 RNIC down),关联此 Link 的所有连贯能够迁徙到同 Link Group 的另一条 Link 上。这使得 SMC-R 通信稳固牢靠,具备肯定的容灾能力。

SMC-R 中,Link (Group) 在 first contact 时创立,在最初一条 SMC-R 连贯断开一段时间 (Linux 实现中为 10 mins) 后销毁,具备比连贯更长的生命周期。First contact 之后创立的 SMC-R 连贯都将尝试复用已有的 Link (Group)。这样的设计充分利用了已有的 RDMA 资源,防止了频繁创立与销毁带来的额定开销。

2.3.3 申请 RDMA 内存

SMC-R 协定栈为每条 SMC-R 连贯调配了独属的收发缓冲区:sndbuf (发送缓冲区) 与 RMB (接收缓冲区,Remote Memory Buffer)。这是两片地址间断,长度在 16 KB ~ 512 KB 间的内核态 ring buffer。

(图 /SMC-R 连贯 ring buffer)

其中,sndbuf 用于寄存连接待发送的数据,被注册为 DMA 内存。本地 RNIC 设施能够间接拜访 sndbuf,从中取走无效负载 (payload)。而 RMB 用于寄存近程节点 RNIC 写入的数据,即连接待接管的数据。因为须要被近程节点拜访,因而 RMB 被注册为 RDMA 内存。

注册 RDMA 内存的过程称为 Memory Registration,次要实现以下操作:

  • 生成地址翻译表

RDMA 使用者 (如本地 / 近程 SMC-R 协定栈) 通常应用虚拟地址 (VA) 形容内存,而 RNIC 则通过物理地址 (PA) 寻址。RNIC 从 WQE 或数据包中获得数据 VA 后通过查表失去 PA,进而拜访正确内存空间。因而 Memory Registration 首要任务就是造成指标内存的地址翻译表。

  • Pin 住内存

古代 OS 会置换暂不应用的内存数据,这将导致地址翻译表中的映射关系生效。因而,Memory Registration 会将指标内存 pin 住,锁定 VA-to-PA 映射关系。

  • 限度内存拜访权限

为防止内存非法拜访,Memory Registration 会为指标内存生成两把内存密钥:Local Key (l_key) 和 Remote Key (r_key)。内存密钥本质是一串序列,本地或远端凭借 l_key 或 r_key 拜访 RDMA 内存,确保内存拜访非法。

SMC-R 中,近程节点拜访本地 RMB 所需的 addr 与 r_key 被封装为近程拜访令牌 (Remote Token, rtoken),通过 CLC 消息传递到远端,使其具备近程拜访本地 RMB 的权限。

SMC-R 连贯销毁后,对应的 sndbuf 与 RMB 将被回收到 Link Group 保护的内存池中,供后续新连贯复用,以此减小 RDMA 内存创立 / 销毁对建连性能的影响。


(图 /sndbuf / RMB 内存池)

2.4 验证 SMC-R Link

因为 first contact 场景下新建设的 SMC-R Link 尚未通过验证,所以在正式应用 Link 传输利用数据前,通信两端会基于 Link 发送 Link Layer Control (LLC) 音讯,用于测验 Link 是否可用。

(图 / 应用 LLC 音讯确认 SMC Link 可用)
LLC 音讯通常为申请 - 回复模式,用于传输 Link 层面的管制信息,如增加 / 删除 / 确认 Link,确认 / 删除 r_key 等。


(图 /LLC 音讯申请 - 回复模式)

(表 / 典型 LLC 音讯含意)

LLC 音讯的传输基于 RDMA 的 SEND 操作实现,与之绝对的是后文提到的 RDMA WRITE 操作。

(图 /SEND 操作)

SEND 操作又被称为“双边操作”,这是因为 SEND 操作要通信两端都参加进来。一次 SEND 的传输过程为:

  • 接收端 RDMA 使用者 (SMC-R 内核协定栈) 向本地 RQ 中 Post RWQE,RWQE 中记录了待接收数据的长度以及预留内存地址;
  • 发送端 RDMA 使用者 (SMC-R 内核协定栈) 向本地 SQ 中 Post SWQE,SWQE 中记录了待发送数据长度和内存地址。发送端 RNIC 依据 SWQE 记录的信息取出相应长度的数据发送到对端;
  • 接收端 RNIC 接管到数据后,取出 RQ 中的第一个 RWQE,按照其中记录的内存地址和长度存放数据;

通过在 Link 上收发 CONFIRM_LINK 类型的 LLC 音讯,通信两端确认了新创建的 Link 具备 RDMA 通信的能力,能够用于传输 SMC-R 连贯数据。

2.5 基于共享内存通信

通过上述重重步骤,first contact 场景下 SMC-R 建连工作终于完结。接下来,应用程序将通过已建设好的 SMC-R 连贯传输数据。

(图 / 基于 RDMA 共享内存通信)

应用程序下发到 SMC-R 连贯中的数据由关联的 Link 通过 RDMA WRITE 操作写入近程节点 RMB 中。

(图 /RDMA WRITE 操作)

与上文提到的 SEND 操作不同,RDMA WRITE 又被称为“单边操作”。这是因为数据传输只有 RDMA WRITE 发动的一方参加,而接收数据一方的 RDMA 使用者齐全不参加数据传输,也不通晓数据的到来。一次 RDMA WRITE 操作过程如下:

  • 后期筹备阶段,接收端 RDMA 使用者 (SMC-R 内核协定栈) 将接收缓冲区注册为 RDMA 内存,将近程拜访密钥 rkey 告知发送端,使其领有间接拜访接收端内存的权限,这个过程咱们在前文介绍过。
  • 发送端 RDMA 使用者 (SMC-R 内核协定栈) 向 SQ 中 post SWQE。与 SEND 不同的是,RDMA WRITE 的 SWQE 中不仅蕴含数据在本地的内存地址和长度,还蕴含数据行将寄存在接收端的内存地址,以及拜访接收端内存所需的 r_key。发送端 RNIC 依据 SWQE 中记录的信息将数据传输到接收端。
  • 接收端 RNIC 核实数据包中的 r_key,将数据寄存到指定内存地址中。此时的接收端 RDMA 使用者并不知道数据曾经被写入内存。

因为 RDMA WRITE 操作不须要接收端 RDMA 使用者参加,因而非常适合大量数据的间接写入。不过,因为接收端并不通晓数据到来,发送端写入数据后须要通过 SEND 操作发送管制音讯告诉接收端。在 SMC-R 中,这种管制音讯称为 Connection Data Control (CDC) 音讯。CDC 音讯中蕴含 RMB 相干管制信息用以同步数据读写。

(表 /CDC 音讯次要内容)

在系列文章的第一篇中咱们提到,SMC-R 名称中的“共享内存”指的是接收端的 RMB。联合上述的 RDMA WRITE 操作与 CDC 音讯,SMC-R 的共享内存通信流程能够总结为:
图片
(图 / 共享内存通信细节)

  • 发送端的数据通过 socket 接口,由利用缓冲区拷贝至内核 sndbuf 中 (图中未画出 sndbuf)
  • 协定栈通过 RDMA WRITE 单边操作将数据写入接收端 RMB 中
  • 发送端通过 SEND 双边操作发送 CDC 音讯告知接收端有新的数据到来
  • 接收端从 RMB 中拷贝数据至利用缓冲区
  • 接收端通过 SEND 双边操作发送 CDC 音讯告知发送端 RMB 中局部数据已被应用

2.6 连贯敞开与资源销毁

完结数据传输后,被动敞开方发动 SMC-R 连贯敞开流程。与 TCP 类似,SMC-R 连贯也存在半敞开 / 全敞开状态。断开的 SMC-R 连贯与 Link (Group) 解绑,相干的 sndbuf 与 RMB 也将被回收到内存池中,期待复用。同时,与 SMC-R 连贯关联的 TCP 连贯也进入敞开流程,最终开释。

若 Link (Group) 中不再存在沉闷的 SMC-R 连贯,则期待一段时间后 (Linux 实现中为 10 mins) 进入 Link (Group) 销毁流程。销毁 Link (Group) 将开释与之相干的所有 RDMA 资源,包含 QP、CQ、PD、MR、以及所有的 sndbuf 与 RMB。Link (Group) 销毁后,再次创立 SMC-R 连贯则须要从新经验 first contact 流程。

三、总结

本篇作为 SMC-R 系列文章的第二篇,以 first contact 场景为例,介绍了残缺的 SMC-R 通信流程。包含:通过 TCP 握手确认对端 SMC-R 能力;应用 TCP 连贯传递 CLC 音讯,替换 RDMA 资源、创立 RDMA 链路、建设 SMC-R 连贯;通过 RDMA SEND 操作发送 LLC 音讯验证 Link 可用;基于 Link 应用 RDMA WRITE 传输应用程序数据,并利用 CDC 音讯同步 RMB 中数据变动;敞开 SMC-R、TCP 连贯,销毁 RDMA 资源等一系列过程。

上述过程充分体现了 SMC-R 的 “hybrid” 特点。SMC-R 既利用了 TCP 的通用性,如通过 TCP 连贯确认对端能力,建设 SMC-R 连贯与 RDMA 链路;又利用了 RDMA 的高性能,如通过 Link 传输应用程序数据流量。正因为如此,SMC-R 可能在兼容现有 TCP/IP 生态系统要害性能的同时为 TCP 利用提供通明无感的网络性能晋升。

参考阐明:
[1] https://datatracker.ietf.org/…

—— 完 ——

退出龙蜥社群

退出微信群:增加社区助理 - 龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;退出钉钉群:扫描下方钉钉群二维码。欢送开发者 / 用户退出龙蜥社区(OpenAnolis)交换,独特推动龙蜥社区的倒退,一起打造一个沉闷的、衰弱的开源操作系统生态!


对于龙蜥社区

龙蜥社区(OpenAnolis)由企事业单位、高等院校、科研单位、非营利性组织、集体等在被迫、平等、开源、合作的根底上组成的非盈利性开源社区。龙蜥社区成立于 2020 年 9 月,旨在构建一个开源、中立、凋谢的 Linux 上游发行版社区及翻新平台。

龙蜥社区成立的短期指标是开发龙蜥操作系统 (Anolis OS) 作为 CentOS 停服后的应答计划,构建一个兼容国内 Linux 支流厂商的社区发行版。中长期指标是摸索打造一个面向未来的操作系统,建设对立的开源操作系统生态,孵化翻新开源我的项目,凋敝开源生态。

目前,龙蜥 OS 8.4 已公布,反对 X86_64、Arm64、LoongArch 架构,欠缺适配 Intel、飞腾、海光、兆芯、鲲鹏、龙芯等芯片,并提供全栈国密反对。

欢送下载:

https://openanolis.cn/download

退出咱们,一起打造面向未来的开源操作系统!

https://openanolis.cn

正文完
 0