diff --git a/sig/T-One/README.en.md b/sig/T-One/README.en.md index ebb6b43d2bd7592a53635a2209f4d8123939ba11..1131c472e4860dbce634c4b769945a22ae47e618 100644 --- a/sig/T-One/README.en.md +++ b/sig/T-One/README.en.md @@ -15,6 +15,8 @@ T-One:https://tone.openanolis.cn/ Testfarm:https://testfarm.openanolis.cn/ +Testlib:https://testlib.openanolis.cn/ + ## Members | Member | Role | | ------------ | ------------ | @@ -46,7 +48,8 @@ Source code repositories: - https://gitee.com/anolis/tone-deploy - https://gitee.com/anolis/tone-cli - https://gitee.com/anolis/tone-storage - +- https://gitee.com/anolis/testlib +- https://gitee.com/anolis/python-tone-agent ## Meetings @@ -54,4 +57,4 @@ Source code repositories: 欢迎使用钉钉扫码入群 - \ No newline at end of file + diff --git a/sig/T-One/README.md b/sig/T-One/README.md index 6162714a56e3247b46e0cbf66d6d8b06265badc5..b03448a127ac7cfda80c6b583b2065f091447a09 100644 --- a/sig/T-One/README.md +++ b/sig/T-One/README.md @@ -48,6 +48,7 @@ Source code repositories: - https://gitee.com/anolis/tone-cli - https://gitee.com/anolis/tone-storage - https://gitee.com/anolis/testlib +- https://gitee.com/anolis/python-tone-agent ## 小组例会 双周会,采用线上会议形式 diff --git "a/sig/T-One/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(2023-01-05).md" "b/sig/T-One/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(2023-01-05).md" new file mode 100644 index 0000000000000000000000000000000000000000..992a9a0484f32b20ebbdfd6649112de7e761e8f9 --- /dev/null +++ "b/sig/T-One/content/SIG\344\276\213\344\274\232/SIG\344\276\213\344\274\232(2023-01-05).md" @@ -0,0 +1,17 @@ +# 会议主题 +测试平台T-One、测试管理系统TestLib进展 +# 会议时间 +2023.01.05 10:30-11:00 +# 参会人 + +- 参会方:来自电子五所(赛宝实验室)和阿里云的社区爱好者 +- 参会人:yongchao、juexiao、VosAmoWho、zhizhisheng +# 会议记要 +**T-One** + +- **T-One一键部署功能**:初步模型预计在下周发布。后续五所同学帮忙进行功能验证。 +- **T-One dashboard**:初始化的时候,dashboard显示空白 +- **ToneAgent**:python版本的ToneAgent发布前的测试。当前稳定版在ceprei分支 + +**TestLib** +- **TestLib采购指标功能完善**。已完成。 diff --git a/sig/TC/content/report/2022/2022.12.md b/sig/TC/content/report/2022/2022.12.md new file mode 100644 index 0000000000000000000000000000000000000000..91eac217ff6fa499d76e84d41d0c820788d01d84 --- /dev/null +++ b/sig/TC/content/report/2022/2022.12.md @@ -0,0 +1,14 @@ + +# 龙蜥社区技术委员会治理升级 + +龙蜥社区技术委员会(TC)双周会在2022年12月9日顺利召开。近一年龙蜥社区又取得了很大进步,社区的发展步入快车道,为适应社区快速发展的需要,本次会议对社区技术委员会治理机制进行了升级。 + +1、龙蜥社区技术委员会治理章程升级 +经技术委员、理事单位、社区合作伙伴伙伴积极提议,技术委员会多伦讨论和修改,通过了《龙蜥社区技术委员会章程》修订。本次修订兼顾社区治理效率、开放平等协作、生态发展繁荣等要素,升级了技术委员增补、退出、变更路径,并引入KOL、观察员角色,融合了龙蜥社区治理实践经验。感谢各位委员为社区发展做出大量积极贡献。 + +2、技术委员会会议轮值机制常规化 +经过前期TC会议轮值试运营实践,社区总结了一套TC会议轮值机制,涵盖会前、会中、会后等环节。会议决策,TC会议轮值从试运营升级为常规运营。开源开放治理是龙蜥社区的基本运营理念之一,TC会议运营升级将进一步发挥各理事单位、合作伙伴的创造性,进一步提升社区开放治理水平。 + +技术委员会将继续努力,推动龙蜥社区更高水平建设和发展。感谢各位技术委员、理事单位、合作伙伴为社区高水平治理建设做出持续不懈努力。 + + diff --git a/sig/high-perf-network-sig/README.md b/sig/high-perf-network-sig/README.md index 6543dd6cf3c288a81f74ee985e7cac687456d507..a1dcc027142a66d8a94296c2722fa65838e89254 100644 --- a/sig/high-perf-network-sig/README.md +++ b/sig/high-perf-network-sig/README.md @@ -41,5 +41,5 @@ netdev@lists.openanolis.cn 搜索:34077273 或者扫描二维码: - + diff --git a/sig/high-perf-network-sig/asserts/dingtalk.jpg b/sig/high-perf-network-sig/assets/dingtalk.jpg similarity index 100% rename from sig/high-perf-network-sig/asserts/dingtalk.jpg rename to sig/high-perf-network-sig/assets/dingtalk.jpg diff --git "a/sig/high-perf-network-sig/content/projects/SMC/1_\346\246\202\350\277\260.md" "b/sig/high-perf-network-sig/content/projects/SMC/1_\346\246\202\350\277\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..9df334d5c61cdfabb44896232f0f21fc603b5133 --- /dev/null +++ "b/sig/high-perf-network-sig/content/projects/SMC/1_\346\246\202\350\277\260.md" @@ -0,0 +1,7 @@ +共享内存通信(Shared Memory Communication,SMC)是一种兼容 socket 层,利用共享内存操作实现高性能通信的内核网络协议栈。当共享内存通信基于远程内存直接访问(Remote Direct Memory Access,RDMA)技术实现时,称为 SMC over RDMA(SMC-R)。 + +SMC-R 兼容 socket 接口的特点使 TCP 应用程序无需任何改造即可运行在 SMC 协议栈上;底层使用的 RDMA 网络使 SMC 拥有相较于 TCP 更好的网络性能。SMC 协议栈通过 TCP 连接自主发现对侧 SMC 能力,协商成功后使用 SMC 协议栈承载应用数据流量;协商失败则安全回退至 TCP/IP 协议栈,保证数据正常传输。 + +阿里云 Alibaba Cloud Linux 3 操作系统基于阿里云弹性 RDMA(elastic RDMA, eRDMA)技术首次将 SMC-R 带入云上场景,实现云上 TCP 协议栈的透明无损替换,为数据库、RPC、批量数据传输等场景提供相比 TCP 更好的网络性能。相较于上游 Linux SMC-R 实现,Alibaba Cloud Linux 3 中的 SMC-R 更适配阿里云 eRDMA 技术、拥有更好的性能、可靠的稳定性、丰富成熟的透明替换方案和及时的更新维护。 + + diff --git "a/sig/high-perf-network-sig/content/projects/SMC/2_\345\216\237\347\220\206\350\247\243\350\257\273-\346\212\200\346\234\257\346\217\255\347\247\230:\351\230\277\351\207\214\344\272\221\345\217\221\345\270\203\347\254\254\345\233\233\344\273\243\347\245\236\351\276\231.md" "b/sig/high-perf-network-sig/content/projects/SMC/2_\345\216\237\347\220\206\350\247\243\350\257\273-\346\212\200\346\234\257\346\217\255\347\247\230:\351\230\277\351\207\214\344\272\221\345\217\221\345\270\203\347\254\254\345\233\233\344\273\243\347\245\236\351\276\231.md" new file mode 100644 index 0000000000000000000000000000000000000000..66d5f2092627324adaa2debcfd8e3fe3ca0518a1 --- /dev/null +++ "b/sig/high-perf-network-sig/content/projects/SMC/2_\345\216\237\347\220\206\350\247\243\350\257\273-\346\212\200\346\234\257\346\217\255\347\247\230:\351\230\277\351\207\214\344\272\221\345\217\221\345\270\203\347\254\254\345\233\233\344\273\243\347\245\236\351\276\231.md" @@ -0,0 +1,55 @@ +> 原文链接:[技术揭秘:阿里云发布第四代神龙 ,SMC-R 让网络性能提升 20%](https://mp.weixin.qq.com/s?__biz=MzUxNjE3MTcwMg==&mid=2247486197&idx=1&sn=e1b86ef6627dd13847b88e2ca367f890&chksm=f9aa382cceddb13a24c553451351aee1e0c026b0044403e0f6442e010df5e7303b07c4ce9912&scene=21#wechat_redirect) + +> 注:一年一度的云栖大会近日在杭州如约举行。今年的云栖大会上阿里云发布了第四代神龙架构,其中弹性 RDMA 加速能力尤其值得关注。基于弹性 RDMA,阿里云操作系统 Alibaba Cloud Linux 3 和龙蜥社区操作系统 Anolis OS 在网络方面基于社区 SMC-R 优化形成兼容 socket 的 RDMA 产品方案,旨在帮助云上应用无修改的享受 RDMA 带来的性能提升。本文将为您阐述 SMC-R 的产生背景、原理架构以及部分性能数据。 + +近些年,随着云计算的飞速发展,特别是阿里云神龙、AWS Nitro 等硬件虚拟化方案的出现,云上的虚拟化网络性能有了质的飞跃。相比于云网络的欣欣向荣,CPU 的性能提升却似“挤牙膏”一般有些力不从心。因此,将部分原本由 CPU 承担的工作卸载到后端硬件的解决思路成为了云计算领域研究的一个“热点”。远程内存直接访问 (Remote Direct Memory Access, RDMA) 这项追求极致性能,曾经主要应用在高性能计算、高频交易等特定场景中的技术也因此进入了云厂商的数据中心。 + +# 从 TCP 到 RDMA + +RDMA 作为一种旁路内核的远程内存直接访问技术,被广泛应用于数据密集型和计算密集型场景中,是高性能计算、机器学习、数据中心、海量存储等领域的重要解决方案。RDMA 在阿里巴巴已大规模稳定运行多年,支撑了阿里云 ESSD、PolarDB 等核心业务,并在双十一等重大场景得到充分验证。 +RDMA 具有零拷贝、协议栈卸载的特点。RDMA 将协议栈的实现下沉至 RDMA 网卡 (RNIC),绕过内核直接访问远程内存中的数据。由于不经过系统内核协议栈,RDMA 与传统 TCP/IP 实现相比不仅节省了协议处理和数据拷贝所需的 CPU 资源,同时也提高了网络吞吐量、降低了网络通信时延。 + + + +在过去,RDMA 只能在一些数据中心网络中通过网卡和交换机紧密配合使用,部署复杂度高。但如今,阿里云弹性 RDMA 将复杂的 RDMA 技术带到云上,使普通的 ECS 用户也能使用高性能的 RDMA 传输,无需关心底层复杂的网卡、交换机等物理网络环境配置,使其成为一种亲民、普惠的技术。 + +# 从 verbs 到 socket + +不过,虽然 RDMA 性能优异,但是由于 RDMA 使用的 IB verbs 接口和常用的 POSIX socket 接口存在巨大的差异,普通应用要使用 RDMA 将面临着大量的业务改造,高效的将 RDMA 应用于现有业务存在较高的技术门槛。 +所以,历史上存在一些将 RDMA 的 IB verbs 语义封装成 socket 接口的尝试,典型如 rsocket、libvma。其中,libvma 通过 LD_PRELOAD 拦截 socket 接口,转而使用用户态 verbs 完成数据传输。但这些方案存在一些缺陷:由于转换发生在用户态,一方面缺少内核统一资源管理,另一方面在兼容性上也存在一些问题。 +从资源管理和兼容的角度上看,在内核中实现 socket 接口相比于用户态来说有着天然的优势。在 Alibaba Cloud Linux 3 和 Anolis OS 中,我们提供并优化了基于 RDMA 的共享内存通信 (**Shared Memory Communications over RDMA, SMC-R**) 技术,这是一次基于内核 RDMA 实现 TCP 应用兼容的尝试。 +原生的 SMC-R 支持标准 RoCE 网络,我们对其进行了扩展,首次实现对 iWARP 的支持,可以完美的支持阿里云自研的弹性 RDMA,从而实现云上应用**零修改**的享受 RDMA 带来的性能红利。 + +# 兼备 socket 和 RDMA 的内核实现:SMC-R + +用一句话来描述,SMC-R 是一套与 TCP/IP 平行的**向上兼容 TCP socket 接口,底层使用 RDMA RC 进行数据传输的协议族。** +SMC-R 工作于内核空间,处于 socket 层和内核 RDMA 的 IB verbs 层之间。SMC-R 像是一个能力卓越的翻译兼管家,它接收用户传达的 socket 指令,转而使用 RDMA 的 IB verbs 接口管理 RDMA 资源,完成底层基于 RDMA 的数据传输。所以,用户只需将原有 socket 接口使用的协议族从 AF_INET(6) 修改为 AF_SMC 即可完成从 TCP 协议栈到 SMC-R 协议栈的转变。 +但这还不够,我们希望在零修改的前提下完成协议替换。为此,Alibaba Cloud Linux 3 和 Anolis OS 在 socket 层增加协议族替换相关的 sysctl 和白名单,提供了 net namespace 和单个应用维度下的 TCP 至 SMC-R 协议栈透明替换能力,使应用**不需要任何修改**即可让数据在 RDMA 链路这条高速公路上飞驰起来。 + + + +然而,仅本地一厢情愿的使用 SMC-R 可不行,远端节点同样得具备 SMC-R 能力才能让高速公路有始有终。因此,SMC-R 具备**自动协商和安全回退 TCP** 的能力。 +SMC-R 建立 RDMA 链路时,首先会与通信对端建立 TCP 连接,双方在握手过程中通过特殊的 TCP 选项表明自身支持 SMC-R。协商成功后,SMC-R 将为用户态应用申请必要的 RDMA 资源,将接收数据缓冲区注册为可被远程节点直接访问的远程内存缓冲区 (Remote Memory Buffer, RMB),并将对应的访问密钥以及缓冲区起始地址封装成远程访问令牌 (RToken) 告知远程节点,作为其访问 RMB 的重要验证信息。 +特殊情况下,若在协商过程中发现收发两端其一不具备 RDMA 传输条件时,将触发安全回退机制。SMC-R 会使用协商过程中建立的 TCP 连接完成后续的数据传输,保证网络的可靠稳定。 + + + +数据传输的高速公路建立起来后,交通规则也要安排妥当。顾名思义,SMC-R 是一种通过 RDMA 实现共享内存的通信方式,**其将环形 RMB 作为共享内存**,配合数据游标实现高效的数据传输。 +SMC-R 使用 RDMA WRITE 单边操作的方式将网络应用传递至内核的数据直接、高效地写入远程节点环形 RMB 中。同时使用 RDMA SEND/RECV 双边操作的方式交互连接数据管理 (Connection Data Control, CDC) 消息,用于更新、同步 RMB 中的数据游标 (Cursor)。针对一侧 RMB,读者更新消费者游标 (Consumer Cursor),标识即将读取的下一字节地址。为避免数据丢失,写者不会将数据写入超过消费者游标的 RMB 空间中。相似的,写者更新生产者游标 (Producer Cursor),标识即将写入的下一字节地址。为确保数据的正确性,读者不会读取超过生产者游标的 RMB 空间中的内容。就这样,两个数据游标在环形 RMB 上你追我赶,贯穿网络数据传输的始终,确保传输的安全与可靠。 + + + +最后,数据在高速公路上飞驰难免会遇到差错,为了保证一切都在掌控之中,Alibaba Cloud Linux 3 和 Anolis OS 为 SMC-R 提供了一系列监控诊断接口和工具,包括控制透明替换的 sysctl、查询 SMC-R socket 状态的 proc 文件、获取 SMC-R 各维度信息的 smc-tools 工具集等,以保障网络的可监控性和易运维性。 +通过上述架构概述和理论分析,SMC-R 展现了其兼容 socket 接口,透明替换 TCP,使用 RDMA 完成底层数据传输的能力。基于这些,我们终于可以总结出 SMC-R 的核心优势: + +### 高性能 + +- 更轻薄的协议栈; +- 使用 RDMA 进行通信,网络时延更低、CPU 占用更少、吞吐量更高; +- 高效可靠的远程环形缓冲区直接访问。 + +### 透明替换 +- 兼容 socket 接口的 RDMA 可靠流式传输; +- 自动协议协商和安全回退 TCP 能力; +- net namespace 和应用维度的协议栈无损透明替换; +- 底层兼容弹性 RDMA iWARP 和标准 RoCE 网络。 diff --git "a/sig/high-perf-network-sig/content/projects/SMC/2_\345\216\237\347\220\206\350\247\243\350\257\273-\347\263\273\345\210\227\350\247\243\350\257\273_SMC-R_\344\270\200.md" "b/sig/high-perf-network-sig/content/projects/SMC/2_\345\216\237\347\220\206\350\247\243\350\257\273-\347\263\273\345\210\227\350\247\243\350\257\273_SMC-R_\344\270\200.md" new file mode 100644 index 0000000000000000000000000000000000000000..50ea7d54074efff6191dc9cc688e1a81f180ee74 --- /dev/null +++ "b/sig/high-perf-network-sig/content/projects/SMC/2_\345\216\237\347\220\206\350\247\243\350\257\273-\347\263\273\345\210\227\350\247\243\350\257\273_SMC-R_\344\270\200.md" @@ -0,0 +1,252 @@ +> 原文链接:[系列解读SMC-R:透明无感提升云上 TCP 应用网络性能(一)| 龙蜥技术](https://mp.weixin.qq.com/s?search_click_id=2359972879487335624-1672728145437-6094177369&__biz=Mzg4MTMyMTUwMQ==&mid=2247493698&idx=1&sn=1f03ea3a9025ae0a461a7346cd75b3bd&chksm=cf651b30f812922698c49f95cedf18f4f83ed16d399800cda80e5d1188d64e8bd15b408f13ba&scene=0&subscene=10000&clicktime=1672728145&enterid=1672728145&sessionid=0&ascene=65&fasttmpl_type=0&fasttmpl_fullversion=6485008-zh_CN-zip&fasttmpl_flag=0&realreporttime=1672728145471#rd) + +# 引言 + +Shared Memory Communication over RDMA (SMC-R) 是一种基于 RDMA 技术、兼容 socket 接口的内核网络协议,由 IBM 提出并在 2017 年贡献至 Linux 内核。SMC-R 能够帮助 TCP 网络应用程序透明使用 RDMA,获得高带宽、低时延的网络通信服务。 + +由于 RDMA 技术在数据中心领域的广泛使用,龙蜥社区高性能网络 SIG 认为 SMC-R 将成为下一代数据中心内核协议栈的重要方向之一。为此,我们对其进行了大量的优化,并积极将这些优化回馈到上游 Linux 社区。目前,**龙蜥社区高性能网络 SIG 是除 IBM 以外最大的 SMC-R 代码贡献团体**。由于 SMC-R 相关中文资料极少,我们希望通过一系列文章,让更多的国内读者了解并接触 SMC-R,也欢迎有兴趣的读者加入龙蜥社区高性能网络 SIG 一起沟通交流。 + +本篇作为系列文章的第一篇,将从宏观的角度带领读者初探 SMC-R。 + +# 从 RDMA 谈起 + +Shared Memory Communication over RDMA 的名称包含了 SMC-R 网络协议的一大特点——基于 RDMA。因此,在介绍 SMC-R 前我们先来看看这个高性能网络领域中的绝对主力:Remote Direct Memory Access (RDMA) 技术。 + +### 1.1 为什么需要 RDMA ? + +随着数据中心、分布式系统、高性能计算领域的快速发展,网络设备性能进步显著,主流物理网络带宽已达到了 25-100 Gb/s,网络时延也进入了十微秒的时代。 +然而,**网络设备性能提升的同时一个问题也逐渐显露:网络性能与 CPU 算力逐渐失配**。传统网络中,负责网络报文封装、解析和用户态/内核态间数据搬运的 CPU 在高速增长的网络带宽面前逐渐显得力不从心,面临越来越大的压力。 +以 TCP/IP 网络的一次数据发送与接收过程为例。发送节点 CPU 首先将数据从用户态内存拷贝至内核态内存,在内核态协议栈中完成数据包封装;再由 DMA 控制器将封装好的数据包搬运到 NIC 上发送到对端。接收端 NIC 获得数据包后通过 DMA 控制器搬运到内核态内存中,由内核协议栈解析,层层剥离帧首或包头后再由 CPU 将有效负载 (payload) 拷贝到用户态内存中,完成一次数据传输。 + + + +在这一过程中,CPU 需要负责: +- 用户态与内核态间的数据拷贝。 +- 网络报文的封装、解析工作。 + +这些工作“重复低级”,占用了大量 CPU 资源 (如 100 Gb/s 的网卡跑到满带宽需要打满多个 CPU 核资源),使得 CPU 在数据密集型场景下无法将算力用到更有益的地方。 +所以,解决网络性能与 CPU 算力失配问题成为了高性能网络发展的关键。考虑到摩尔定律逐渐失效,CPU 性能短时间内发展缓慢,将网络数据处理工作从 CPU 卸载到硬件设备的思路就成为了主流解决方案。这使得以往专用于特定高性能领域的 RDMA 在通用场景下得到愈来愈多的应用。 + + +### 1.2 RDMA 的优势 + +RDMA (Remote Direct Memory Access) 是一种远程内存直接访问技术,自提出以来经过 20 余年的发展已经成为了高性能网络的重要组成。那么 RDMA 是如何完成一次数据传输的呢? + + + +RDMA 网络 (用户态模式) 中,具备 RDMA 能力的网卡 RNIC 直接从发送端用户态内存中取得数据,在网卡中完成数据封装后传输到接收端,再由接收端 RNIC 将数据解析剥离,将有效负载 (payload) 直接放入用户态内存中完成数据传输。 +这一过程中 CPU 除了必要的控制面功能外,几乎不用参与数据传输。数据就像是通过 RNIC 直接写入到远程节点的内存中一样。因此,与传统网络相比,RDMA 将 CPU 从网络传输中解放了出来,使得网络传输就像是远程内存直接访问一样方便快捷。 + + + +对比传统网络协议,RDMA 网络协议具有以下三个特点: + +- 旁路软件协议栈 + +RDMA 网络依赖 RNIC 在网卡内部完成数据包封装与解析,旁路了网络传输相关的软件协议栈。对于用户态应用程序,RDMA 网络的数据路径旁路了整个内核;对于内核应用程序,则旁路了内核中的部分协议栈。由于旁路了软件协议栈,将数据处理工作卸载到了硬件设备,因而 RDMA 能够有效降低网络时延。 + +- CPU 卸载 + +RDMA 网络中,CPU 仅负责控制面工作。数据路径上,有效负载由 RNIC 的 DMA 模块在应用缓冲区和网卡缓冲区中拷贝 (应用缓冲区提前注册,授权网卡访问的前提下),不再需要 CPU 参与数据搬运,因此可以降低网络传输中的 CPU 占用率。 + +- 内存直接访问 + +RDMA 网络中,RNIC 一旦获得远程内存的访问权限,即可直接向远程内存中写入或从远程内存中读出数据,不需要远程节点参与,非常适合大块数据传输。 + +# 回到 SMC-R + +通过上述介绍,相信读者对 RDMA 主要特点以及性能优势有了初步的了解。不过,虽然 RDMA 技术能够带来可喜的网络性能提升,但是想使用 RDMA 透明提升现有 TCP 应用的网络性能仍有困难,这是因为 RDMA 网络的使用依赖一系列新的语义接口,包括 ibverbs 接口与 rdmacm 接口 (后统称 verbs 接口)。 + +相较于传统 POSIX socket 接口,verbs 接口数量多,且更接近硬件语义。对于已有的基于 POSIX socket 接口实现的 TCP 网络应用,想要享受 RDMA 带来的性能红利就不得不对应用程序进行大量改造,成本巨大。 +因此,我们希望能够在使用 RDMA 网络的同时沿用 socket 接口,使现有 socket 应用程序透明的享受 RDMA 服务。针对这一需求,业界提出了以下两个方案: + +- 其一,是基于 libvma 的用户态方案 +libvma 的原理是通过 LD_PRELOAD 来将应用所有 socket 调用引入自定义实现,在自定义实现中调用 verbs 接口,完成数据收发。但是,由于实现在用户态,libvma 一方面缺少内核统一资源管理,另一方面对 socket 接口的兼容性较差。 + +- 其二,是基于 SMC-R 的内核态方案 +作为内核态协议栈,SMC-R 对 TCP 应用的兼容性相较于用户态方案会好很多,这种 100% 兼容意味着极低的推广和复用成本。此外,实现在内核态使得 SMC-R 协议栈中的 RDMA 资源能够被用户态不同进程共享,提高资源利用率的同时降低频繁资源申请与释放的开销。不过,完全兼容 socket 接口就意味着需要牺牲极致的 RDMA 性能 (因为用户态 RDMA 程序可以做到数据路径旁路内核与零拷贝,而 SMC-R 为了兼容 socket 接口,无法实现零拷贝),但这也换来兼容与易用,以及对比 TCP 协议栈的透明性能提升。未来,我们还计划拓展接口,以牺牲小部分兼容性的代价将零拷贝特性应用于 SMC-R,使它的性能得到进一步改善。 + +### 2.1 透明替换 TCP + +> SMC-R is an open sockets over RDMA protocol that provides transparent exploitation of RDMA (for TCP based applications) while preserving key functions and qualities of service from the TCP/IP ecosystem that enterprise level servers/network depend on! + +SMC-R 作为一套与 TCP/IP 协议平行,向上兼容 socket 接口,底层使用 RDMA 完成共享内存通信的内核协议栈,其设计意图是为 TCP 应用提供透明的 RDMA 服务,同时保留了 TCP/IP 生态系统中的关键功能。 +为此,SMC-R 在内核中定义了新的网络协议族 AF_SMC,其 proto_ops 与 TCP 行为完全一致。 + +``` +/* must look like tcp */ +static const struct proto_ops smc_sock_ops = { + .family = PF_SMC, + .owner = THIS_MODULE, + .release = smc_release, + .bind = smc_bind, + .connect = smc_connect, + .socketpair = sock_no_socketpair, + .accept = smc_accept, + .getname = smc_getname, + .poll = smc_poll, + .ioctl = smc_ioctl, + .listen = smc_listen, + .shutdown = smc_shutdown, + .setsockopt = smc_setsockopt, + .getsockopt = smc_getsockopt, + .sendmsg = smc_sendmsg, + .recvmsg = smc_recvmsg, + .mmap = sock_no_mmap, + .sendpage = smc_sendpage, + .splice_read = smc_splice_read, +}; +``` + +由于 SMC-R 协议支持与 TCP 行为一致的 socket 接口,使用 SMC-R 协议非常简单。总体来说有两个方法: + + + +- 其一,使用 SMC-R 协议族 AF_SMC 开发 +通过创建 AF_SMC 类型的 socket,应用程序的流量将进入到 SMC-R 协议栈; +- 其二,透明替换协议栈 +将应用程序创建的 TCP 类型 socket 透明替换为 SMC 类型 socket。**透明替换可以通过以下两种方式实现**: + +- 使用 LD_PRELOAD 实现协议栈透明替换。在运行 TCP 应用程序时预加载一个动态库。在动态库中实现自定义 socket() 函数,将 TCP 应用程序创建的 AF_INET 类型 socket 转换为 AF_SMC 类型的 socket,再调用标准 socket 创建流程,从而将 TCP 应用流量引入 SMC-R 协议栈。 + ``` +int socket(int domain, int type, int protocol) +{ + int rc; + + if (!dl_handle) + initialize(); + + /* check if socket is eligible for AF_SMC */ + if ((domain == AF_INET || domain == AF_INET6) && + // see kernel code, include/linux/net.h, SOCK_TYPE_MASK + (type & 0xf) == SOCK_STREAM && + (protocol == IPPROTO_IP || protocol == IPPROTO_TCP)) { + dbg_msg(stderr, "libsmc-preload: map sock to AF_SMC\n"); + if (domain == AF_INET) + protocol = SMCPROTO_SMC; + else /* AF_INET6 */ + protocol = SMCPROTO_SMC6; + + domain = AF_SMC; + } + + rc = (*orig_socket)(domain, type, protocol); + + return rc; +} +``` +开源用户态工具集 [smc-tools](https://github.com/ibm-s390-linux/smc-tools) 中的 smc_run 指令即实现上述功能。 +- 通过 ULP + eBPF 实现协议栈透明替换。SMC-R 支持 TCP ULP 是龙蜥社区高性能网络 SIG 贡献到上游 Linux 社区的新特性。用户可以通过 setsockopt() 指定新创建的 TCP 类型 socket 转换为 SMC 类型 socket。同时,为避免应用程序改造,用户可以通过 eBPF 在合适的 hook 点 (如 BPF_CGROUP_INET_SOCK_CREATE、BPF_CGROUP_INET4_BIND、BPF_CGROUP_INET6_BIND 等) 注入 setsockopt(),实现透明替换。这种方式更适合在容器场景下可以依据自定义规则,批量的完成协议转换。 + ``` +static int smc_ulp_init(struct sock *sk) +{ + struct socket *tcp = sk->sk_socket; + struct net *net = sock_net(sk); + struct socket *smcsock; + int protocol, ret; + + /* only TCP can be replaced */ + if (tcp->type != SOCK_STREAM || sk->sk_protocol != IPPROTO_TCP || + (sk->sk_family != AF_INET && sk->sk_family != AF_INET6)) + return -ESOCKTNOSUPPORT; + /* don't handle wq now */ + if (tcp->state != SS_UNCONNECTED || !tcp->file || tcp->wq.fasync_list) + return -ENOTCONN; + + if (sk->sk_family == AF_INET) + protocol = SMCPROTO_SMC; + else + protocol = SMCPROTO_SMC6; + + smcsock = sock_alloc(); + if (!smcsock) + return -ENFILE; + + <...> +} +``` +``` + SEC("cgroup/connect4") +int replace_to_smc(struct bpf_sock_addr *addr) +{ + int pid = bpf_get_current_pid_tgid() >> 32; + long ret; + + /* use-defined rules/filters, such as pid, tcp src/dst address, etc...*/ + if (pid != DESIRED_PID) + return 0; + + <...> + + ret = bpf_setsockopt(addr, SOL_TCP, TCP_ULP, "smc", sizeof("smc")); + if (ret) { + bpf_printk("replace TCP with SMC error: %ld\n", ret); + return 0; + } + return 0; +} +``` +综合上述介绍,TCP 应用程序**透明**使用 RDMA 服务可以体现在以下两个方面: +- TCP 协议栈透明替换为 SMC-R 协议栈 +- 利用 SMC-R 协议栈透明使用 RDMA 技术 + +### 2.2 SMC-R 架构 + + + +SMC-R 协议栈在系统内部处于 socket 层以下,RDMA 内核 verbs 层以上。是一个具备 ***"hybrid"*** 特点的内核网络协议栈。这里的 ***"hybrid"*** 主要体现在 SMC-R 协议栈中混合了 RDMA 流与 TCP 流: + +#### 数据流量基于 RDMA 网络传输 + +SMC-R 使用 RDMA 网络来传递用户态应用程序的数据,使应用程序透明的享受到 RDMA 带来的性能红利,即上图中黄色部分所示。 +发送端应用程序的数据流量通过 socket 接口从应用缓冲区来到内核内存空间;接着通过 RDMA 网络直接写入远程节点的一个内核态 ringbuf (remote memory buffer, RMB) 中;最后由远程节点 SMC-R 协议栈将数据从 RMB 拷贝到接收端应用缓冲区中。 + + +显然,SMC-R 名称中的共享内存通信指的就是基于远程节点 RMB 进行通信。与传统的本地共享内存通信相比,SMC-R 将通信两端拓展为了两个分离的节点,利用 RDMA 实现了基于“远程”共享内存的通信。 + + + +目前,RDMA 网络的主流实现有三种:InfiniBand、RoCE 和 iWARP。其中,RoCE 作为在高性能与高成本中权衡的方案,在使用 RDMA 的同时兼容以太网协议,既保证了不错的网络性能,同时也降低了网络组建成本,因此倍受企业青睐,Linux 上游社区版本的 SMC-R 也因此使用 RoCE v1 和 v2 作为其 RDMA 实现。 +而 iWARP 则是基于 TCP 实现了 RDMA,突破了其余两者对无损网络的刚性需求。iWARP 具备更好的可拓展性,非常适用于云上场景。阿里云弹性 RDMA (eRDMA) 基于 iWARP 将 RDMA 技术带到云上。**阿里云操作系统 Alibaba Cloud Linux 3 与龙蜥社区开源操作系统 Anolis 8 中的 SMC-R 也进一步支持了 eRDMA (iWARP),使云上用户透明无感的使用 RDMA 网络。** + +#### 依赖 TCP 流建立连接 + +除 RDMA 流外,SMC-R 还会为每个 SMC-R 连接配备一条 TCP 连接,两者具有相同的生命周期。TCP 流在 SMC-R 协议栈中主要担负以下职责: + +- 动态发现对端 SMC-R + +在 SMC-R 连接建立前,通信两端并不知道对端是否同样支持 SMC-R。因此,两端会首先建立一条 TCP 连接。在 TCP 连接三次握手的过程中通过发送携带特殊的 TCP 选项的 SYN 包表示支持 SMC-R,同时检验对端发送的 SYN 包中的 TCP 选项。 + + +- 回退 + +若在上述过程中,通信两端其一无法支持 SMC-R 协议,或是在 SMC-R 连接建立过程中无法继续,则 SMC-R 协议栈将回退至 TCP 协议栈。回退过程中,SMC-R 协议栈将应用程序持有的文件描述符对应的 socket 替换为 TCP 连接的 socket。应用程序的流量将通过这条 TCP 连接承载,以保证数据传输不会中断。 + +- 帮助建立 SMC-R 连接 + +若通信两端均支持 SMC-R 协议,则将通过 TCP 连接交换 SMC-R 连接建立消息 (建连过程类似 SSL 握手)。此外,还需要使用此 TCP 连接交换两侧的 RDMA 资源信息,帮助建立用于数据传输的 RDMA 链路。 + + +通过上述介绍,相信读者对 SMC-R 总体架构有了初步的了解。SMC-R 作为一个 ***"hybrid"*** 解决方案,充分利用了 TCP 流的通用性和 RDMA 流的高性能。后面的文章中我们将对 SMC-R 中的一次完整通信过程进行分析,届时读者将进一步体会到 ***"hybrid"*** 这一特点。 + +本篇作为 SMC-R 系列文章的首篇,希望能够起到一个引子的作用。回顾本篇,我们主要回答了这几个问题: + +- 为什么要基于 RDMA ? + +因为 RDMA 能够带来网络性能提升 (吞吐/时延/CPU占用率); + +- 为什么 RDMA 能够带来性能提升? + +因为旁路了大量软件协议栈,将 CPU 从网络传输过程中解放出来,使数据传输就像直接写入远程内存一样简单; + +- 为什么需要 SMC-R ? + +因为 RDMA 应用基于 verbs 接口实现,已有的 TCP socket 应用若想使用 RDMA 技术改造成本高; + +- SMC-R 有什么优势? + +SMC-R 完全兼容 socket 接口,模拟 TCP socket 接口行为。使 TCP 用户态应用程序能够透明使用 RDMA 服务,不做任何改造就可以享受 RDMA 带来的性能优势。 + +- SMC-R 的架构特点? + +SMC-R 架构具有 ***"hybrid"*** 的特点,融合了 RDMA 流与 TCP 流。SMC-R 协议使用 RDMA 网络传输应用数据,使用 TCP 流确认对端 SMC-R 能力、帮助建立 RDMA 链路。 diff --git "a/sig/high-perf-network-sig/content/projects/SMC/2_\345\216\237\347\220\206\350\247\243\350\257\273-\347\263\273\345\210\227\350\247\243\350\257\273_SMC-R_\344\272\214.md" "b/sig/high-perf-network-sig/content/projects/SMC/2_\345\216\237\347\220\206\350\247\243\350\257\273-\347\263\273\345\210\227\350\247\243\350\257\273_SMC-R_\344\272\214.md" new file mode 100644 index 0000000000000000000000000000000000000000..e347517b5031915482c23f12eca691972576749e --- /dev/null +++ "b/sig/high-perf-network-sig/content/projects/SMC/2_\345\216\237\347\220\206\350\247\243\350\257\273-\347\263\273\345\210\227\350\247\243\350\257\273_SMC-R_\344\272\214.md" @@ -0,0 +1,186 @@ +> 原文链接:[系列解读 SMC-R (二):融合 TCP 与 RDMA 的 SMC-R 通信 | 龙蜥技术](https://mp.weixin.qq.com/s?search_click_id=2084229434777311559-1672728623690-5538769394&__biz=Mzg4MTMyMTUwMQ==&mid=2247494585&idx=1&sn=2d025e849833cdd3ecbe0b1754a32aef&chksm=cf6518cbf81291dd2653a014e00308e49ee257deee6545f6e82602c39963c74613c168b5e8a7&scene=0&subscene=10000&clicktime=1672728623&enterid=1672728623&sessionid=0&ascene=65&fasttmpl_type=0&fasttmpl_fullversion=6485008-zh_CN-zip&fasttmpl_flag=0&realreporttime=1672728623725&devicetype=android-29&version=28001759&nettype=WIFI&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&exportkey=n_ChQIAhIQktJ6bQmIv3NiRYGRAbRosxLcAQIE97dBBAEAAAAAAMNdK7DEVIYAAAAOpnltbLcz9gKNyK89dVj0CrfxwLkASXQVVw99WBLScNOeEGq4CybsSRtMLlLXX5vSrnZi7CPSV6dwcBi%2Fq%2BETLKeRG7c4bSF%2FEPNBR80y3r3h0TSAUcw8wr1WX0WjCcS57xULJ2CFvkd%2BbavO%2FKPwMRWsSCyMneKPAd%2FPasjhI9D1fF0eVb9KKBxeuEFRIo%2FOBOydEAcuysGgtlerrjHqbwwno5Vd5qUne3Whv5%2BhgS%2FvR0DUXK212jj%2BpBm8aZDMEFnXv1M%3D&pass_ticket=LXS2YRVcmamkGMyhelL4ieilHzCrCcudro4S8I%2BudsxWwnZ7B5Mb8U1F8Q9vu59k3OVbQ8p4nfoHVEdr1Xcixw%3D%3D&wx_h) + +# 引言 + +通过上一篇文章 [《系列解读 SMC-R (一):透明无感提升云上 TCP 应用网络性能》](https://openanolis.cn/sig/high-perf-network/doc/734387760257141914?)我们了解到,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 协议的一端发送的 SYN/ACK 中携带了特殊的 TCP 选项 (Kind = 254,Magic Number = 0xe2d4),用于表明自身支持 SMC-R。通过检查对端发送的 SYN/ACK,通信节点得知其 SMC-R 能力,进而决定是否继续使用 SMC-R 通信。 + + + + + +### 2.2 协议回退 + +若在上述 TCP 握手过程中,通信两端其一表示无法支持 SMC-R,则进入协议回退 (fallback) 流程。 + +协议回退时,应用程序所持有的 fd 对应的 smc socket 将被替换为 clcsock。从此,应用程序将使用 TCP 协议通信,从而确保数据传输不会因为协议兼容问题而中断。 + +需要注意的是,协议回退仅发生在通信协商过程中,如前文提到的 TCP 握手阶段,或是下文提到的 SMC-R 建连阶段。为便于跟踪诊断,SMC-R 协议详细分类了潜在的回退可能,用户可以通过用户态工具 smc-tools 观测到协议回退事件及原因。 + + + +### 2.3 建立 SMC-R 连接 + +若在 TCP 握手中,两端均表示支持 SMC-R,则进入 SMC-R 建连流程。SMC-R 连接的建立依赖 TCP 连接传递控制消息,这种控制消息被称为 Connection Layer Control (CLC) 消息。 + + + +CLC 消息的主要职责是同步通信两端的 RDMA 资源以及共享内存等信息。使用 CLC 消息建立 SMC-R 连接的过程与 SSL 握手类似,主要包含 Proposal、Accept、Decline、Confirm 等语义。在建连过程中,若遇到不可恢复的异常 (如 RDMA 资源失效) 导致后续 SMC-R 通信无法继续,也将触发前文所述的协议回退流程。 + +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。 + + + +#### 2.3.2 建立 RDMA 链路 + +通信两端将已创建的 RDMA 资源通过 CLC 消息同步到对端,进而在两端之间建立起基于 RC (Reliable Connection) QP 的 RDMA 链路。SMC-R 中将这种点对点逻辑上的 RDMA 链路称为 SMC-R Link。一条 SMC-R Link 承载着多条 SMC-R 连接的数据流量。 + + + +若通信节点之间存在不止一对可用的 RNIC,则会建立不止一条 Link。这些 Link 在逻辑上组成一个小组,称为 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。 + + + +其中,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 内存创建/销毁对建连性能的影响。 + + + +### 2.4 验证 SMC-R Link + +由于 first contact 场景下新建立的 SMC-R Link 尚未经过验证,所以在正式使用 Link 传输应用数据前,通信两端会基于 Link 发送 Link Layer Control (LLC) 消息,用于检验 Link 是否可用。 + + + +LLC 消息通常为请求-回复模式,用于传输 Link 层面的控制信息,如添加/删除/确认 Link,确认/删除 r_key 等。 + + + +| 类型 | 说明 | +|--------------|-----------------------------------------| +| ADD_LINK | 向 Link Group 中添加新的 Link。 | +| CONFIRM_LINK | 确认新创建的 Link 是否能够正常工作。 | +| DELETE_LINK | 删除一个特定的 Link 或整个 Link Group。 | +| CONFIRM_RKEY | 新增 RMB 时通知 Link 对端。 | +| DELETE_RKEY | 删除一个或多个 RMB 时通知 Link 对端。 | +| TEST_LINK | 确认 Link 是否健康、活跃。 | + +LLC 消息的传输基于 RDMA 的 SEND 操作完成,与之相对的是后文提到的 RDMA WRITE 操作。 + + + +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 连接传输数据。 + + + +应用程序下发到 SMC-R 连接中的数据由关联的 Link 通过 RDMA WRITE 操作写入远程节点 RMB 中。 + + + +与上文提到的 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 相关控制信息用以同步数据读写。 + +| 内容 | 含义 | +|----------------------------|-----------------------------------| +| Sequence number | CDC 消息序列号 | +| Alert token | 发送此消息的 SMC-R 连接 ID | +| Producer cursor | RMB 数据生产游标 (写者更新) | +| Producer cursor wrap seqno | RMB 数据生产 wrap 次数 (写者更新) | +| Consumer cursor wrap seqno | RMB 数据消费wrap 次数 (读者更新) | +| Consumer cursor | RMB 数据消费 游标 (读者更新) | + +在系列文章的第一篇中我们提到,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 应用提供透明无感的网络性能提升。 diff --git "a/sig/high-perf-network-sig/content/projects/SMC/3_\346\200\247\350\203\275\345\261\225\347\244\272-redis\345\222\214nginx\346\200\247\350\203\275\345\261\225\347\244\272.md" "b/sig/high-perf-network-sig/content/projects/SMC/3_\346\200\247\350\203\275\345\261\225\347\244\272-redis\345\222\214nginx\346\200\247\350\203\275\345\261\225\347\244\272.md" new file mode 100644 index 0000000000000000000000000000000000000000..3c8c07c1acb27d002281a222f2bde02e5e7bdd2d --- /dev/null +++ "b/sig/high-perf-network-sig/content/projects/SMC/3_\346\200\247\350\203\275\345\261\225\347\244\272-redis\345\222\214nginx\346\200\247\350\203\275\345\261\225\347\244\272.md" @@ -0,0 +1,140 @@ +作为在 RDMA/eRDMA 场景下对 TCP 应用透明无损替换的技术,SMC 同样也继承了 RDMA 技术的天然优势,在内存数据库、RPC、数据中心内部等场景相比 TCP 能提供更好的网络性能,包括但不限于更低的访问时延,更高的吞吐上限以及更低的 CPU 开销等。考虑到 SMC 兼容 socket 接口的特性,能够快速运行 SMC 的应用很多,因此有极其丰富的相对应的计算性能的测试工具。在本项基础性能测试中,我们选择了两台都是16vCPU 32G内存,基于ecs.c7re.4xlarge规格的添加了ERDMA网卡的阿里云ECS实例。 + +## 软件版本 + +- ERDMA 驱动版本:kernel driver version: 0.2.29 +- Kernel:5.10.134 +- wrk 版本:wrk [epoll] +- nginx 版本:nginx version: nginx/1.20.1 +- redis 版本: redis-server v6.0.5 +- maven 版本:Apache Maven 3.4.5 (Red Hat 3.4.5-5.1) + +## 机器规格 + + + +为了能够对 SMC 技术进行深入的了解,本次评测将常见应用的基础性能工具进行评测,包括 + +1. 经典 microbenchmark +2. 标准业务应用 +3. 数据库等基础设施 + +本次测试包括时延测试,吞吐测试和CPU开销测试三个部分。看看 SMC 技术是如何在透明替换中保持ERDMA技术的性能收益。 + +## Redis 应用性能 + +作为高性能的内存数据库的代表,与复杂的传统数据库不同,包括主从同步在内的Redis的处理性能很大程度上会受到网络性能的制约,这里这里我们 +使用 经典的 Redis测试工具 redis-benchmark 来测试验证SMC-R的性能。测试脚本如下: + +``` +#server script +redis-server --save '' --appendonly no --protected-mode no --daemonize yes +``` + +``` +#client script +redis-benchmark -h ${serverAddress} -q -n $requests -c $connections -d $size -t GET,SET --thread ${threads} +``` + +### 吞吐收益 + +在针对Redis的性能测试,这里我们使用了 redis-benmark下的 GET/SET 测试模型,对redis数据性能进行了多次测试,稳定的测试结果如下: + + + + + +从测试结果可以看出,无论是GET测试还是SET测试,SMC-R相对于TCP都带来了至少40%+的性能测试数据提升. +但如果CPU开销也额外花费了40%,数据就没有显著意义了,因此CPU开销也是及其重要的数据,接下来我们将在同样的测试条件下对SMC-R和TCP的CPU开销数据进行对比。 + +### CPU 开销 + + + +从测试结果可以看出,SMC-R相对于TCP花费了额外的11%左右的CPU开销,这主要是因为显著的提升了吞吐导致用户态处理CPU增多导致的(吞吐提升了40%+)。 +另一方面,因为ERDMA提供的协议栈卸载和内核bypass能力,它允许应用程序直接通过目标主机内的内存空间进行数据传输,具有ERDMA能力的以太网卡负责将保证他们之间连接的可靠性。 +因此能够做到在大幅提高吞吐收益的同时,可以做到低CPU开销。 + +## Nginx 应用性能 + +nginx作为一个高性能的HTTP和反向代理服务器,在国内外被广泛应用,对于HTTP服务器来说,最重要的莫过于其响应请求的延时和处理请求的能力。 +这里我们将基于 经典的wrk/nginx测试模型 来快速验证 SMC 的性能。测试脚本如下: + +``` +#nginx server config + +user nginx; +worker_processes auto; +error_log /var/log/nginx/error.log; +worker_rlimit_nofile 10240; +pid /run/nginx.pid; + +# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. +include /usr/share/nginx/modules/*.conf; + +events { + worker_connections 10240; +} + +http { + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log off; + + sendfile off; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 300s; + keepalive_requests 1000000; + types_hash_max_size 4096; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # Load modular configuration files from the /etc/nginx/conf.d directory. + # See http://nginx.org/en/docs/ngx_core_module.html#include + # for more information. + include /etc/nginx/conf.d/*.conf; + + open_file_cache max=10240000 inactive=60s; + open_file_cache_valid 80s; + open_file_cache_min_uses 1; + + server { + listen 80 backlog=1024; + server_name _; + root /usr/share/nginx/html; + } +} +``` + +``` +#client script +wrk http://${server}/${path} -t${thread} -c{connection} -d30 +``` + +对于大多数RPC应用,响应时延的重要性毋庸置疑,这直接影响到了用户能够感受到的真实时间。因此在Nginx测试中,我们重点额外引入了时延维度,接下来我们将通过一组数据来观察,SMC-R能否相对于TCP减少数据延迟,我们拭目以待。特别的,这里测试全部打满了CPU,因此CPU开销情况没有单独列出。 + +### 时延收益 + +这里展示了在不同文件大小,不同线程数以及不同连接数下的时延数据情况: + + + +我们可以看到,SMC-R在优化请求的时延上也有显著收益,在不同请求数据大小下,相对于TCP减少了20%到40%左右的时延,受益于ERDMA快速的协议栈处理和更短的数据路径,显著的时延收益也不足为奇了。 +因此,即使您的RPC应用不太关心吞吐的收益,SMC-R也可以帮助你在优化请求的时延上大做文章,在不需要任何代码改动的情况下,便可以使用SMC-R来获得收益。 + +### 吞吐收益 + + + +同样的,在Nginx测试中,测试的吞吐数据也同样有显著提升。如上图所示,在不同测试参数下,相对于TCP,SMC-R可以带来21%到37.6%的吞吐提升。 + +## 结论 + +受益于 SMC 在内核中无损透明替换的语义,SMC 兼容 socket 接口的特点使 TCP 应用程序无需任何改造即可运行在 SMC 协议栈上;底层使用的 eRDMA 网络使 SMC 拥有相较于 TCP 更好的网络性能。SMC 协议栈通过 TCP 连接自主发现对侧 SMC 能力,协商成功后使用 SMC 协议栈承载应用数据流量;协商失败则安全回退至 TCP/IP 协议栈,保证数据正常传输。阿里云 Alibaba Cloud Linux 3 操作系统基于阿里云弹性 RDMA(elastic RDMA, eRDMA)技术首次将 SMC-R 带入云上场景,实现云上 TCP 协议栈的透明无损替换,为数据库、RPC、批量数据传输等场景提供相比 TCP 更好的网络性能。相较于上游 Linux SMC-R 实现,Alibaba Cloud Linux 3 中的 SMC-R 更适配阿里云 eRDMA 技术、拥有更好的性能、可靠的稳定性、丰富成熟的透明替换方案和及时的更新维护;在这些场景中,我们可以观测到 + +- 平均20%的延迟收益; +- 最大40+的每CPU吞吐收益,在合适的场景中甚至可以达到50%+。 diff --git "a/sig/high-perf-network-sig/content/projects/SMC/4_\344\275\277\347\224\250\350\257\264\346\230\216-\344\275\277\347\224\250\346\214\207\345\215\227.md" "b/sig/high-perf-network-sig/content/projects/SMC/4_\344\275\277\347\224\250\350\257\264\346\230\216-\344\275\277\347\224\250\346\214\207\345\215\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..b40a89a07feb8832b33b4dab9ebc5eefcba2e4ca --- /dev/null +++ "b/sig/high-perf-network-sig/content/projects/SMC/4_\344\275\277\347\224\250\350\257\264\346\230\216-\344\275\277\347\224\250\346\214\207\345\215\227.md" @@ -0,0 +1,351 @@ +Alibaba Cloud Linux 3 提供的共享内存通信(Shared Memory Communication,SMC)是一种兼容 socket 层,使用硬件卸载的共享内存技术实现的高性能内核网络协议栈。SMC 支持基于 RDMA 卸载的内存共享技术 SMC over RDMA,简称 SMC-R。 + +SMC-R 由 IBM 于 2017 年开源至 Linux 4.11 并持续维护至今,其协议标准可参考 RFC 7609。阿里云 Alibaba Cloud Linux 3 操作系统基于阿里云弹性 RDMA(elastic RDMA,eRDMA)技术首次将 SMC-R 带上云上场景,实现对 TCP 应用透明无损的替换,提供高性能、普惠的硬件卸载网络。 + +本文将介绍 SMC-R 及其使用方法。 + +# 一、背景介绍 + +SMC 基于共享内存的数据交互模型依赖 RDMA 提供的内存操作原语。 + +RDMA 技术将网络协议栈下沉至 RDMA 网卡 (RNIC) 实现,使网络节点能够绕过内核直接访问远程内存。与传统 TCP 网络相比,RDMA 网络减少了数据在内存间拷贝的次数,降低了网络传输过程中消耗的 CPU 资源,进而提高了网络吞吐、降低了网络时延。 + + + +因此,RDMA 被广泛应用于数据密集型和计算密集型场景中,是高性能计算、机器学习、数据中心、海量存储等领域的重要解决方案。 + +过去,RDMA 只能在一些数据中心网络中通过网卡和交换机紧密配合使用,部署复杂度高。如今,阿里云弹性 RDMA 将复杂的 RDMA 技术带到云上,使普通的 ECS 用户也能使用高性能的 RDMA 传输,无需关心底层复杂的网卡、交换机等物理网络环境配置,使其成为一种亲民、普惠的技术。 + +但是,由于 RDMA 技术基于 IB verbs 接口,相较于常用的 POSIX socket 接口存在巨大的差异。现有 socket 应用程序迁移至 RDMA 网络往往面临着大量的改造,使用 RDMA 技术仍存在较高的技术门槛。 + +于是,为了充分挖掘弹性 RDMA 的潜力,为云上用户提供更好的网络性能,Alibaba Cloud Linux 3 与龙蜥社区 Anolis OS 提供并优化了 SMC-R。在高效使用 RDMA 技术的同时,保留对标准 TCP 应用的兼容,使更多的应用无需做任何修改便能享受 RDMA 所带来的性能红利。 + +# 二、核心优势 + +## 1. 高性能 + +得益于 RDMA 技术将网络协议栈从内核卸载至硬件网卡,SMC-R 相较于传统 TCP 协议栈在合适场景下可获得更低的时延、更高的吞吐量,以及更小的 CPU 负载。 + +- 硬件卸载; +- 更低的网络时延、更高的吞吐、更少的 CPU 占用率; +- 高效可靠的远程内存直接访问; + +## 2. 透明替换 + +得益于 SMC-R 对 POSIX socket 接口的兼容以及协议栈透明替换能力,socket 应用程序可以在无修改的情况下完成 TCP 协议栈到 SMC-R 协议栈的切换,无需额外的应用改造或开发成本。 + +- 兼容 socket 接口的共享内存通信; +- 多维度协议栈无损透明替换; +- 自动协议协商和安全回退机制; + +# 三、技术架构 + +## 1. 协议层次与透明替换 + +SMC-R 工作于内核空间,向上支持用户态程序通过 socket 接口描述的网络行为,向下使用 IB verbs 接口实现 RDMA 网络传输。RDMA 资源的使用、管理与维护均由 SMC-R 协议栈完成,应用程序不会感知到内核中的 RDMA 实体。 + + + +Alibaba Cloud Linux 3 提供了进程或 net namespace 纬度的 TCP 至 SMC-R 协议栈透明替换机制。通过 LD_PRELOAD/eBFP 或 net.smc.tcp2smc sysctl 将应用程序原本的 AF_INET 协议族 socket 透明替换为 AF_SMC 协议族 socket,让网络传输运行于 SMC-R 协议栈,使应用程序不做任何修改即可享受 RDMA 带来的网络性能提升。 + +## 2. 自动协商和安全回退 + +SMC-R 具备自动协商协议、动态回退的能力。 + +建立 SMC-R 通信前,协议栈首先在内核中与通信对端建立 TCP 连接,在握手过程中使用特殊的 TCP 选项表明自身支持 SMC-R,并确认对端同样支持 SMC-R。 + +若协商成功,通信两侧 SMC-R 协议栈将创建新的,或复用已有的 RDMA 资源,建立可用的 RDMA RC 链路。从此网络传输将基于 RDMA 网络完成。 + +若协商失败,如一侧不具备 RDMA 设备,SMC-R 协议栈将自动回退到 TCP 协议栈,使用协商时建立的 TCP 连接完成数据传输。 + +需要注意的是,SMC-R 仅支持连接协商期间回退至 TCP 协议栈,但不支持数据传输过程中的回退。 + + + +