[RDMA]重传(二)——导致重传的Error

2 导致重传的Error 

导致重传的Error主要有四类,如下表:

Table a.  Error Type

ConditionDescription

Local Ack Timeout Error

对端Ack丢失或回复过慢而超时,本端重传,产生重复包
本端Req在传输网络中阻塞而超时,本端重传,对端对重传包回复Ack后,第一次Req才被对端收到,产生重复包(ghost packet)

本端报文中以太网头的ether_types字段错误,对端丢弃该包,本端等待Ack超时而重传

本端报文中IP_Header有错误,对端丢弃该Req,本端等待Ack超时而重传
本端报文中UDP_Header有错误,对端丢弃该Req,本端等待Ack超时而重传
本端报文ICRC错误,对端丢弃Req,本端等待Ack超时而重传
PSN Sequence Error

本端收到对端PSN Sequence Error,触发重传

RNR Nak本端收到对端RNR Nak,触发重传
Implied Nak Sequence Error

对端回复了Ack(Send/Write),但Ack发出时,本端还有一个Read请求未完成,即对端还未完成Read 响应包的回复就先回了这个Ack包,此Ack包隐式的对Read Req及之后的所有其他Req回复了Nak,本端需要对这些包重传

2.1  Local ack timeout error

ACK/NAK协议是可靠服务的基本组成部分,适用于RC服务、XRC服务和RD服务。由于响应包可能在fabric中丢失,因此Ack/Nak要求请求方实现一个Timer来检测丢失的响应包。

2.1.1 Timer

2.1.1.1 Timer简述

建链信息交换期间,本端CA的CM会向对端CA的CM提供Local Ack Timeout值,该值会储存在对端的QPC中,定义对端QP的SQ Logic在发送请求包时等待响应的时间。本端CA的CM在REP消息中提供Target Ack Delay值,并以此值计算 Local Ack Timeout 值,储存在本地QP的QPC中。(RD,则为EEC)

图a. 建链信息交换 

Transport Timer测量标准:Timer检测响应包的持续性缺失,测量值为以下两种情况的较小者:

① 自请求方发送带BTH中设置AckReq的请求包开始以来的时间;
② 自最后一个有效响应包到达以来的时间。

图b. 测量值

Timeout Formula:

T_{tr}=4.096us x 2^{Local Ack Timeout}=(2 x PacketLifeTime)+ responder QP’s Target Ack Delay

Local Ack Timeout :位宽5bit,每个QP都有,用于导出T_{tr}
PacketLifeTime:数据包在源端口和目的端口之间传输的最大时间,从PathRecord获得;
Target Ack Delay:从收到请求包到发送相应的响应包的时间,位宽5bit;
T_{tr}由SQ Logic Transport Timer定义,从请求包传输时开始计时,检测来自responder QP的RQ Logic的响应中断,并非检测响应包返回。

To,Timeout condition。(Ttr ≤ To ≤ 4Ttr)
即在该范围内能检测出超时。CA支持的 Local Ack Timeout 最小值由CA供应商定义(0除外),如分配的 Local Ack Timeout值小于CA支持的最小值,则CA使用其定义的最小值。

2.1.1.2 Timer工作机制

requester QP的SQ Logic只有在发送request packet时才能触发Transport Timer,且需要responder QP的RQ Logic的显式响应。符合要求的request,包括:

① 设置AckReq位的Request packet;② RDMA Read request;③ Atomic operation request。

图c. Transport Timer

2.1.1.3 Timer Type

Requester中有两个Timer,包括RNR NAK Timer,以及Transport Timer。

Table b.  Timer Type

RNR NAK Timer

Tansport Timer

Purpose

针对RNR NAK

针对除RNR NAK外的情况

Timeout Interva

AETH:Syndrome指定4.096us x 2^{Local Ack Timeout}
Launch Condition

接收RNR NAK后

发送request packet时(包括,设置AckReq位的Request packet;RDMA Read request;Atomic operation request)
Stop ConditionRNR NAK Cleared

Response packet received

2.1.1.4 Transport Timer Expiration

Transport Timer超时时,QP的SQ Logic会Retry请求包。

  • Retry Counter

当Timer超时,Retry Counter加载了一个3位的重试计数,由创建QP的software提供。分别为

Local QP’s Retry Count:software直接向本端CA设置的QP提供重试计数值,该值作为Modify QP verb的输入参数提供;
Remote QP‘s Retry Count:建链时,software向远端CA中创建的QP提供重试计数值。

  • 超时原因

请求包到达得很慢;responder处理请求包与生成响应包的速度很慢;响应包返回速度慢;请求包或者响应包丢失;responder产生响应包出错。

  • Effects of Retry

① RQ Logic接收到第一个copy of request packet。Its PSN = the RQ Logic’s ePSN。

② RQ Logic传输第一个copy of response至请求方的SQ Logic,PSN相等。

③ RQ Logic更新ePSN,扩大了Ack PSN区域的上端。

④ Transport Timer超时导致重传,请求方SQ Logic使用origin PSN重传。

⑤ 在第二个copy of request packet被接收前,已有很多request packet被接收并应答,PSN区域已向上增长,超出retried request的PSN。

⑥ 当第二个copy of request packet到达RQ Logic,其PSN属于Duplicate region,则被认为是duplicate request packet,RQ Logic的行为由请求包类型决定:

a) Send or RDMA Write:其Ack的PSN不是原始请求包中的PSN,而是RQ Logic最近完成请求的PSN,RQ Logic不再对本地内存执行写操作,不会更改ePSN,响应后继续等待带ePSN的报文。
b) RDMA Read:需从本地内存重新执行读操作,将读数据以一个或多个response packet返回,第一个response packet PSN使用原始request packet,随后+1,同样不会更改ePSN。
c) Atomic operation:RQ Logic不能重新执行Atomic RMW操作,可使用最初Atomic操作保存的结果返回一个response packet,同样不改变ePSN。

⑦ SQ Logic接收到第一个copy of response,它的PSN在unAck的范围内,SQ Logic会扩展其Ack PSN范围的上端,使其能包含最新接收到的ePSN。

⑧ SQ Logic接收第二个copy of response,响应的PSN取决于请求的类型:

a) Send or RDMA Write:response的PSN是响应方最近完成的请求的PSN,此response的PSN可能大于或等于原始请求发出的PSN。若是等于,属于SQ Logic的Duplicate区域,会被静默丢弃;若是大于,属于unAck区域,SQ Logic会扩展Ack的PSN上端。
b) RDMA Read:response packet的PSN会从原始request packet的PSN开始递增,属于duplicate区域,由于读数据早已被接收,response packet以及payloads会被静默丢弃。
c) Atomic request:response packet的PSN与原始PSN一致,响应早期已收到,会被静默丢弃。

2.1.2 Counter

2.1.2.1 Counter简述

Requester中有两个retry counter,包括RNR NAK Retry Counter,以及Error/Transport Retry Counter。

Table c.  Counter Type

RNR NAK Retry Counter

Retry Counter

Purpose限制RNR NAK retry的次数

限制Ack Timeout以及Missing Packets retry的次数

Scenarios收到RNR NAKAck超时;RDMA READ操作与Atomic操作的回复包的PSN大于期望值;丢失报文的NAK

Timer

RNR NAK Retry Timer

Transport Timer

Bit Wide33
Initialization对端RQ logic定义

本端SQ logic定义

Rule对端回复一个RNR NAK,本端counter-1,当counter为0时,再次收到RNR NAK会触发RNR NAK Retry Error,若收到正确ack,则counter重置本端因timeout、psn error或implied NAK需要重传时,激活counter,当counter为0时,再次收到 NAK会触发Error,若收到正确ack,则counter重置

Remark

初始值为7代表无限重发,计数不减少-
2.1.2.2 Retry Count Exhaustion

请求方QP的SQ Logic用完了重试计数,并且一致未收到期望的响应,将有两种场景:

① 请求方和(或)响应方QP不支持Automatic Path Migration,或QP支持而软件未启动它,Retry Counter耗尽且Transport Timer超时时,请求方QP将退出SQ WQE,并创建一个SQ CQE上报本地检测的错误。
② 请求方和响应方QP支持Automatic Path Migration,假定软件启用APM,Retry Counter耗尽且Transport Timer超时时,CA会尝试Automatic Path Migration,迁移之后,请求者用其原始值重新加载Transport Timer的Retry Counter,并再次重试。如果仍未能成功发送请求并接收响应,则请求者QP将退出SQ WQE并创建SQ CQE,报告本地检测到的错误。

2.1.3 Packet Loss

2.1.3.1 报文丢失的原因

CRC error

Link Version error(LRH:LVer 应该为0):若设备收到报文,但其链路层不支持LRH:LVer字段中显示的链路版本,则丢弃报文。

Packet Length:报文长度超过链路对端端口的MTU大小,则不会发送到该端口,丢弃报文。

DLID:若LRH:DLID字段包含0000h(保留DLID),该数据报会被交换机或路由器丢弃。

VL error:若接收或传输数据包所需的VL缓冲区不起作用,数据报不能被接收或传输。

2.1.3.2 RQ Logic Detects Lost Request Packet(s)

RQ Logic 检测丢失的请求
RQ Logic在收到下一个request packet时检测到丢失,即request packet的PSN不等于ePSN,且 不在duplicate request区域;
RQ Logic在收到问题request packet之后没有额外的request packet,此时RQ Logic不会接收额外 request Packet。

RQ Logic处理PSN Sequence Error的Nak Packet
当检测到一个或多个request packet丢失,RQ Logic将Nak返回请求方的SQ Logic,错误码是PSN Sequence Error。

RQ Logic行为
RQ Logic会忽略所有新请求(除了duplicate requests),直到接收到包含ePSN的有效request packet。

2.1.3.3 SQ Logic Detects Lost Request Packet(s)

若有问题的request packet之后没有发出其他request packet,且其需要响应,SQ Logic的Transport Timer会应等待响应而超时,并且发起重传(若Retry Count没有用尽)。

② 若有问题的request packet之后发出其他request packet,若达到了RQ Logic,RQ Logic会按PSN Sequence Error处理,若未达到,但有问题的request packet需要响应,SQ Logic的Transport Timer会应等待响应而超时,并且发起重传(若Retry Count没有用尽)。

2.1.3.4 Response Packet Lost

response packet丢失时可能出现的情况:
Transport Timer超时

通过合并应答自动修复:若Send或RDMA Write的Ack packet丢失,请求方收到具有更高PSN的后续响应包时,将隐式确认之前丢失Ack packet的未完成request packet。

丢失RDMA Read response packet(s):通过接收一个PSN高于下一个预期RDMA Read响应PSN来检测,它被称为Implied Sequence Error Nak。RDMA Read请求必须被重传(假设SQ Logic的Retry Count没有被耗尽),此外,SQ Logic必须在RDMA Read请求之后重试所有已启动到fabric中的请求数据包。

丢失Atomic response packet:通过接收一个PSN高于下一个预期Atomic响应PSN来检测,Atomic请求必须被重传(假设SQ Logic的Retry Count没有被耗尽),此外,SQ Logic必须重试在事件之后启动到启动到fabric中的请求数据包。

2.2 Nak Errors

2.2.1 简述

能通过重传解决的相关Nak:

PSN Sequence Error Nak:可以重传。(AETH:Syndrome 01100000)
② Receiver Not Ready(RNR) Nak:可以重传。(AETH:Syndrome 001TTTTT)

Nak  Format:

图d. AETH Field

Table d. AETH Syndrome Field

bit 7bit 6:5bit 4:0Definition
000C CCCC

ACK(C CCCC=credit count)

001T TTTT

RNR NAK(T TTTT=timer value)

010X XXXX

reserved

011N NNNNNAK(N NNNN=NAK code)

Table e.  Nak Codes

NAK Code(AETH bits 4:0)

Definition

0 0000

PSN Sequence Error

0 0001

Invalid Request

0 0010

Remote Access Error

0 0011Remote Operational Error
0 0100

Invalid RD Request

0 0101Operation In Progress
0 0101-1 1111

reserved

2.2.2 General Rules

RDMA Read :包含正确的Nak error code的Ack packet被替换为RDMA Read响应包,Nak的PSN与被返回的RDMA Read响应包的PSN一致,且错误的payload不返回。

② 当产生RNR Nak,Nak packet的PSN与响应方RQ Logic未准备好处理的请求包PSN一致。

③ 响应方返回RNR Nak后,返回等待请求方发送含ePSN的request packet。

④ 响应方遵守一下规则:

  • Nak显示PSN Sequence Error,响应方 QP 的RQ Logic会忽略随后接收到的新请求,直到接收到其PSN为ePSN的有效请求;
  • 响应方需继续响应重复请求,但不能Nak响应在处理重复请求时可能出现的错误。

2.2.3 PSN Sequence Error Nak

Before Transmitting PSN Sequence Error Nak :在错误请求之前收到的任何请求包都必须在发出Nak之前执行完成,并响应,Nak可以有效地合并早期未完成请求的响应,作为先前未完成的Send、RDMA Write、Atomic操作或RDMA Read请求的隐式响应。

Reason for the PSN Sequence Error Nak:响应方QP的RQ Logic检测到请求包的PSN不等于ePSN,也不在重复报文区域,则返回PSN Sequence Error Nak,返回的Nak的PSN为响应方的ePSN。若为RDMA Read操作,一个包含PSN Sequence Error 的Nak将取代被Nak的响应包,且Nak的PSN与被返回的RDMA Read响应包的PSN一致。

RQ Logic Behavior after Returning PSN Sequence Error Nak:序列错误不影响响应QP的RQ,也不使用RQ WQE,返回Nak后,RQ Logic继续等待ePSN正确的入站请求报文。返回Nak后,RQ Logic丢弃后续收到的非ePSN的请求包(除了有效的重复请求)。

Requester‘s Reaction on Receipt of PSN Sequence  Error Nak:请求方 SQ Logic的输出指针回到出故障点(为重发数据包作准备),从此故障点之前重发是合法的,视为重复请求,SQ Logic会一直重发直到成功。

SQ Logic Retries until Successful or Exhausted:
a) Retry Count用完前,请求方SQ Logic收到PSN序列错误的数据包,SQ Logic会减少3位Retry Counter,每当清除未完成请求时,Retry Counter会重新加载其初始值 。

b) 若重试次数用完,以下三种场景:Automatic Path Migration(APM)支持该情况,该情况下CA需要迁移,迁移后请求方SQ Logic重载计数器;支持APM,迁移发生,计数器再次耗尽;不支持APM,Retry Count耗尽。

c) 后两种场景,SQ Logic会退出SQ WQE,创建一个SQ CQE并报告检测出“Tansport Retry Counter Exceeded”错误,请求方QP会转至Error状态,以防止software在错误发生之前向SQ发布产生竞争的条件,并且失败的WQE之后发布到SQ的所有WQE都会退役,并创建响应CQE,表明处于Completed-Flushed in Error状态。

2.2.4 Receiver Not Ready(RNR) NAK

Reason for RNR Nak:某些情况下,响应方QP的RQ Logic可能暂时无法接收入站的请求包:
a) 入站消息可能是Send或RDMA Write With Immediate,两者都需要RQ WQE来处理入站消息,缺少RQ WQE将导致RQ Logic无法处理入站消息。

b) 也有响应方无法处理其他类型请求的可能。

在这种情况下,RQ Logic允许发出RNR Nak相应当前请求包,发布RNR Nak响应请求包很少见。

RNR Nak Packet Contains Minimum Retry Delay Period:
a) RNR Nak Packet Format:当返回RNR Nak,Nak的PSN是被RNR Nak的请求包的PSN。返回RNR Nak时,Nak报文的Syndrome域表示返回RNR Nak时,Syndrome的后五位包含一个Timer值,这是请求方QP的SQ Logic重传当前请求包之前必须等待的最小时间。

b) Timeout Supplied During QP Setup:QP建立期间,software向QPC提供timeout值,当由于缺少RQ WQE来处理当前请求而发出RNR Nak时,该超时值将返回。若由于任何其他原因返回RNR Nak,则在Nak Syndrome字段中返回的timeout值是implementation-specific。

On QP Setup, RNR Nak Retry Count Is Set:建立连接的过程中,两个CA的CM在REQ与REP消息中交换RNR Nak Retry Count,该值储存在两个QP的QPC中,若值为7表示无限次重试。

After Delay, Requester May Retransmit the Request Packet:接收到RNR Nak后,请求方可以在等待一段时间(RNR Nak中指定的timeout值)后,重试相同的数据包(与响应方返回的RNR Nak中的PSN一致)。若请求方在重传之前未能等待指定的时间间隔,响应方可以静默丢弃它。

During Timeout, RQ Logic Prepares to Receive Request:在发布包含RNR Retry最小超时值的RNR Nak后,RQ Logic开始做重传的准备。RNR Nak可能会在响应传入的Send或RDMA Write With Immediate请求操作时被发布,这些操作都要求使用RQ WQE,若当前RQ中没有WR,将发送RNR Nak,RQ Logic也将采取行动将WR发布到RQ以处理即将被重试的操作,通常这将包括请求与CA关联的software application将WR发布到QP的RQ。

RQ Logic Behavior after Returning RNR Nak:返回RNR Nak后,响应方QP的RQ Logic的行为:
a) 对响应方QP的RQ没有影响,也没有使用RQ WQE。返回Nak后,RQ Logic继续等待ePSN正确的入站请求包。
b) 返回Nak后,RQ Logic将丢弃后续收到的PSN不等于ePSN的请求包(有效重复请求除外)。

Requester Receives RNR Nak and Retries Request:当接收到RNR Nak,若请求方QP的SQ Logic RNR Nak Retry Counter不为7(7表示无限重传),请求方将减少RNR Nak Counter。只要Retry Counter非零,请求方可继续重传。在重传时若收到正确的响应(非RNR Nak),Retry Counter会重载其初始值。

When Requester Has Exhausted Retries:如果请求方耗尽了RNR Nak Retry Counter,但仍未成功发送有问题的请求包,将采取一下行为:
a) SQ WQE退役,创建上报Processing-RNR Retry Counter Exceeded错误的SQ CQE。
b) 请求方QP转换成错误状态,以防竞争条件出现。即software发现错误已发生之前向SQ发布任何进一步的WQE。
c) 失败的WQE退役后,所有发布至SQ的WQE都将退役,并且创建相应的SQ CQE,比表明CQE处于Completed-Flushed in Error状态。

Table f. RNR Nak’s Syndrome  Timer Encoding

RDMA MR的重注册是指在RDMA操作中,对已经注册过的内存区域进行再次注册的过程。重注册可以用来更新内存区域的属性或者重新分配MR的本地和远程key。 重注册的过程如下: 1. 首先,需要使用原来注册时所使用的RDMA操作上下文和被注册的Buffer地址、长度来创建一个新的Memory Region对象。 2. 通过调用RDMA库提供的重注册函数,将新创建的Memory Region对象与原来的Memory Region对象进行重注册。重注册函数通常会返回一个新的本地key和远程key。 3. 更新原来Memory Region对象中的本地key和远程key,使其与新的本地key和远程key保持一致。这样,原来的Memory Region对象就完成了重注册。 需要注意的是,重注册并不会改变Memory Region对象的物理地址和长度,只会更新Memory Region对象的本地key和远程key。因此,在进行RDMA操作时,需要使用新的本地key和远程key来指示要操作的内存区域。 总结一下,RDMA MR的重注册包括以下步骤: 1. 创建一个新的Memory Region对象。 2. 调用重注册函数,将新的Memory Region对象与原来的Memory Region对象进行重注册,并获得新的本地key和远程key。 3. 更新原来的Memory Region对象中的本地key和远程key,使其与新的本地key和远程key保持一致。 引用: 注册一个Memory Region之后,这个时候这个Memory Region也就有了它自己的属性:context: RDMA操作上下文,addr: MR被注册的Buffer地址,length: MR被注册的Buffer长度,lkey:MR被注册的本地key,rkey:MR被注册的远程key。 注意无论是DMA或者RDMA都要求物理地址连续,这是由DMA引擎所决定的。那么怎么进行内存注册呢?创建两个key (local和remote)指向需要操作的内存区域,注册的keys是数据传输请求的一部分。 RDMA的特点是绕过了内核数据直接到网卡,所以速度快,减轻CPU负担,底层实现有很多厂家。infiniband的价格很快,RoCE使用较多,下面主要讲讲这个。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值