首页 理论教育PCIExpress体系结构导读N123算法

PCIExpress体系结构导读N123算法

【摘要】:使用N123算法时,需要设置N1缓冲处理这些因为网络延时产生的报文。希望读者认真理解N1缓冲在N123算法中的意义。N123+算法基于N123算法,但是发送Credit报文的方式略有不同。N123算法要求Cur-rent节点每转发N2个报文后,才能给Upstream节点发送一个Credit报文;而N123+算法除了要求同样的规则之外,还要求Current节点在一个时间段RTT中至少发送一个Credit报文,即发送上一个Credit报文之后,即便Current节点没有向Downstream转发了N2报文,在一个时间段RTT中也至少要向Upstream节点发送一次Credit报文。

N123算法的使用规则如下所示。

(1)Current节点发送上一个Credit报文之后,至少需要向Downstream节点转发N2个报文后,才能发送下一个Credit报文。

(2)Credit报文中存放的Credit为Current节点已经发送的报文数,其最大值为N2+N3,其中N1不参与“Credit”的计算,因为在N123算法中,N1用来防止Current节点的溢出。当Current节点使用的缓冲超过N2+N3时,Current节点不再向Upstream节点发送Credit报文,即便Current节点已经向Downstream转发了N2个报文。

(3)Upstream节点收到Credit报文后,使用Crd_Bal参数保存这个报文中的Credit,当Crd_Bal参数不为0时,Upstream节点可以发送数据报文。Upstream节点每发送一个报文,Crd_Bal参数将减1,当这个参数为0时,Upstream节点停止发送报文。Crd_Bal参数的初始值为N2+N3。

采用以上算法时,必须保证N1≤RTT×BLINK/Packet_Size,此时Current节点的接收缓冲才不会溢出。下文将详细解释为什么N1的最小值为RTT×BLINK/Packet_Size,并用一个实例说明N1最小值的设置原因,而不进行理论分析。

假设在某一个时间点,Upstream节点的Crd_Bal参数为0,而Current节点的N2和N3缓冲区被完全占满,此时Upstream节点不能发送新的报文,直到获得新的Credit报文。之后Upstream、Current节点和Downstream节点按照以下步骤运行。

(1)当Current节点向Downstream节点转发x(x≥N2)个报文后,将通过Credit报文将x传递给Upstream节点。

(2)当Upstream节点收到这个Credit后,将更新Crd_Bal参数为x,之后可以向Current节点发送x个报文。这些报文将通过链路不断发向Current节点。

(3)假设此时Current节点接收到的报文个数为z1(z1≤x),Current节点在接收这些报文的同时,向Downstream节点又转发了y个报文,此时Current节点一共需要向Upstream节点发送的Credit为(x+y-z1)。假定此时Downstream节点由于缓存不足,禁止接收来自Current节点的报文,Current节点的空闲缓存将定格为x+y-z1。

(4)在Current节点向Upstream节点发送Credit(该值为x+y-z1)的过程中,该节点又陆续收到了一些报文,其个数为z2。值得注意的是“Current节点发送Credit报文”到“Up-stream节点收到这个报文”有一段延时,该延时等于TCU

(5)Upstream节点收到新的Credit后,将x+y-z1个报文发向Current节点,除此之外在从Upstream节点到Current节点间的链路上还留有一部分报文,其个数为z3。这段残留的报文数为在TUC时间段内传递的数据报文。

(6)因此Current节点最终收到的报文个数为(x+y-z1)+z2+z3个。(www.chuimin.cn)

(7)其中x+y-z1个报文可以被Current节点中空闲缓存吸收,而多出来的z2+z3个数据报文将放置到N1中。

Max(z2+z3)的计算方法如公式9-1所示。

Max(z2+z3)=(TCU×BLINK+TUC×BLINK)/Packet_Size

=RTT×BLINK/Pack et_Size (9-1)

因此只要N1被设置为RTT×BLINK/Packet_Size,采用N123算法就一定不会在Current节点上产生Overrun。

通过以上分析,可以发现由于物理链路传送的延时,采用N123算法时,Current节点将多收到z2+z3个报文,其中z2是Current节点更新Upstream节点Credit的过程中产生;而z3是Upstream节点更新完毕Credit后,在网络线路上残留的报文。使用N123算法时,需要设置N1缓冲处理这些因为网络延时产生的报文。

以上过程并非严格的数学证明,只是使用较为简单的推理说明,在某些情况下,在Cur-rent节点中的N1至少为RTT×BLINK/Packet_Size时,才能够保证Current节点的接收缓冲不会溢出。希望读者认真理解N1缓冲在N123算法中的意义。

N123+算法基于N123算法,但是发送Credit报文的方式略有不同。N123算法要求Cur-rent节点每转发N2个报文后,才能给Upstream节点发送一个Credit报文;而N123+算法除了要求同样的规则之外,还要求Current节点在一个时间段RTT中至少发送一个Credit报文,即发送上一个Credit报文之后,即便Current节点没有向Downstream转发了N2报文,在一个时间段RTT中也至少要向Upstream节点发送一次Credit报文。

采用这种方法,因为在每一个RTT时间段里都会向Upstream节点发送Credit信息,因此F将小于这个Credit,而这个Credit又小于N2+N3。为此使用这种方法时,N1的计算方法如公式9-2所示。

N1=Min(N2+N3,RTT×BLINK/Packet_Size) (9-2)

使用这种方法,在(N2+N3)<RTT×BLINK/Packet_Size时,Current节点将可以使用较小的N1缓冲,从而节约了接收缓冲。这种算法对于网络延时较长的通信网络有所帮助,而网络延时较短时,但是采用这种方法,发送Credit报文所占用的带宽较大。在PCIe总线中,端到端的延时相对较小,因此没有必要使用这种流量控制机制。