从零学习 InfiniBand-network架构(三) —— IB核心传输引擎Queue Pair
声明:
博主主页:王_嘻嘻的CSDN主页
未经作者允许,禁止转载
本专题部分内容源于《InfiniBand-network architecture》,侵权必删
本章将介绍IBA技术中最核心的信息传输引擎,队列的概念(QP,Queue Pair)、请求报文、响应报文、报文序列号(PSN),简单介绍QP服务类型和verb layer API,最后将描述一个详细的信息传输示例。
双向信息传输引擎QP
在每个CA中会实现若干QP,数量最多可达**16M(2^24)**QPs,之所以叫Queue pair,是因为每个QP由两个队列组成,发送队列(Send Queue)和接收队列(Receive Queue)。
- 发送队列:软件将消息传输请求(WQE)发送到SQ,执行时,SQ将出站消息传输请求发送到对端QP的RQ;
- 接收队列:软件将工作请求(WQE)发送到此队列,以处理通过对端QP的SQ传输到RQ的不同类型的入站消息传输请求。
请求包与响应包
- QP的SQ会以一系列的一个或多个请求包的形式向远端QP的RQ传输消息传输请求;
- 根据QP类型,远端QP的RQ可以通过向对应的SQ发送一系列的一个或多个响应数据包来响应接收到的消息传输请求。
报文序列号PSN
SQ生成的每个请求包都包含一个PSN,收到请求数据包后,RQ将验证数据包是否与期望的PSN (ePSN)一致。
与之对应的,RQ生成的每个响应包都包含一个PSN,该PSN将它与从远端SQ接收到的请求包关联,SQ收到每个响应包时, 将验证包的PSN是否与之前发出的请求相关联。
QP服务类型
在IBA中,主要根据信息的传播需求、场景不同,以及对信息重要性的不同,分为以下几种类型:
- 可靠连接 RC(Reliable Connected)QP;
- 非可靠连接 UC(UnReliable Connected)QP;
- 可靠数据报 RD (Reliable Datagram) QP;
- 非可靠数据报 UD (Unreliable Datagram) QP;
- 类似与隧道包,对非IBA协议的包进行封装的 RAW QP。
每种服务类型的具体区别与特点将在后续专题中进行介绍:占位符。
独立于OS的动作层verb API
软件接口与HCA接口是非直接关联的,软件应用的调用称为verb layer。可以将verb layer想象成松散的API (可以看作函数调用),并由每个操作系统供应商以特定方式实现。对于每个verb,规范定义了:
- 输入的参数
- 返回结果,输出的参数
- verb的操作类型
verb layer可以通过访问HCA的硬件接口(例如寄存器组)来完成期望的动作,verb layer还有以下特性:
- 需要时会调用OS。例如它可以调用OS的内存管理器,为verb或者HCA的使用分配物理内存;
- 必须通过verb调用请求的操作,才能访问主存。例如,在特定的操作系统环境中,软件应用可以在主存中构建一个消息传输工作请求(WR),然后执行Post Send Request verb调用,将WR发布到QP的SQ中进行处理。它将在主存中提供WR的起始地址作为Post Send Request verb的输入参数之一,然后verb将访问主存以读取WR,将WR发送到目标QP的SQ。
装载QP操作特征的QP Context
在使用QP进行发送或接收信息前,软件会先创建一个QP,并提供一些其在发送、接收过程中需要用到的特征。QP Context大致会包含以下内容(每个内容的具体含义暂不展开介绍):
- 本地端口号(在QP创建时确定);
- QP类型;
- SQ开始PSN(SQ发送的第一包插入开始PSN,后续实时更新current PSN);
- RQ期望PSN;
- 最大payload尺寸(0.25KB、0.5KB、1KB、2KB、4KB,也被称作path maximum transfer unit,PMTU);
- 目标端的本地ID;
- 期望的本地QoS;
- 报文注入延迟(因为链路的宽度不同,内部报文延迟也不同,防止快速链路的流量超过较慢链路的流量,QP会附一个IPD来定义将数据包发送到目标IP之间必须遵守的间隔);
- 本地应答超时(指定时间内没收到ack报文,即为应答超时,需要重发对应报文);
- Ack timeout/丢包重传计数;
- RNR重传计数;
- 源端口本地ID;
- 全局的源端/目标端地址;
QP传输示例
本文以RC服务类型的QP举例,详细描述了QP是如何传输一个数据包的
假设QP已创建,且:
- SQ PSN起始地址在CA X为100,CA Y为2000;
- QP都为刚创建完成状态;
- RQ 期望PSN CA X为2000,CA Y为100;
- 需要发送的信息为5KB,报文payload最大尺寸限制为2KB;
- Ack重传计数为7,RNR重传计数为7;
- Source CA与destination CA在同一子网下;
注意:这里只举例了报文第一包发送与响应过程,后续包的过程稍有不同,但整体类似。
发送第一个请求报文
SQ开始处理顶层条目,WQE指定一个多包发送操作,将5KB消息从HCA本地内存发送到对端CA的QP;
SQ检查QP Context中的PMTU来决定请求报文的最大数据大小,在本例中,SQ会选择前2KB数据作为第一个请求报文发送;
SQ在第一包的Opcode内容中填入Send first,向对端RQ表示,该包是第一发送包,并填入PSN=100,同时根据QP context内容设置目标QP;
注:RQ在接收到send last的报文前,都不知道报文的真实长度;SQ将请求包转发到端口X进行传输时,向端口提供基本LID地址的偏移量,以替代包的SLID;
SQ将第一个请求包内的DLID设置为目标CA端口的QP的DLID,DLID来自QP Context;
SQ根据QP context内容设置服务等级(Service Level);
如果请求操作中存在全局ID,SQ需要在第一包中插入GRH(但在本例中不需要);
Send操作的第一个请求包被发送到网络层,然后转发到HCA端口(X)的链路层。此外,SQ还做以下工作:
a) 将nPSN从100更新到101,这是将在发送的下一个请求包中插入的PSN。
b) 等待收到“Send First”请求包的对应Ack包。
c) 形成下一个请求包发送到链路层进行传输。当从网络层接收到第一个报文后,端口的链路层将:
a) 在端口的base LID上加入偏移,并将此LID插入在请求报文中的SLID中;
b) 如果目标CA和源CA不在同一子网下,会生成一个128-bits的SGID;
c) 在配置过程中,SM设置了端口的SLtoVLMappingTable属性表,将16个可能的SL值映射到特定的链路层传输缓冲区。SM还建立了一个仲裁方案,为每个传输缓冲区分配一个重要级别。定义了传输缓冲区以什么顺序将数据包传输到端口的物理层;
d) 请求包被发布到链路层选择的传输缓冲上;
e) 当该VL传输缓冲区进行报文传输时,端口的链路层将请求报文转发给端口的物理层进行传输。数据包的VL字段标识了各自的VL接收缓冲区,该缓冲区将在与该端口连接的物理链路的另一端接收数据包。从X链路层端口流出的请求报文将根据serdes的规范,编码为10-bits的串行流;
请求包经过一个或多个链路,最后到达目标端口。每个交换机查找内部转发表,并根据包内的DLID确认向何处转发;
目标QP端口对从物理层收到的数据解串行化,恢复8-bits数据流,并传递给链路层;
链路层解析包内的DLID项,确定数据前往哪个端口,并将数据传输到数据包指示的VL接收缓冲区,紧接着,请求包转发至网络层,网络层根据DestQP项将数据传递到对应RQ;
RQ将请求包的PSN与ePSN比较,确定是否出现丢包(如果PSN为之前请求包范围内的PSN,代表是一个重复包,不需要响应其动作,但要回复ack);
RQ将检查包的opcode,确认是否需要WQE将报文写入CA Y的本地内存中。如果opcode是send或RDMA write,WQE则需要完成此动作。如果RQ当前没有发布WQE,则需要返回对端SQ一个RNR NAK包;
进一步确认opcode,本例中为send first,不能是send middle,send last;
RQ返回一个ack包,并使用顶端的WQE确认将payload写入本地内存何处;
Payload使用散列缓冲链表写入CA本地内存中,同时RQ向WQE更新下一包需要写入的内存地址;
最后,RQ更新期望PSN(ePSN=101);
第一个ack包返回
当RQ成功接收send first包,返回ack包的过程如下:
RQ将ack包发送到网络层,然后转发至端口的链路层;
Ack包不包含payload,但是包含opcode和确认扩展传输头(AETH)字段,opcode表示这是一个Ack报文,AETH表示Ack报文的类型:positive Ack或negative Ack (Nak)。如果是Nak包,Nak的原因也会被指出;
Ack的目标QP会被写入QPN;
Ack包中的SL和请求包中的SL一致,SLID和DLID与请求包中相反;
CA Y的端口根据SL查表确定,Ack包需要发布到哪个VL传输缓存;
当该VL缓存区传输时,将Ack包从链路层传给对应的物理层;
和之前物理层的处理一样,数据将被串行化,通过传输介质后,由另一端的物理层解串;
对端链路层解析包中的DLID,确定该传输到哪个端口;
链路层将接收到的ack包放至对应的VL接收缓存区,进一步转发至网络层;
网络层将ack包发送给对应SQ,QP与上一步发送请求报文的QP一致;
SQ验证是否是ack包,检查PSN是否和send first包的PSN一致;
搜索关注公众号【IC墨鱼仔】,获取我的更多IC干货分享!