2 导致重传的Error
导致重传的Error主要有四类,如下表:
Table a. Error Type
Condition | Description |
---|---|
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:
=4.096us x =(2 x PacketLifeTime)+ responder QP’s Target Ack Delay
Local Ack Timeout :位宽5bit,每个QP都有,用于导出;
PacketLifeTime:数据包在源端口和目的端口之间传输的最大时间,从PathRecord获得;
Target Ack Delay:从收到请求包到发送相应的响应包的时间,位宽5bit;
:由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 |
Launch Condition | 接收RNR NAK后 | 发送request packet时(包括,设置AckReq位的Request packet;RDMA Read request;Atomic operation request) |
Stop Condition | RNR 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 NAK | Ack超时;RDMA READ操作与Atomic操作的回复包的PSN大于期望值;丢失报文的NAK |
Timer | RNR NAK Retry Timer | Transport Timer |
Bit Wide | 3 | 3 |
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 7 | bit 6:5 | bit 4:0 | Definition |
---|---|---|---|
0 | 00 | C CCCC | ACK(C CCCC=credit count) |
0 | 01 | T TTTT | RNR NAK(T TTTT=timer value) |
0 | 10 | X XXXX | reserved |
0 | 11 | N NNNN | NAK(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 0011 | Remote Operational Error |
0 0100 | Invalid RD Request |
0 0101 | Operation 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