欢迎光临散文网 会员登陆 & 注册

【转】RDMA 基础

2023-09-11 04:54 作者:ACFUN-AK  | 我要投稿


RDMA 基础


fxp2001640


关注

14 人赞同了该文章

目录

收起

1,为什么需要RDMA

2,RDMA example

3,RDMA组件架构

4,OFED Stack

5,队列模型

6,RDMA服务类型

7,RDMA语义

8,RDMA核心概念

9,RDMA数据面流程

1,为什么需要RDMA

以TCP/IP为代表的传统报文收发IO架构有几个痛点:

  • •数据多次拷贝(用户态到内核态再到硬件),

  • •频繁的中断以及由此导致的多次上下文切换,

  • •复杂冗长的内核协议栈,

  • •需要消耗CPU来软件处理解析报文头。

这些问题导致传统的TCP/IP形式的IO时延在30us-50us左右。这种时延已无法满足越来越多的微秒级应用(如NVMe存储访问)。

RDMA是一种远程直接内存访问技术,它允许从用户态向硬件提交对对端内存的访问,这个访问也不被对端CPU感知而是直接在网卡里完成。相比于TCP/IP网络RDMA有以下几项性能优势:

  • •零拷贝,数据直接从用户态到硬件不再经过内核态的拷贝;

  • •Kernel bypass,数据路径在用户态和硬件之间完成,不再经历到内核态的上下文切换;

  • •CPU免打扰,read/write对端内存不需要对端CPU参与,所有报文封装解析,内存搬运都是由硬件完成。

这些特性使得RDMA的端到端时延可以降低至微秒级,同时也使CPU的负载大大降低。RDMA本身可以over在4种传输层之上:infiniband,ethernet(RoCE V1),UDP/IP(RoCE V2),TCP/IP(iWARP),其中infiniband传输层需要专有硬件,而其他的都可以复用以太网。

2,RDMA example

dev_list = ibv_get_device_list(NULL); if (!strcmp(ibv_get_device_name(dev_list[i]), ib_devname))  ib_dev = dev_list[i]; ctx = ibv_open_device(ib_dev); pd = ibv_alloc_pd(ctx); mr = ibv_reg_mr(pd, buf, size, access_flags); cq = ibv_create_cq(ctx, rx_depth, NULL, NULL, 0); init_attr = { .send_cq = cq, .recv_cq = cq, .cap = { .max_recv_wr = rx_depth }, .qp_type = IBV_QPT_RC }; qp = ibv_create_qp(pd, &init_attr); attr = { .qp_state = IBV_QPS_INIT, .pkey_index = 0, .port_num = port, .qp_access_flags = 0 }; ibv_modify_qp(ctx->qp, &attr); ibv_post_recv(ctx->qp, &wr, &bad_wr); exchange (gid, lid, qpn, rkey, psn) with TCP socket attr = { .qp_state = IBV_QPS_RTR, .path_mtu = mtu, .dest_qp_num = dest->qpn, .rq_psn = dest->psn, }; ibv_modify_qp(ctx->qp, &attr); attr = { .qp_state = IBV_QPS_RTS, .sq_psn = my_psn }; ibv_modify_qp(ctx->qp, &attr); sge_list = { .addr = buf, .length = size, .lkey = lkey }; wr = { .wr_id = xxx, .sg_list = &list, .num_sge = 1, .opcode = IBV_WR_SEND, .send_flags = ctx->send_flags }; ibv_post_send(ctx->qp, &wr, &bad_wr); ibv_poll_cq(ctx, 1, &wc); process wc;

3,RDMA组件架构

4,OFED Stack

Open Fabrics Enterprise Distribution(OFED)是一个开源软件包集合,其中包含内核框架和驱动、用户框架和驱动、以及各种中间件、测试工具和API文档。开源OFED由OFA组织负责开发、发布和维护,它会定期从rdma-core和内核的RDMA子系统取软件版本,并对各商用OS发行版进行适配。除了协议栈和驱动外,还包含了perftest等测试工具。

5,队列模型



6,RDMA服务类型

6.1 可靠(Reliable)

可靠服务在发送和接受者之间保证了信息最多只会传递一次,并且能够保证其按照发送顺序完整的被接收。IB通过以下三个机制来保证可靠性:

  • 应答机制:可靠服务类型使用应答机制ACK来保证数据包被对方收到。接收方可以累积方式ACK。

  • 数据校验机制:发端对Header和Payload计算CRC校验和放到数据包末尾。对端收到数据包后以相同算法计算出CRC,然后与数据包中CRC比对,若不同则丢弃这个包。

  • 保序机制:保序是指先被发送到物理链路上的数据包一定要先于后发送的数据包被接收方收到。每个包都有一个PSN序号,如收端收到了1和3,却没收到2,那么其就会认为传输过程中发生了错误,之后会回复一个NAK给发端,让其重发丢失的包。

6.2 连接(connection)

连接是一条通信的“管道”,一旦管道建立好了,管道这端发出的数据一定会沿着这条管道到达另一端。对于基于连接的服务来说,每个QP都和另一个远端节点相关联。在这种情况下,QP Context中包含有远端节点的QP信息。在建立通信的过程中,两个节点会交换包括稍后用于通信的QP在内的对端信息。

6.3 数据报(datagram):

对于数据报服务来说,QP不会跟一个唯一的远端节点绑定,而是通过WQE来指定目的节点。和连接类型的服务一样,建立通信的过程也需要两端交换对端信息,但是数据报服务对于每个目的节点都需要执行一次这个交换过程。

6.4 Reliable Connection (RC):

QP只关联至一个对端QP,消息被确保可靠地传输至对端,且消息是保序的,这非常类似于TCP连接。RC用于对数据完整性和可靠性要求较高的场景,跟TCP一样,因为需要各种机制来保证可靠,所以开销自然会大一些。另外由于RC服务类型和每个节点间需要各自维护一个QP,假设有N个几点需要相互通信,那么需要N * (N - 1)个QP,而QP和QPC本身是需要占用网卡资源或者内存的,当节点数很多时,存储资源消耗将会非常大。

6.5 Unreliable Datagram (UD):

一个QP可以发送消息给任意对端,也可接收任意对端来的消息。不保证可靠性和传输顺序,这非常类似UDP。UD硬件开销小并且节省存储资源,比如N个节点需要相互通信,只需要创建N个QP就可以了,但是可靠性跟UDP一样没法保证。用户如果想基于UD服务类型实现可靠性,那么需要自己基于IB传输层实现应用层的可靠传输机制。

7,RDMA语义

8,RDMA核心概念

9,RDMA数据面流程


编辑于 2022-09-24 12:27

RDMA



【转】RDMA 基础的评论 (共 条)

分享到微博请遵守国家法律