阿里云是如何使用RDMA技术

作者:李豪     rdma(remote direct memory access)即远端直接内存访问,是一种高性能网络通信技术,具有高带宽、低延迟、无cpu消耗等优点。rdma相比tcp在性能方面有明显的优势,但在编程复杂度上rdma verbs却比tcp socket复杂一个数量级。   开源社区和各大云厂商在rdma通信库方面都有不少尝试,今天我们精读阿里云的rdma通信库论文x-rdma: effective rdma middleware in large-scale production environments,来看看阿里云是如何使用rdma技术的。  
  01 摘要和背景介绍
  (2019年)rdma技术在数据中心越来越受欢迎,当前最新的connectx-6 infiniband网卡可以支持200gbps的带宽和极低的延迟(0.6微妙)。rdma技术也在越来越多的系统中得到应用,比如kv存储、文件系统、图计算等。   但是在规模生产环境中,rdma的实际收益还不够明显,一个重要原因是rdma编程复杂性太高,想用好它很难,rdma verbs编程有一堆的新概念(qp,mr,pd,rq,sq,cq,……),这根传统socket编程迥异。想要直接把已有应用直接迁移到rdma更是不可能。   使用rdma需要解决以下问题:  
问题定位困难
大规模集群中存在性能抖动和拥塞
大消息会增加incast拥塞概率
本文分享我们关于大规模rdma部署的经验,以及如何启发我们设计出rdma通信中间件x-rdma。x-rdma很多功能是业务需求推动的,比如稳健性、高效的资源管理以及用于调试和性能调整的便捷工具。   x-rdma已经在阿里大量使用近两年(16年至今),几乎所有的基于rdma的应用都在使用x-rdma,包括云数据库和存储系统。x-rdma收益如下:  
网络吞吐提升24%
网络延迟降低5%(相比于ucx-am-rc)
rdma的编程模型
原生以太网无法满足我们的网络性能要求,而rdma可以提供:  
超低延迟(2微秒)
高吞吐
零拷贝
不经过内核
因此rdma可以降低传统tcp协议栈的1. 上下文切换开销,2. 协议处理开销,3. 数据拷贝开销。   rdma提供rc、ud、rd等多种连接,同时提供两类数据语义:  
单边语义:write/read/atomic,这类语义不需要对端cpu参与。
双边语义:send/recv,这类语义跟传统以太网有些相似,需要对端cpu配合做一些事情(但不需要cpu做协议栈处理)。
rdma verbs编程有一堆的新概念,跟socket编程迥异。使用verbs编写一个简单的echo server/client程序需要200行以上,流程十分繁琐。  
阿里的数据中心网络部署
阿里数据中心网络是基于以太网的clos网络,由三层交换机组成,分别是spine、leaf、tor,拓扑如下:
每个tor下面有40个节点,每台机器有一张双口网卡,上联两台tor。  
阿里的rdma使用场景
rdma有三种实现方式:  
infiniband
roce/rocev2
iwarp
目前数据中心广泛使用的是rocev2,rocev2依赖pfc保证网络无损,同时通过dcqcn做到端到端的拥塞的控制。   本论文主要介绍三个阿里有代表性的应用:essd、xdb、polardb。pangu一个阿里云开发的高可靠、高可用、高性能的分布式文件系统,类似于ceph。pangu中每个服务器上有两个核心组件:block server和chunk server。   block server从前端接收数据(essd、xdb等),然后将数据以三副本形式分发给不同机器上的chunck server。block server和chunk server通过rdma进行fullmesh通信。
02 大规模生产环境遇到的问题   大规模生产环境使用rdma主要遇到以下问题:   rdma编程复杂:verbs编程比socket编程复杂很多,一个简单的ping-pong程序rdma需要200行代码,而socket只需要50行。   rdma可扩展性挑战:主要体现在几个方面:a. rdma资源占用会随着集群规模增加,比如连接数和内存的占用。pangu中每个block server上有n个线程,每个chunk server上有m个线程,而每两个线程之间都要建立fullmesh的链接,换算下来每个chunk server的内存占用为:
b. 大规模rdma集群存在拥塞和严重的incast。c. 建联速度太慢,通过rdmacm建联平均需要花4毫秒,而tcp只需要100微秒。   rdma健壮性问题:体现在 a. rdma单边操作无法感知对端应用层的处理状态,这给内存管理带来挑战,因为对端接收完成之前发送方的buffer不能释放,两边配合不好会导致rnr出现。b. rdma无法感知通信的对端是否还活着(这一点跟tcp很不同,tcp会有内核做链接保活,rdma是kernel by pass的,即使对端挂了,本地也不会受到任何通知),这会导致链接泄露,跟这个链接相关的资源也无法释放。   rdma问题排查工具缺失:rdma没有类似netstat和pingmesh之类的工具,也没有类似netfilter的工具。   基于以上挑战我们设计了x-rdma通信库。     03 x-rdma设计思想
整体架构
x-rdma有三层抽象,包含16个核心组件:   最上层:提供简单的数据结构和api抽象,屏蔽rdma verbs编程复杂性。   中间层:提供1. 可靠的协议拓展(keepalive),2. 资源管理(qp管理,内存管理,消息管理等),3. flow control, 4. 性能分析工具(trace, statistic, config, filter, mock, monitor)等功能。   底层:timer、task、fd数据结构。
x-rdma api  
线程模型
x-rdma采用run-to-complete线程模型,从而避免了数据路径上锁/原子变量/系统调用的使用,代价就是所有的核心资源都是线程粒度的,即每个线程都要有单独的内存池、链接池等。导致的后果就是内存占用和连接数的膨胀。但在存储场景下为了更好的性能多使用一些资源是可以接受的。   思考:存储之外的场景适合使用r2c的设计吗?   x-rdma混合使用epoll和busy polling 来平衡cpu占用和响应速度,当有消息到来或者timer超时是切换到busy polling模式,当长时间没有事件时则切换到epoll模式。keepalive和统计功能都是注册到timer上的事件。  
消息模型
阿里大部分应用通信采用rpc模式,即request-response模式。x-rdma实现了rpc的通信模式。   由于rdma操作的内存需要reg_mr,这个动作是将虚地址pin在物理内存中防止page换出,然后将页表项也发给网卡,显然这个动作比较耗时间。为了降低内存准备的开销和过多的内存占用,x-rdma将消息分成两类分别处理,这种划分类似于mpi中的eager和rendezvous模式:   小消息:小消息对延迟敏感,默认将4kb以内的消息称为小消息。采用rdma send/recv完成收发,两侧各只需要下发一个wr,效率比较高。但是这要求接收方率先准备好接收buffer,为避免较多的内存占用,该模式只能用于小消息收发。   大消息:大消息对吞吐敏感,大消息收发通过多轮协商完成,步骤如下:a. 发送方发送一个wr告知接收方有数据要发送,b. 接收方按需准备好接收buffer,c. 接收方通过rdma read读取数据。  
每个线程的工作流
x-rdma采用run-to-complete的线程模型,因此每个线程都有一个单独的工作流,如下图:
上图中信息很丰富,做几点说明:   x-rdma支持event模式和polling模式,可通过xrdma_get_event_fd()的方式获取polling所需的fd,然后调用xrdma_process_event()进行事件处理。   x-rdma发送消息是异步非阻塞的,因此可能有多个消息在同时发送,被称为inflight messages,但是x-rdma会限制inflight messages不超过cq深度。   链接的心跳信息依赖于timer超时事件,x-rdma会自动发送keepalive信息做链接保活。  
资源管理
为了1. 提升性能,2. 降低内存占用,3. 缩短建联时间,x-rdma为每个线程维护内存池和连接池。   内存池:rdma内存池主要是管理mr(memory region),由于网卡可以管理的mr数量是有限的,因此过多的mr不仅可能会导致性能下降,甚至会导致超过网卡mr上限而无法注册新内存,因此x-rdma采用4mb的粒度来注册mr,以此来降低mr的数量。   连接池:rdma建联比tcp建联耗时更长(4ms vs. 100us),x-rdma为每个线程维护一个qp cache来降低建联开销。如果一个链接断开,则会把qp设置为ibv_qps_reset状态,并放到qp cache中,以便后续复用。   x-rdma没有使用cm建联,而是自己实现的一套带外建联,论文评估章节有说明。     04 rdma协议拓展   x-rdma从以下几个方面对rdma做了拓展:
keepalive
seq-ack window
flow control
keepalive
tcp/ip协议栈会由内核发送心跳消息检查链接是否存活,但rdma协议栈没有内核参与,因此无法由内核自动发送心跳信息。链接保活检查时必须的,因为有很多的原因会导致链接泄露。当一个链接在s毫秒内没有没有和对端通信时,x-rdma会触发keepalive机制,通过rdma write探测链接是否存活,write的payload是零字节,如果对端还存活,网卡会自动恢复ack报文。  
seq-ack window
x-rdma的seq-ack window机制主要出于以下考量:   网卡的ack只能保证数据已经到达对端,但并不能保证接收侧的应用程序已经处理了这些数据报文。   发送小消息时x-rdma需要接收方提前准备好接收buffer,如果消息数量很多而接收方的buffer数量不足,则会导致rnr(request not ready),这不仅会导致性能下降,甚至会导致链接断开。   通过x-rdma的seq-ack window机制可以避免rnr出现,具体做法是:收发两边分别有一个缓存in-flight请求的ring buffer窗口,窗口大小设置为io depth。每次发送数据时(rdma write/send)x-rdma都会将seq-ack编号通过rdma immediate data发送给对方。具体算法如下图:
flow control
在大规模incast场景下dcqcn并不能很好的工作,具体体现在:   dcqcn是一种被动控制,在cc起作用之前可能已经出现了性能下降(比如ecn报文还没有返回,交换机buffer就已经出现了丢包)。   根据观察,incast导致cnp和pfc会导致网络性能和健壮性的下降。   x-rdma通过1. 消息分片和2. 消息排队 来协助dcqcn缓解网络拥塞。   消息分片:对于大的请求,x-rdma会把请求按照64kb的粒度进行切分,然后逐片发送。以避免大消息对网卡的阻塞。   消息排队:x-rdma限制同时能发起的wr请求数量为n,多出来的请求放到队列里排队。   上述两种流控算法均实现x-rdma通信库里,对网卡硬件没有限制。     05 性能和问题分析框架   x-rdma提供了众多工具和机制定位各种类型的bug,分析工具如下图:
tracing
x-rdma数据通路有两种模式,分别是:  
bare-data模式:直接发送用户的原始数据,不做任何的链路追踪。
req-res模式:会在用户的数据之前加入header,通过header记录必要的信息,用于tracing和问题定位。通过该机制可以计算出网络的rtt。
x-rdma的tracing功能还可用于:  
定位网络拥塞
发现慢polling:通过记录两次polling之间的时间差,发现慢polling。通常这可能是由于用户工作线程有比较耗时的操作所致。
发现执行较慢的代码片
monitoring
我们提供三种工具弥补rdma工具不足的问题,分别是:  
xr-stat:对标tcp的netstat
xr-ping:对标tcp的ping,以及rdma自己的rping(rping功能太简单了)
xr-perf:用于做rdma性能和压力测试。
性能调优
x-rdma通信库有很多参数可以调整,可分为两类:1. 运行时动态可调的(通过xr-adm命令控制),以及2. 启动程序是可配置的,具体如下表:
06 性能评估   目前(2017)阿里有超过4000台服务器部署了x-rdma,使用rocev2协议。最大的一个rdma集群有4个子集群,每个子集群有256个节点,每个节点有一张双口的25gbps mellanox connectx4-lx网卡(总共50gbps)。     07 读后总结   本文介绍了阿里x-rdma的核心设计思想,包含线程模型、消息模型、资源管理、心跳检测、flow control等各个维度,对用好rdma以及设计新的rdma通信库有很好的参考价值。其run-to-complete线程模型大大降低了x-rdma自身的设计和编程复杂性,在存储等典型场景下有很不错的效果。   美中不足的是x-rdma没有公开代码,文中介绍的很多细节和工具无法进一步了解。   论文链接: https://ieeexplore.ieee.org/document/8891004   【投稿】:sdnlab原创文章奖励计划


Cat S60:集成了热成像技术并通过MIL 810G军工测试标准的手机
模拟电路中的钳位二极管
中国电信将对2020年IPRAN U设备集采项目重新招标
HNS 2023 | 华为首次发起拉美IP Club 会员计划,助力拉美区域数字化转型
鸿蒙升级,华为产品启动公测升级
阿里云是如何使用RDMA技术
在VR中安全无痛又超逼真的过山车你敢体验吗?
自动地址分配技术的应用及在工程中的重要性和必要性
人工智能或导致日本减产240万个岗位
行业协会标准免费下载|CALI 0802.6《多功能路灯技术规范 第6部分:公共信息服务要求与试验(终版)》
荣耀Flypods Pro耳机加入骨声纹传感器,今日历史最低价
捷豹路虎开发LESA技术,车身面板显示器定制空间更大
电商平台会因为5G的到来有什么变化
微雪电子TCS34725颜色传感器简介
2020年云计算产业的规模可能达到多大
刚挠PCB制造工艺
WINDOWS开始运行中可以起动的程序命令展览
50+种高度依赖进口的新材料清单
凭什么联发科技MT8516能获奖?
创新不竭,探索不止 | 开发者说·DTalk 年中优秀赏