从零学习 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在同一子网下

  注意:这里只举例了报文第一包发送与响应过程,后续包的过程稍有不同,但整体类似。

发送第一个请求报文

  1. SQ开始处理顶层条目,WQE指定一个多包发送操作,将5KB消息从HCA本地内存发送到对端CA的QP;

  2. SQ检查QP Context中的PMTU来决定请求报文的最大数据大小,在本例中,SQ会选择前2KB数据作为第一个请求报文发送;

  3. SQ在第一包的Opcode内容中填入Send first,向对端RQ表示,该包是第一发送包,并填入PSN=100,同时根据QP context内容设置目标QP
    注:RQ在接收到send last的报文前,都不知道报文的真实长度;

  4. SQ将请求包转发到端口X进行传输时,向端口提供基本LID地址的偏移量,以替代包的SLID

  5. SQ将第一个请求包内的DLID设置为目标CA端口的QP的DLID,DLID来自QP Context;

  6. SQ根据QP context内容设置服务等级(Service Level);

  7. 如果请求操作中存在全局ID,SQ需要在第一包中插入GRH(但在本例中不需要);

  8. Send操作的第一个请求包被发送到网络层,然后转发到HCA端口(X)的链路层。此外,SQ还做以下工作:
    a) 将nPSN从100更新到101,这是将在发送的下一个请求包中插入的PSN。
    b) 等待收到“Send First”请求包的对应Ack包
    c) 形成下一个请求包发送到链路层进行传输。

  9. 当从网络层接收到第一个报文后,端口的链路层将:
    a) 在端口的base LID上加入偏移,并将此LID插入在请求报文中的SLID中
    b) 如果目标CA和源CA不在同一子网下,会生成一个128-bits的SGID;
    c) 在配置过程中,SM设置了端口的SLtoVLMappingTable属性表,将16个可能的SL值映射到特定的链路层传输缓冲区。SM还建立了一个仲裁方案,为每个传输缓冲区分配一个重要级别。定义了传输缓冲区以什么顺序将数据包传输到端口的物理层;
    d) 请求包被发布到链路层选择的传输缓冲上;
    e) 当该VL传输缓冲区进行报文传输时,端口的链路层将请求报文转发给端口的物理层进行传输。数据包的VL字段标识了各自的VL接收缓冲区,该缓冲区将在与该端口连接的物理链路的另一端接收数据包。

  10. 从X链路层端口流出的请求报文将根据serdes的规范,编码为10-bits的串行流;

  11. 请求包经过一个或多个链路,最后到达目标端口。每个交换机查找内部转发表,并根据包内的DLID确认向何处转发;

  12. 目标QP端口对从物理层收到的数据解串行化,恢复8-bits数据流,并传递给链路层;

  13. 链路层解析包内的DLID项,确定数据前往哪个端口,并将数据传输到数据包指示的VL接收缓冲区,紧接着,请求包转发至网络层,网络层根据DestQP项将数据传递到对应RQ;

  14. RQ将请求包的PSN与ePSN比较,确定是否出现丢包(如果PSN为之前请求包范围内的PSN,代表是一个重复包,不需要响应其动作,但要回复ack);

  15. RQ将检查包的opcode,确认是否需要WQE将报文写入CA Y的本地内存中。如果opcode是send或RDMA write,WQE则需要完成此动作。如果RQ当前没有发布WQE,则需要返回对端SQ一个RNR NAK包;

  16. 进一步确认opcode,本例中为send first,不能是send middle,send last;

  17. RQ返回一个ack包,并使用顶端的WQE确认将payload写入本地内存何处

  18. Payload使用散列缓冲链表写入CA本地内存中,同时RQ向WQE更新下一包需要写入的内存地址

  19. 最后,RQ更新期望PSN(ePSN=101);

第一个ack包返回

当RQ成功接收send first包,返回ack包的过程如下:

  1. RQ将ack包发送到网络层,然后转发至端口的链路层;

  2. Ack包不包含payload,但是包含opcode和确认扩展传输头(AETH)字段,opcode表示这是一个Ack报文,AETH表示Ack报文的类型:positive Ack或negative Ack (Nak)。如果是Nak包,Nak的原因也会被指出;

  3. Ack的目标QP会被写入QPN

  4. Ack包中的SL和请求包中的SL一致,SLID和DLID与请求包中相反

  5. CA Y的端口根据SL查表确定,Ack包需要发布到哪个VL传输缓存;

  6. 当该VL缓存区传输时,将Ack包从链路层传给对应的物理层;

  7. 和之前物理层的处理一样,数据将被串行化,通过传输介质后,由另一端的物理层解串;

  8. 对端链路层解析包中的DLID,确定该传输到哪个端口;

  9. 链路层将接收到的ack包放至对应的VL接收缓存区,进一步转发至网络层;

  10. 网络层将ack包发送给对应SQ,QP与上一步发送请求报文的QP一致;

  11. SQ验证是否是ack包,检查PSN是否和send first包的PSN一致


搜索关注公众号【IC墨鱼仔】,获取我的更多IC干货分享!