发明内容
本发明所要解决的技术问题在于,提供一种减少RDMA引擎片上缓存的方法、装置、系统及芯片,可以节省RDMA引擎的缓存资源。
为解决上述技术问题,作为本发明的一方面,提供一种减少RDMA引擎片上缓存的方法,其至少包括如下步骤:
在需要进行远程访问操作时,从主机内存读取本次发送队列条目SQ WQE,并存入SQ WQE缓存中;
生成RDMA请求报文并发送给远端RDMA设备,并在SQ WQE缓存中删除与所述RDMA请求报文对应的SQ WQE;
接收并解析来自远端RDMA设备的ACK报文,并至少获得所述ACK报文中的队列号QPN;
根据所述队列号QPN从队列管理上下文QPC缓存中获取相应的QPC,从所述QPC得到期望的消费者指针ECI;
向本端主机上报携带有所述ECI的完成队列条目CQE,以使本端主机根据所述ECI从主机内存中获取相应的SQ WQE,并确定是否需要将所述CQE上报给上层用户。
其中,所述本端主机根据所述ECI从主机内存中获取相应的SQWQE,并确定是否需要将所述CQE上报给上层用户,进一步包括:
根据所述ECI从主机内存中索引获取相应的SQWQE,根据所述SQ WQE中的cqe_ind确定是否需要向上层用户进行上报;如果cqe_ind为1,则需要将所述SQ WQE的CQE上报给上层用户,如果cqe_ind为0,则将当前CQE丢弃。
其中,进一步包括:
在每次CQE上报完成后,将ACK报文携带的包序列号PSN加1作为期望包的序列号ePSN,并保存到QPC缓存的QPC中。
其中,进一步包括:
在上报一次CQE后,将当前ECI值加1,根据ACK报文携带的消息序列号MSN确定是否继续上报后续的CQE。
其中,进一步包括:所述发送队列条目(SQ WQE)中具有该发送队列条目对应的首包序列号(fPSN);
在接收来自远端RDMA设备的报文过程中,如果判断到需要对RDMA请求报文进行断点重传时,向主机内存请求获取相应的发送队列条目,并至少根据所述发送队列条目中存储的首包序列号(fPSN)确定断点重传的位置。
其中,进一步包括:本端主机通过下述方式为每个发送队列条目生成对应消息的首包序列号fPSN,并存入主机内存的发送队列条目中::
如果所述SQ WQE为首个,则本端主机在与远端RDMA设备建立链接时协商确定其fPSN;
否则,采用下述公式计算当前的SQ WQE对应的fPSN:
fPSN=上一个SQ WQE的fPSN+ceil(messagelength/PMTU)
其中,message length为上一个SQ WQE的消息长度,ceil为向上取整函数,PMTU为路径最大传输单元的长度值;当message length为0时,将ceil(message length/PMTU))赋值为1;
将所获得的fPSN存入主机内存的所述SQWQE中。
其中,所述至少根据所述发送队列条目中存储的首包序列号(fPSN)确定断点重传的位置,进一步包括:
在需要对RDMA请求报文进行断点重传时,根据QPC中存储的ECI,向主机内存请求获取所述ECI对应的SQ WQE;
根据所述SQ WQE中的fPSN以及从QPC中获取的当前ePSN,以下式计算确定重传报文的首字节:
SQ WQE对应的首字节+(ePSN-fPSN)*PMTU。
相应地,本发明的再一方面,还提供一种减少RDMA引擎片上缓存的装置,应用于RDMA引擎中,其至少包括:
发送队列条目读取单元,用于在需要进行远程访问操作时,从主机内存读取本次发送队列条目SQ WQE,并存入SQ WQE缓存中;
请求发送处理单元,用于生成RDMA请求报文并发送给远端RDMA设备,并在SQ WQE缓存中删除与所述RDMA请求报文对应的SQ WQE;
响应报文解析单元,用于接收并解析来自远端RDMA设备的ACK报文,并至少获得所述ACK报文中的队列号QPN;
ECI获取单元,用于根据所述队列号QPN从队列管理上下文QPC缓存中获取相应的QPC,从所述QPC得到期望的消费者指针ECI;
CQE上报单元,用于向本端主机上报携带有所述ECI的完成队列条目CQE,以使本端主机根据所述ECI从主机内存中获取相应的SQ WQE,并确定是否需要将所述CQE上报给上层用户。
其中,进一步包括:
ePSN处理单元,用于在每次CQE上报完成后,将ACK报文携带的PSN加1作为期望包的序列号ePSN,并保存到QPC缓存的QPC中;
CQE继续上报判断单元,用于在上报一次CQE后,将当前ECI值加1,根据ACK报文携带的消息序列号MSN确定是否继续上报后续的CQE。
其中,进一步包括:
重传处理单元,用于在需要对RDMA请求报文进行断点重传时,根据QPC中存储的ECI,向主机内存请求获取所述ECI对应的SQ WQE;并根据所述SQ WQE中的fPSN以及从QPC中获取的当前ePSN,以下式计算确定重传报文的首字节:SQ WQE对应的首字节+(ePSN-fPSN)*PMTU。
相应地,本发明的再一方面,还提供一种减少RDMA引擎片上缓存的系统,至少包括本端主机、主机内存以及RDMA引擎,其中:
所述RDMA引擎包括有QPC缓存、SQ WQE缓存以及如前述的减少RDMA引擎片上缓存的装置。
其中,所述本端主机进一步包括:
fPSN计算处理单元,用于通过下述方式生成对应的消息的首包序列号fPSN并存储:
如果所述SQ WQE为首个,则本端主机在与远端RDMA设备建立链接时协商确定其fPSN;
否则,采用下述公式计算当前的SQ WQE对应的fPSN:
上一个SQ WQE的fPSN+ceil(messagelength/PMTU)
其中,message length为上一个SQ WQE的消息长度,ceil为向上取整函数,PMTU为路径最大传输单元的长度值;当message length为0时,将ceil(message length/PMTU))赋值为1;
存储处理单元,用于将所获得的fPSN存入主机内存的所述SQWQE中。
其中,所述本端主机进一步包括:
上报判断处理单元,用于根据完成队列条目CQE中的ECI从主机内存中索引获取相应的SQ WQE,根据所述SQ WQE中的cqe_ind确定是否需要向上层用户进行上报;如果cqe_ind为1,则需要将所述SQ WQE的CQE上报给上层用户,如果cqe_ind为0,则将当前CQE丢弃。
本发明的再一方面,还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如前述的方法的步骤。
本发明的再一方面,还提供一种芯片,其集成有如前述的减少RDMA引擎片上缓存的系统。
实施本发明实施例,具有如下的有益效果:
本发明提供一种减少RDMA引擎片上缓存的方法、装置、系统及芯片。通过在将RDMA请求报文发送给远端RDMA设备后,将该发送队列条目删除,并且在上报CQE时只需携带对应SQ WQE的index,由本端主机根据该index去索引得到SQ WQE对应的opcode和cqe_ind,即RDMA引擎在上报CQE时无需读取SQ WQE,从而在RDMA引擎中不再需要提供缓存资源用于缓存已经被发送侧处理但仍未报告CQE的SQ WQE,从而节省了RDMA引擎的缓存资源。
此外,通过在SQ WQE增加fPSN域段,该域段由本端主机将SQ WQE放入到SQ时计算得到。在RDMA引擎发生重传时,只需要从主机内存中读取当前重传的SQWQE就可以得到fPSN,然后和QPC内的ePSN结合能得到准确的重传点,从而支持断点重传功能,还能够减少总体上对PCIE带宽的占用。
故本发明可以有效减少RDMA引擎片上缓存的使用,从而在有限的片上缓存的情况下提高RDMA的链接规模,同时能支持断点重传的功能,减少PCIE带宽的占用。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述。
如图1所示,示出了本发明提供的一种减少RDMA引擎片上缓存的方法的一个实施例的主流程示意图;一并结合图2所示,在本实施例中,所述方法运行于所述RDMA引擎中,所述方法至少包括如下的步骤:
步骤S10,在需要进行远程访问操作时,RDMA引擎从主机内存读取本次发送队列条目SQ WQE,并存入SQ WQE缓存中,所述SQ WQE中至少包含有本端主机生成的对应的消息的首包序列号fPSN,在一个消息中可能包含不止一个报文,故需要确定消息的首包序列号fPSN以进行相应的定位;
其中,远程访问操作包括RDMA支持的通信原语,例如RDMAWrite、RDMA Read、Send等操作;
步骤S11,RDMA引擎生成RDMA请求报文并发送给远端RDMA设备,并在SQ WQE缓存中删除与所述RDMA请求报文对应的SQ WQE;
步骤S12,RDMA引擎接收并解析来自远端RDMA设备的响应报文,当该响应报文为ACK报文,获得所述ACK报文中的队列号QPN、消息序列号MSN以及包序列号PSN;
步骤S13,RDMA引擎根据所述队列号QPN从队列管理上下文缓存中获取相应的QPC,从所述QPC得到期望的消费者指针ECI;
步骤S14,RDMA引擎向本端主机上报携带有所述ECI的完成队列条目CQE,以使本端主机根据所述ECI从主机内存中获取相应的SQ WQE,并确定是否需要将所述CQE上报给上层用户。
可以理解的是,在本发明的具体例子中,RDMA引擎还需要实现如下的步骤:
在每次CQE上报完成后,RDMA引擎将ACK报文携带的PSN加1作为期望包的序列号ePSN,并保存到队列管理上下文缓存的QPC中。
以及在上报一次CQE后,RDMA引擎将当前ECI值加1,根据消息序列号MSN确定是否继续上报后续的CQE。可以理解的是,ECI为期望的消费者指针,保存在QPC里面,用来指示下一个上报CQE的SQ WQE的指针(index)。MSN为消息序列号,用于指示MSN减1之前的SQ WQE已经执行完成。例如在一个例子中,当前的ECI为0,当收到一个ACK报文,报文携带的MSN为10时,那么RDMA引擎可以将index为0~9的SQ WQE的CQE都进行上报处理。
可以理解的是,在本发明的具体例子中,RDMA引擎还支持实现断点重传的功能,在接收来自远端RDMA设备的报文过程中,如果判断到需要对RDMA请求报文进行断点重传时(具体根据预先制订的检测错误的机制来判断),向主机内存请求获取相应的发送队列条目,并至少根据所述发送队列条目中存储的首包序列号(fPSN)确定断点重传的位置。具体地进一步包括:
在需要对RDMA请求报文进行断点重传时,RDMA引擎根据QPC中存储的ECI,向主机内存请求获取所述ECI对应的SQ WQE;
RDMA引擎根据所述SQ WQE中的fPSN以及从QPC中获取的当前ePSN,以下式计算确定重传报文的首字节:
SQ WQE对应的首字节+(ePSN-fPSN)*PMTU。
可以理解的是,在本发明的具体例子中,还需要本端主机实现相应的功能。
具体地,进一步包括:本端主机通过下述方式生成对应的消息的首包序列号fPSN并存储:
如果所述SQ WQE为首个,则本端主机在与远端RDMA设备建立链接时协商确定其fPSN;
否则,采用下述公式计算当前的SQ WQE对应的fPSN=
上一个SQ WQE的fPSN+ceil(messagelength/PMTU)
其中,message length为上一个SQ WQE的消息长度,ceil为向上取整函数,PMTU为路径最大传输单元的长度值;当message length为0时,将ceil(message length/PMTU))赋值为1;
将所获得的fPSN存入主机内存的所述SQWQE中。
可以理解的是,在本发明的具体例子中,所述本端主机根据所述ECI从主机内存中获取相应的SQWQE,并确定是否需要将所述CQE上报给上层用户,进一步包括:
根据所述ECI从主机内存中索引获取相应的SQWQE,根据所述SQ WQE中的cqe_ind确定是否需要向上层用户进行上报;如果cqe_ind为1,则需要将所述SQ WQE的CQE上报给上层用户,如果cqe_ind为0,则将当前CQE丢弃。
下述结合图2,对本发明涉及的更详细的完整流程及原理进行说明如下:
步骤1,本端主机将发送队列条目SQWQE放入发送队列SQ中时,需要计算该SQ WQE对应的消息的首包序列号fPSN并将fPSN放到存储于本机内存的SQ WQE里面。
其中,首个SQ WQE对应的fPSN是建链的时候协商的;非首个SQ WQE的fPSN是根据上一个SQ WQE携带的消息长度(message length)和PMTU值计算得到,当前的SQ WQE的fPSN等于上一个SQ WQE的fPSN加上ceil(messagelength/PMTU),其中,message length是上一个SQ WQE的消息长度,ceil是向上取整函数,另外当message length为0的时候,用1来代替ceil(messagelength/PMTU));在本发明实施例中提供的SQ WQE中,其至少包含有fPSN、操作码(opcode)和CQE指示值(cqe_ind)。
步骤2,本端主机将发送队列门铃寄存器(SQdoorbell)进行下发。
步骤3,RDMA引擎根据所述发送队列门铃寄存器的信息,从主机内存中读取相应的SQ WQE并存入其SQ WQE缓存,但RDMA引擎在处理完一个SQ WQE后立即将该SQ WQE从SQ WQE缓存内无效化(删除),因为当该SQ WQE对应的CQE上报的时候,RDMA引擎不再需要从其缓存中读取相应的SQ WQE。
步骤4,RDMA引擎生成RDMA请求报文,并将该RDMA请求报文发往远端,具体地,可以是诸如SEND、RDMA READ、RDMA WRITE报文等。
步骤5,经过往返时间(RTT)后,RDMA引擎接收到网络侧ACK或者READ RESPONSE报文;如果是ACK报文,则执行步骤6;
如果不是ACK报文,当发生断点重传的时候,RDMA引擎需要计算重传报文首地址。
步骤6,如果是ACK报文,则解析报文得到QPN(队列号)、MSN(消息序列号)、PSN(包序列号),其中,MSN用于指示“MSN减1”之前的SQ WQE已经执行完成。RDMA引擎先通过QPN(队列号)得到QPC(队列管理的上下文),然后从QPC得到ECI(期望的消费者指针),所述ECI表示下一个上报CQE的SQ WQE对应的指针(index)。
步骤7,RDMA引擎不需要根据ECI读取SQ WQE,只需要在上报时携带该ECL,即将ECI作为上报CQE的SQ WQE对应的index。
步骤8,当ECI对应的SQ WQE上报CQE后,RDMA引擎会将ECI加1,然后继续上报CQE,直到MSN减1对应的SQ WQE的CQE上报完成。
可以理解的是,ECI表示下一个要完成的SQWQE的index,而MSN表示MSN-1之前的SQWQE都可以完成。例如,当前的ECI为0,当收到一个ACK报文,报文携带的MSN为10时,那么RDMA引擎可以将index为0~9的SQ WQE的CQE都进行上报处理。
步骤9,本端主机在处理RDMA引擎上报的CQE时,通过CQE携带的ECI(即SQ WQE的index)索引得到SQ WQE中对应的opcode和 cqe_ind,如果cqe_ind为1则指示该SQ WQE需要上报CQE给上层用户;如果cqe_ind为0,则说明该SQ WQE不需要报告CQE给上层用户,由本端主机将RDMA引擎报告的CQE丢弃。
步骤10,RDMA引擎不需要保存SQ WQE的fPSN到QPC中,只需要将ACK报文携带的psn加1作为ePSN保存到QPC。
当发生断点重传的时候,RDMA引擎根据QPC内的ECI从主机内存读取SQ WQE从而得到fPSN,然后从QPC得到ePSN,通过计算得到重传报文的首字节,具体本计算方式为:SQWQE对应的首字节+(ePSN-fPSN)*PMTU。
可以理解的是,本发明提供的方法,通过在将RDMA请求报文发送给远端RDMA设备后,将该发送队列条目删除,并且在上报CQE时只需携带对应SQ WQE的index,由本端主机根据该index去索引得到SQ WQE对应的opcode和cqe_ind,即RDMA引擎在上报CQE时无需读取SQ WQE,从而在RDMA引擎中不再需要提供缓存资源用于缓存已经被发送侧处理但仍未报告CQE的SQ WQE,从而节省了RDMA引擎的缓存资源。
此外,通过在SQ WQE增加fPSN域段,该域段由本端主机将SQ WQE放入到SQ时计算得到。在RDMA引擎发生重传时,只需要从主机内存中读取当前重传的SQWQE就可以得到fPSN,然后和QPC内的ePSN结合能得到准确的重传点,从而支持断点重传功能。由于发生断点重传的机会很小,因而本发明实施例方案在能够支持断点重传功能的同时,还能够减少总体上对PCIE带宽的占用。
如图3所示,示出了本发明提供的一种减少RDMA引擎片上缓存的装置的一个实施例的结构示意图。所述减少RDMA引擎片上缓存的装置1应用于如图2所示的RDMA引擎中,其至少包括:
发送队列条目读取单元10,用于在需要进行远程访问操作时,从主机内存读取本次发送队列条目SQ WQE,并存入SQ WQE缓存中,所述SQ WQE中至少包含有本端主机生成的对应的消息的首包序列号fPSN;
请求发送处理单元11,用于生成RDMA请求报文并发送给远端RDMA设备,并在SQWQE缓存中删除与所述RDMA请求报文对应的SQ WQE;
响应报文解析单元12,用于接收并解析来自远端RDMA设备的ACK报文,并获得所述ACK报文中的队列号QPN、消息序列号MSN以及包序列号PSN;
ECI获取单元13,用于根据所述队列号QPN从队列管理上下文QPC缓存中获取相应的QPC,从所述QPC得到期望的消费者指针ECI;
CQE上报单元14,用于向本端主机上报携带有所述ECI的完成队列条目CQE,以使本端主机根据所述ECI从主机内存中获取相应的SQ WQE,并确定是否需要将所述CQE上报给上层用户。
在一个具体的例子中,所述装置1进一步包括:
ePSN处理单元15,用于在每次CQE上报完成后,将ACK报文携带的PSN加1作为期望包的序列号ePSN保存到队列管理上下文缓存的QPC中;
CQE继续上报判断单元16,用于在上报一次CQE后,将当前ECI值加1,根据消息序列号MSN确定是否继续上报后续的CQE;以及
重传处理单元17,用于在需要对RDMA请求报文进行断点重传时,根据QPC中存储的ECI,向主机内存请求获取所述ECI对应的SQ WQE;并根据所述SQ WQE中的fPSN以及从QPC中获取的当前ePSN,以下式计算确定重传报文的首字节=SQ WQE对应的首字节+(ePSN-fPSN)*PMTU。
更多细节,可以参考并结合前述对图1和图2的描述,在此不进行赘述。
相应地,本发明的再一方面,还提供一种减少RDMA引擎片上缓存的系统,具体可以参考图2所示,所述减少RDMA引擎片上缓存的系统至少包括本端主机 2、主机内存以及RDMA引擎,其中:
所述RDMA引擎包括有QPC缓存、SQ WQE缓存以及如图3示出的减少RDMA引擎片上缓存的装置1。
其中,所述本端主机2进一步包括:
fPSN计算处理单元20,用于通过下述方式生成对应的消息的首包序列号fPSN并存储:
如果所述SQ WQE为首个,则本端主机在与远端RDMA设备建立链接时协商确定其fPSN;
否则,采用下述公式计算当前的SQ WQE对应的fPSN:
上一个SQ WQE的fPSN+ceil(messagelength/PMTU)
其中,message length为上一个SQ WQE的消息长度,ceil为向上取整函数,PMTU为路径最大传输单元的长度值;当message length为0时,将ceil(message length/PMTU))赋值为1;
存储处理单元21,用于将所获得的fPSN存入主机内存的所述SQ WQE中。
其中,所述本端主机进一步包括:
上报判断处理单元22,用于根据完成队列条目CQE中的ECI从主机内存中索引获取相应的SQ WQE,根据所述SQ WQE中的cqe_ind确定是否需要向上层用户进行上报;如果cqe_ind为1,则需要将所述SQ WQE的CQE上报给上层用户,如果cqe_ind为0,则将当前CQE丢弃。
更多的细节,可以参考并前述对图3的描述,在此不进行赘述。
本发明的再一方面,还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如前述图1至图2描述的方法的步骤。更多细节,可以参考前述对图1和图2的描述,在此不进行赘述。
本发明的再一方面,还提供一种芯片,其集成有如前述结合图3和图4描述的减少RDMA引擎上缓存的系统。更多细节,可以参考前述对图3图4描述,在此不进行赘述。
实施本发明实施例,具有如下的有益效果:
本发明提供一种减少RDMA引擎片上缓存的方法、装置、系统、芯片及存储介质。通过在SQ WQE增加fPSN域段,该域段由本端主机将SQ WQE放入到SQ时计算得到。RDMA引擎在上报CQE时只需携带对应SQ WQE的index,由本端主机根据该index去索引得到SQ WQE对应的opcode和cqe_ind,即RDMA引擎在上报CQE时无需读取SQ WQE,从而在RDMA引擎中不再需要提供缓存资源用于缓存已经被发送侧处理但仍未报告CQE的SQ WQE,从而节省了RDMA引擎的缓存资源。
同时,在RDMA引擎发生重传时,只需要从主机内存中读取当前重传的SQ WQE就可以得到fPSN,然后和QPC内的ePSN结合能得到准确的重传点,从而支持断点重传功能。
故本发明可以有效减少RDMA引擎片上缓存的使用,从而在有限的片上缓存的情况下提高RDMA的链接规模。
本领域内的技术人员应明白,本发明的实施例可提供为方法、装置、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
以上所揭露的仅为本发明一种较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。