QYJS    前沿技术
前沿技术
RDMA在Polaris下一代存储系统的应用和优化
文 | 新华三集团云与计算存储产品线 付志华

摘要

随着AI智算应用的爆发式增长,特别是大模型的应用,数据的存储和访问成为关键的一环。如何才能让数据自由而流畅的流动起来,成为存储系统需要考虑的首要问题。传统分布式存储以TCP/IP网络为传输标准,在数据量暴增的今天,特别是随着全闪普及后,网络显得越来越力不从心。而RDMA技术正成为新时代分布式存储的弄潮儿。

本文详细描述了H3C下一代存储Polaris是如何将RDMA技术应用到存储协议栈中,构建起分布式存储底层坚实的网络底座,实现低时延,高带宽,高吞吐的业务目标。

关键词

RDMA;RPC;单边/双边传输;协程;NUMA亲和;零拷贝

1 新的计算范式催生新的存储需求

在各行各业数字化转型深入的当下,数据呈爆炸式增长。特别是随着人工智能、科学计算等智算场景的快速发展,海量非结构化数据的实时处理与超大规模模型训练对存储系统提出了前所未有的挑战。当前,AI智算中心建设正在全国各地如火如荼地展开。AI智算领域对算力和存储的需求呈指数级增长。这种需求的快速扩张不仅源于模型训练数据的庞大体量,还由于这些模型包含数以十亿计乃至万亿的参数,需要强大的计算能力来支撑其训练和运作。在AI训练过程中,需要在极短的时间内处理大量的数据,包括但不限于模型训练数据、参数更新和模型输出结果。这一过程的高效执行依赖于存储系统的良好表现,尤其是其带宽和延迟性能,直接决定了AI训练的速度和效率。在大模型开发过程中,训练中断是常见的现象,可能由诸如网络问题、硬件故障及其他未知原因引起。为了减小损失并提高效率,多数大模型厂商会使用“检查点”(Checkpoint)技术。通过定期保存当前的训练状态,一旦系统中断可从最后的检查点继续,从而避免重新训练整个模型。Checkpoint本质上是一组大小从GB到TB不等的大型数据文件。在处理这些Checkpoint文件时,优化读写性能显得尤为重要。从存储角度来看,这一优化主要集中在提升大I/O操作的效率上。因此,AI计算等新的计算范式出现,催生了新的存储需求。存储系统在新时代背景下,需要向更高(高带宽)、更快(低延迟)、更强(强大存力)的目标迈进。

分布式存储凭借其横向扩展、多节点协同和全局资源池化的特性,正成为支撑智算基础设施的核心基座。分布式存储的工作原理是将各个存储节点使用网络互连的方式构建成集群,向外部提供更加可靠的高性能服务。因此,网络是影响分布式存储集群整体性能的一个重要因素。数据读写、复制、恢复、再平衡等关键行为,以及各组件间各端口的心跳检测和通信,无一不受到网络的影响。随着节点网络带宽的提升,尤其是进入100G+的时代,如何才能发挥出网络的最佳性能?是不断通过补丁式的优化传统的网络实现,还是彻底颠覆现有的技术框架?本文将围绕这个问题,探究H3C Polaris下一代存储在这方面的努力。

2 TCP/IP阿喀琉斯之踵

长期以来,TCP/IP都是Linux系统的首选标准通信机制。传统内核网络协议栈的设计理念源于早期对通用性、兼容性以及内核资源隔离的高度重视。其核心思路是在内核空间内实现完整的网络协议处理功能,并通过向用户空间提供类似BSD Sockets的统一应用程序接口,为不同架构的应用与多样化的硬件平台建立标准化且广泛兼容的连接通道。与此同时,借助系统调用和内存空间隔离等技术手段,该架构有效实现了应用程序之间、以及应用程序与内核之间的资源保护与隔离。这样的设计显著强化了协议栈的跨平台适应能力和软硬件兼容性,并在多任务并发运行的环境中,进一步提高了系统的安全防护能力和运行稳定性。

然而,时过境迁,如今AI智算数据中心的规模早已不可同日而语,在其所面临的高并发、高带宽、低时延场景下,传统的TCP/IP软硬件架构的短板越来越明显。在早十几年,CPU的速率还远远大于网卡和硬盘速率。那时CPU还不是需要考虑的重点。但随着网卡迈向百G甚至更高,以及SSD全闪硬盘的普及,CPU在访问外设方面的消耗变的越来越多。在分布式存储系统中,一向以稳定和包容著称的TCP/IP网络,竟成为了阿喀琉斯之踵,表现在以下方面:

◆频繁的系统调用会触发应用在用户态与内核态之间来回切换。

◆网络消息收发会频繁触发硬中断和软中断,不断打断进程的执行。

◆数据从应用到协议栈再到网卡,需要进行多次拷贝,消耗大量CPU。

◆多线程共享的结构需要通过锁机制避免跨核竞争带来的冲突,但同时也导致CPU缓存失效。

以上这些都会严重制约着网络处理的性能。传统的TCP/IP协议栈的高度通用性和兼容性设计,也使其难以针对特定应用场景进行深度优化,在进行各存储节点互连时很容易形成性能瓶颈。新时代背景下的分布式存储,迫切需要采用一种新的网络技术。

3 RDMA成为救世主

为了解决传统TCP/IP协议在网络传输时所引入的较高时延和对服务器资源的过度消耗等问题,采用RDMA技术是当下一种理想的选择。RDMA技术其实早在21世纪初就出现了,但当时并未普及,原因是在那个年代,CPU的速率远远超过网卡和硬盘等外设,CPU不是瓶颈。随着网卡速率越来越高,以及SSD全闪硬盘的普及,这些外设的CPU消耗就不得不考虑了。RDMA是一种高性能网络数据传输技术,它允许计算机绕过操作系统内核和CPU,直接通过网络适配器访问远程主机内存。其核心原理是由网卡硬件实现内存到内存的直接传输,彻底消除了传统TCP/IP网络通信中的性能瓶颈。RDMA具备高吞吐、低延迟、内核旁路以及近乎零CPU消耗等显著优势。因此,我们可以看到,在存储领域涌现了一系列采用RDMA的协议改进技术,例如iSER, NFS over RDMA, SMR, NVMe Over RDMA等等。这些技术都试图利用RDMA技术带来的红利,达到改善性能的目的。那流程上RDMA和TCP到底有什么区别呢?下图是传统TCP/IP和RDMA的IO栈流程差异示意图。可以看到,RDMA通信在数据路径上完全绕过了linux内核,由网卡在硬件层面完成整个IB协议报文的处理。交给上层用户态程序直接就是真正的payload,大大节省了CPU的消耗。

图1 T CP/IP和RDMA流程差异

当前RDMA技术的实现方式主要有InfiniBand、RoCE、iWARP三种。

◆IB(InfiniBand):基于InfiniBand 架构的RDMA 技术,由IBTA(InfiniBand Trade Association)提出。InfiniBand是专为RDMA设计的网络,主要应用在HPC领域,其有一整套完整的框架和链路层到传输层规范,架构较为封闭,需要用专用的硬件设备搭建一套独立的组网。

◆RoCE(RDMA over Converged Ethernet):基于以太网的RDMA 技术,由IBTA 提出。包括RoCE v1和RoCE v2。RoCE v1基于以太网链路层封装IB报文,适用于单个二层网络。由于缺乏三层路由功能,因此RoCE v1的应用较为有限。RoCE v2在RoCE v1的基础上进行了改进,采用以太网的UDP协议对IB协议报文进行封装。这使得RoCE v2具备了三层路由能力和更好的扩展性。

◆iWARP(Internet Wide Area RDMA Protocal):基于TCP/IP 协议的RDMA 技术,由IETF标准定义。基于TCP协议实现的iWARP协议能在有损网络场景中提供比RoCE更好的可靠性。但相对的,TCP协议的连接机制和可靠性保障机制会带来大量的开销,这导致iWARP性能比RoCE和IB协议更低。

图2 RDMA三种不同实现

在协议的选择上,Infiniband从协议到软硬件封闭,其性能虽然最优,但成本也最高,因为需要全套专用的设备,包括网卡、光缆和交换机等。这对于通用标准化的分布式存储并不友好。而在RoCE和iWARP选择上,虽然RoCE在数据重传和拥塞控制上受到UDP协议自身的限制,需要无损网络的环境支持,但在综合生态、协议效率和复杂度等多方面因素评估下,我们更加看好RoCE未来的发展。在极致的性能诉求下,RoCE 也会比 iWARP 具有更强的潜力。当前我们主要采用的就是RoCEv2的RDMA 技术路线。

RDMA虽然是一种高效的网络传输技术,但要用好并不容易,并不是将传统socket编程接口进行简单替换即可。相比传统socket,RDMA编程更接近底层硬件。特别是在当前闪存介质普及的情况下,要完全发挥RDMA与新型存储设备的性能优势,需要从整体框架上进行RDMA适配,将IO路径上各模块进行联动优化才能释放出分布式存储的极致性能。

H3C UniStor Polaris系列存储产品,是新华三针对海量数据处理需求推出的新一代分布式存储。Polaris系列基于全自主研发的傲擎存储架构,搭载全新的自研存储引擎,通过RDMA通信构建了计算节点与存储节点以及存储节点之间的高效互连体系,基于SPDK全用户态驱动技术和RDMA技术,重塑整个IO栈,并通过针对性的优化设计,实现了高性能目标,ROCE网络利用率达到了90%以上。

4 高性能RPC框架

RDMA技术本身很好,但应用好RDMA却面临以下几大挑战。

◆编程复杂性:RDMA原生的 Verbs API 接口复杂、使用门槛高。

◆异步编程方式:RDMA为异步编程,相比传统TCP同步编程有着很大的不同。

◆多种传输协议兼容性:RDMA依赖底层硬件(如需要支持RDMA 的网卡、交换机等)。如果说RDMA是星辰大海,那TCP则是人间烟火。我们不能只仰望星空,同时也要脚踏实地。部署RDMA应用时,必须确保向后兼容,以支持原有TCP协议。

基于此,我们研发了一套高性能网络通信组件HRPC。该组件封装并屏蔽了底层复杂的 RDMA Verbs API,对上层业务层呈现高效,简单,易用的RPC接口,对下则对接具体的不同的传输层实现,包括TCP和RDMA,以及未来的DPDK User-level TCP等。除了封装易用接口外,HRPC还和上层存储业务进行了深度融合,确保整个软件栈处理高效。图3是该组件分层架构。

图3 HRPC分层架构

5 IO内存零拷贝

RDMA是一种网卡直接在两个节点间进行数据传输的技术。对于RDMA网卡来说,只需要知道本端和远端进行读写的内存信息(包括内存地址、长度、权限等),就可以由硬件在两个节点间进行直接内存读取。不过硬件最终是通过DMA完成数据搬移,而DMA操作需要的是物理地址。因此这里存在一次应用虚拟内存地址到物理地址的转换。在RDMA技术中,这通过注册MR来实现。简单来说,就是在RDMA传输数据前本端和远端的虚拟内存都需要注册成MR内存。此MR注册过程将由网卡驱动生成虚拟地址和物理地址的映射关系,以及一些内存访问权限信息,并保存到网卡硬件。当网卡需要访问主机内存时,根据虚拟地址查找MR从而获得物理地址,执行DMA数据搬移。

HRPC充分利用了RDMA的内存注册机制,在整个IO处理过程中都使用大页内存,实现了全流程零拷贝。大页内存相比普通页内存,具有更少的页表项,能大大减少TLB cache miss,降低页表遍历开销。我们实现了一个IO大页内存池管理模块ZMEM,该模块在进程初始化的时候会将大页内存切分成多种粒度的memory pool,并提前注册好MR。业务模块在发起数据传输前,按需申请指定大小的内存,内存模块负责从合适的pool里申请内存。此内存可以直接交给RDMA网卡访问。并且由于pool初始化的时候已经注册好MR,此时可以拿来即用。由于注册MR是一个较为耗时的动作。提前注册MR避免了在IO处理过程中临时注册MR带来系统开销。发送端仅保留应用内存拷贝到文件客户端这个过程,文件客户端申请的ZMEM内存,直接由网卡进行DMA读取,并通过RDMA写入远端节点的ZMEM内存。接收端网卡完成RDMA操作后,此块内存由HRPC直接交给业务模块使用。各模块处理时,全程不需要对ZMEM内存进行任何拷贝,通过此方式减少了系统开销并大幅降低了延迟。另外,ZMEM pool还实现了自动扩容机制。当内存池内存耗光的时候,会自动扩容。

同时,我们利用RDMA支持本地处理多个Scatter/gather list分散/聚集条目,即读取多个内存缓冲区并将它们作为一个流发送或获取一个流并将其写入多个内存缓冲区,实现了在处理存储EC分片时,也天然能做到对不同分片的离散的内存可以在一次传输中整体处理。HRPC和应用模块通过传递Scatter/gather list完成不同IO粒度的内存访问,同时RPC句柄控制内存和IO内存分开管理,从而使得IO内存可以做到全流程免拷贝。

图4 零拷贝模型

6 单双边传输结合

HRPC对上层实现了基于事务的消息处理机制(Message based transactions) 。数据作为离散消息而不是作为流处理,这消除了应用程序将流分离为不同消息/事务的需要。

在使用RDMA操作数据传输时,通常有使用双边传输和单边传输两种方式。双边传输是一种消息语义,而单边传输则是内存语义。HRPC选择了更为灵活的单双边传输结合的方式。

双边传输(SEND/RECV)与传统Socket网络传输类似,发送端使用RDMA SEND发送数据,接收端使用RDMA RECV接收数据。但是在发送端发起RDMA SEND操作之前,接收端需要提前准备好接收数据的内存并下发到RQ中,否则对端就会发送失败。因此双方需要约定一次传输最大的数据大小,一般在创建RDMA连接时协商,接收端以该大小准备接收内存,发送端以该大小对大请求进行切分。使用双边RDMA SEND/RECV的限制在于当请求小于约定大小时存在接收端内存浪费的现象,而请求大于约定大小时需要发送端切分多次传输并在接收端重组,增加了CPU开销和延迟。

单边传输是一种基于内存语义的动作。在拿到远端内存地址后,本端可以直接向网卡发起RDMA Read或Write操作。网卡硬件负责将本端内存拷贝到远端或者从远端拉取数据到本地内存。此时,远端是不需要CPU参与的,这能大大较少CPU消耗以及端到端时延。

HRPC采用了较为灵活的单双边结合的传输方式。具体讲,就是双边SEND/RECV用于控制类消息或者小IO消息,如图5a。所谓控制类消息,是指不携带用户IO数据的消息,只传输控制信息,该类消息通常为几百个字节大小。另一种是携带了少量的用户IO数据,这种消息采用单双边传输效率接近。我们为这种IO制定了一个特别的边界,当然该边界值是可以调整的,例如8K(8k粒度是考虑在mtu为9000时可以不用分片)。这两种情况都使用双边操作进行。

而大IO消息一般长度较大,适合通过单边RDMA READ/WRITE来完成,如下图5b和c。b为写大IO流程,c为读大IO流程。在实际场景中每次大IO传输的数据大小是不固定的,所以发起单边操作前需要先协商好数据长度和相应的内存地址信息。其方式为先使用双边SEND/RECV操作把待传输数据的内存地址、大小、rkey等控制信息进行传输,然后接收者根据这些信息选择单边READ或WRITE操作完成实际数据的传输,最后使用双边SEND/RECV操作发送Reply结果。单双边结合传输的方式具有灵活适应各种大小请求的特点,尤其在传输大请求时具有明显优势,只需要一次单边操作即可将数据全部传输。

图5

7 异步I/O及协程调度

分布式存储系统在节点间存在大量的消息收发过程,一个op操作需要远端告知处理结果。在等待远端回应处理结果的这段时间,本端将处于异步等待的过程。为了高效利用CPU,HRPC实现的是一套异步I/O消息收发机制。异步I/O是一种编程模型,它允许程序在等待I/O操作完成的同时继续执行其他任务,而不会被阻塞。异步I/O可以实现高效的并发处理和响应性能。同时,下一代分布式存储上层模块均采用协程模型。HRPC异步处理和业务的协程调度机制相配合,实现了一套高效的并发处理机制。

协程(ULT,User-Level Thread)是一种比传统linux线程更加轻量级的存在,也称为用户态线程。协程可以理解为一个特殊的函数,这个函数可以在某个地方挂起去执行别的函数,并且可以返回挂起处继续执行。一个线程内可以有多个协程来交替运行,但是多个协程的运行是串行的,也就是说同一时刻只有一个协程在运行。当一个协程运行时,其它的协程会被推入等待调度队列。协程不被操作系统管理,而是在用户态执行,完全由程序自己控制。协程所在的调度线程采用轮询模式,根据调度策略,通过协作(而不是抢占)来进行切换。在IO密集型场景下,协程的调度开销比线程小很多。当IO需要等待对端回应时,协程框架能够快速调度其他协程投入运行,极大地提升了CPU利用率。因此,很适合RDMA当前这种异步编程模型。

HRPC还充分和上层业务模型结合,识别业务的优先级。不同的业务具有不同的优先级,例如前台IO业务,刷盘业务,后台重构业务等,其优先级是不一样的。HRPC识别业务的优先级,根据优先级创建不同的ULT,推入到对应的协程池中。HRPC采用轮询机制,访问QP的完成队列,同时基于多核CPU,利用多线程+协程的方式,获得了极高的调度性能。

图6 HRPC协程调度

8 NUMA亲和

现代服务器基本上都具备多NUMA架构。在多NUMA架构中,每个NUMA具有本地内存。CPU访问不同NUMA的内存速度是不一样的。其速度关系为:

访问本NUMA内存 < 访问同socket其他NUMA内存 < 访问跨Socket NUMA内存

即CPU访问本地NUMA内存速度最快。对内存的访问效率会直接影响整个存储系统的性能。因此在设计上需要考虑。HRPC采用Group分组技术,让业务和网络做到NUMA亲合,使得访问效率最高。每个分组包含了1组独立的网络资源,包括RDMA QP连接资源,CPU资源,内存资源等。一般按照硬件的NUMA数创建对应数目的Group分组。

网络分组创建后,上层业务实例可以根据自己的实例数,按照一定的策略关联这些网络Group。跟某个网络Group关联的所有业务实例将和对应的网络资源运行在同一个NUMA里,这样就可以避免跨NUMA访问。如图7,以4个NUMA为例,总共创建4个HRPC网络Group。每个网络Group侦听自己的端口。假设总共有4个业务引擎实例,每个引擎实例则可以关联1个网络Group。当远端需要跟某个业务引擎实例通信时,会选择和该实例关联的网络Group建立连接。通过按NUMA分组,将节点到节点的通信粒度缩小到NUMA到NUMA的粒度,实现精准匹配。

图7 HRPC Group和业务实例NUMA亲和

以上是从软件上保证相关线程在同一个NUMA上调度。硬件层面,还需要考虑网卡DMA过程的NUMA亲和。硬件上首先需要保证网卡在NUMA上对称部署。网络Group之间会建立逻辑上的channel。逻辑Channel包含多个RDMA QP。当业务模块需要发起IO时,先申请本地NUMA内存。然后基于关联的网络Group发起RDMA操作。HRPC会根据该Group所在的NUMA,选择相同NUMA的Port对应的QP进行传输,避免网卡跨NUMA操作业务模块申请的IO内存。

图8 Group和Port NUMA亲和

9 结束语

RDMA的编程模式与传统TCP/IP相比有很大的不同,不管是内存使用机制,还是数据操作逻辑都发生了很大的变化。从TCP/IP网络通信切换到RDMA通信不仅仅是数据收发网络接口的简单替换,而是需要进行整体的软件架构的优化设计,使IO路径上各模块契合RDMA的特点整体联动,才能充分发挥RDMA的优势,并与NVMe SSD等高性能低延迟设备结合,取得存储性能的突破。HRPC作为下一代分布式存储的高性能通信框架,不仅在网络传输上,在IO内存拷贝,CPU调度等方面也都做了大量的优化,为下一代分布式存储实现高性能奠定了坚实的基础。

搭载全新傲擎架构的新一代分布式存储产品H3C UniStor Polaris,在2025年的MLPerf Storage v2.0基准测试中,取得了单节点159.92GB/s的优异成绩,登顶高性能RoCE AI存储解决方案榜首。

关闭