本申請涉及計算機(jī)技術(shù)領(lǐng)域,具體涉及網(wǎng)絡(luò)技術(shù)領(lǐng)域,尤其涉及用于處理遠(yuǎn)程直接內(nèi)存訪問請求的方法和裝置。
背景技術(shù):
RDMA(Remote Direct Memory Access,遠(yuǎn)程直接內(nèi)存訪問),是為了解決網(wǎng)絡(luò)傳輸中服務(wù)器端數(shù)據(jù)處理的延遲而產(chǎn)生的。RDMA與傳統(tǒng)以太網(wǎng)的區(qū)別主要在于,數(shù)據(jù)由適配器從源端內(nèi)存直接讀出,經(jīng)傳輸介質(zhì)到達(dá)遠(yuǎn)端后被適配器直接寫入目的區(qū)域。在使用RDMA技術(shù)時,發(fā)起者只需指定遠(yuǎn)端內(nèi)存讀寫地址,開啟傳輸并等待傳輸完成即可。整個傳輸過程幾乎無需兩端操作系統(tǒng)參與,無需復(fù)雜的協(xié)議層處理,亦無需多余數(shù)據(jù)拷貝,因此RDMA的延時能比傳統(tǒng)以太網(wǎng)快一個數(shù)量級。此外,RDMA的傳輸介質(zhì)一般是光纖,能提供極高的通信帶寬,以滿足業(yè)務(wù)巨大的吞吐量需求。
然而,在使用RDMA技術(shù)時,在保證小數(shù)據(jù)包微秒級延時的前提下,如何增大小數(shù)據(jù)包的傳輸QPS從而提高光纖鏈路的帶寬利用率以及改善應(yīng)用業(yè)務(wù)的處理能力和實時性,是一個亟需解決的技術(shù)問題。
技術(shù)實現(xiàn)要素:
本申請的目的在于提出一種改進(jìn)的用于處理遠(yuǎn)程直接內(nèi)存訪問請求的方法和裝置,來解決以上背景技術(shù)部分提到的技術(shù)問題。
第一方面,本申請?zhí)峁┝艘环N用于處理遠(yuǎn)程直接內(nèi)存訪問請求的方法,所述方法包括:響應(yīng)于用戶空間發(fā)送批量遠(yuǎn)程直接內(nèi)存訪問RDMA請求,在RDMA網(wǎng)卡中為所述批量RDMA請求分配鏈路;將所述批量RDMA請求中的每個RDMA請求封裝成供RDMA網(wǎng)卡的鏈路識別的描述符;將所封裝成的多個描述符的描述符物理地址構(gòu)造成鏈表;將所述鏈表的起始物理地址下發(fā)至所分配的鏈路,以使用所分配的鏈路依次讀取所述鏈表中的描述符物理地址并對描述符物理地址對應(yīng)的描述符中所封裝的RDMA請求進(jìn)行處理。
在一些實施例中,所述將所封裝成的多個描述符的描述符物理地址構(gòu)造成鏈表,包括:對所述多個描述符的描述符物理地址進(jìn)行分組,得到至少一個分組;將每個分組作為鏈表的節(jié)點,構(gòu)造成鏈表。
在一些實施例中,所述對所述多個描述符的描述符物理地址進(jìn)行分組,得到至少一個分組,包括:按照預(yù)先為每個分組設(shè)置的描述符物理地址數(shù)量,對所述多個描述符的描述符物理地址進(jìn)行分組,得到至少一個分組。
在一些實施例中,所述將所封裝成的多個描述符的描述符物理地址構(gòu)造成鏈表,還包括:在所述鏈表的每個節(jié)點中記錄下一個節(jié)點中描述符物理地址的數(shù)量;以及所述方法還包括:將所述鏈表中第一個節(jié)點中描述符物理地址的數(shù)量下發(fā)給所分配的鏈路。
在一些實施例中,所述方法還包括:檢測所述RDMA網(wǎng)卡對批量RDMA請求的處理是否超時;向所述用戶空間返回用于指示正?;虺瑫r的指示信息。
在一些實施例中,所述方法還包括:檢測所述RDMA網(wǎng)卡是否接收到目標(biāo)節(jié)點或轉(zhuǎn)發(fā)節(jié)點在發(fā)生傳輸異常時發(fā)回的否定回答NACK包;當(dāng)接收到NACK包時,解析所述NACK包以確定異常類型,并向所述用戶空間返回用于指示異常類型的指示信息。
在一些實施例中,所述方法還包括:判斷所述異常類型是否為預(yù)設(shè)異常類型;若所述異常類型為預(yù)設(shè)異常類型,使用所述RDMA網(wǎng)卡進(jìn)行數(shù)據(jù)重傳。
第二方面,本申請?zhí)峁┝艘环N用于處理遠(yuǎn)程直接內(nèi)存訪問請求的裝置,所述裝置包括:分配單元,用于響應(yīng)于用戶空間發(fā)送批量遠(yuǎn)程直接內(nèi)存訪問RDMA請求,在RDMA網(wǎng)卡中為所述批量RDMA請求分配鏈路;封裝單元,用于將所述批量RDMA請求中的每個RDMA請求封裝成供RDMA網(wǎng)卡的鏈路識別的描述符;構(gòu)造單元,用于將所封裝成的多個描述符的描述符物理地址構(gòu)造成鏈表;第一下發(fā)單元,用于將所述鏈表的起始物理地址下發(fā)至所分配的鏈路,以使用所分配的鏈路依次讀取所述鏈表中的描述符物理地址并對描述符物理地址對應(yīng)的描述符中所封裝的RDMA請求進(jìn)行處理。
在一些實施例中,所述構(gòu)造單元包括:分組子單元,用于對所述多個描述符的描述符物理地址進(jìn)行分組,得到至少一個分組;構(gòu)造子單元,用于將每個分組作為鏈表的節(jié)點,構(gòu)造成鏈表。
在一些實施例中,所述分組子單元進(jìn)一步用于:按照預(yù)先為每個分組設(shè)置的描述符物理地址數(shù)量,對所述多個描述符的描述符物理地址進(jìn)行分組,得到至少一個分組。
在一些實施例中,所述構(gòu)造單元還包括:記錄單元,用于在所述鏈表的每個節(jié)點中記錄下一個節(jié)點中描述符物理地址的數(shù)量;以及所述裝置還包括:第二下發(fā)單元,用于將所述鏈表中第一個節(jié)點中描述符物理地址的數(shù)量下發(fā)給所分配的鏈路。
在一些實施例中,所述裝置還包括:超時檢測單元,用于檢測所述RDMA網(wǎng)卡對批量RDMA請求的處理是否超時;返回單元,用于向所述用戶空間返回用于指示正常或超時的指示信息。
在一些實施例中,所述裝置還包括:包檢測單元,用于檢測所述RDMA網(wǎng)卡是否接收到目標(biāo)節(jié)點或轉(zhuǎn)發(fā)節(jié)點在發(fā)生傳輸異常時發(fā)回的否定回答NACK包;解析單元,用于當(dāng)接收到NACK包時,解析所述NACK包以確定異常類型,并向所述用戶空間返回用于指示異常類型的指示信息。
在一些實施例中,所述裝置還包括:判斷單元,用于判斷所述異常類型是否為預(yù)設(shè)異常類型;重傳單元,用于若所述異常類型為預(yù)設(shè)異常類型,使用所述RDMA網(wǎng)卡進(jìn)行數(shù)據(jù)重傳。
本申請?zhí)峁┑挠糜谔幚磉h(yuǎn)程直接內(nèi)存訪問請求的方法和裝置,在RDMA網(wǎng)卡中為批量RDMA請求分配鏈路,并將批量RDMA請求中多個RDMA請求所封裝的描述符對應(yīng)的物理地址構(gòu)造成鏈表,并將該鏈表的起始物理地址下發(fā)給RDMA網(wǎng)卡,從而使RDMA網(wǎng)卡使用所分配的鏈路依次讀取鏈表中各個節(jié)點以對上述多個RDMA請求進(jìn)行處理,從而實現(xiàn)了RDMA請求的批量處理,在針對遠(yuǎn)程主機(jī)中離散的等長內(nèi)存區(qū)段的多個RDMA請求進(jìn)行處理時,處理器可以一次性批量處理,避免多次處理對處理器資源的消耗,從而提高處理效率。
附圖說明
通過閱讀參照以下附圖所作的對非限制性實施例所作的詳細(xì)描述,本申請的其它特征、目的和優(yōu)點將會變得更明顯:
圖1是本申請可以應(yīng)用于其中的示例性系統(tǒng)架構(gòu)圖;
圖2是根據(jù)本申請的用于處理遠(yuǎn)程直接內(nèi)存訪問請求的方法的一個實施例的流程圖;
圖3是圖2實施例中所處理的批量RDMA請求的一個示例;
圖4a、4b、4c分別是根據(jù)圖2實施例及可選實現(xiàn)方式中所構(gòu)造的鏈表的示意圖;
圖5是根據(jù)本申請的用于處理遠(yuǎn)程直接內(nèi)存訪問請求的方法的又一個實施例的流程圖;
圖6是根據(jù)本申請的用于處理遠(yuǎn)程直接內(nèi)存訪問請求的裝置的一個實施例的結(jié)構(gòu)示意圖;
圖7是適于用來實現(xiàn)本申請實施例的終端設(shè)備或服務(wù)器的計算機(jī)系統(tǒng)的結(jié)構(gòu)示意圖。
具體實施方式
下面結(jié)合附圖和實施例對本申請作進(jìn)一步的詳細(xì)說明??梢岳斫獾氖?,此處所描述的具體實施例僅僅用于解釋相關(guān)發(fā)明,而非對該發(fā)明的限定。另外還需要說明的是,為了便于描述,附圖中僅示出了與有關(guān)發(fā)明相關(guān)的部分。
需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互組合。下面將參考附圖并結(jié)合實施例來詳細(xì)說明本申請。
圖1示出了可以應(yīng)用本申請的用于處理遠(yuǎn)程直接內(nèi)存訪問請求的方法或裝置的實施例的示例性系統(tǒng)架構(gòu)100。
如圖1所示,系統(tǒng)架構(gòu)100可以包括主機(jī)101和主機(jī)105。其中主機(jī)101包括CPU(Central Processing Unit,中央處理器)102、存儲器103和RDMA網(wǎng)卡104,主機(jī)105包括CPU106、RDMA網(wǎng)卡107和存儲器108。此外,存儲器103包括用戶空間1031和內(nèi)核空間1032,存儲器108包括用戶空間1081和內(nèi)核空間1082。
主機(jī)101或主機(jī)105可以通過各自的RDMA網(wǎng)卡接收和發(fā)送數(shù)據(jù),RDMA網(wǎng)卡也可以與用戶空間進(jìn)行數(shù)據(jù)交互。以主機(jī)101為例,RDMA網(wǎng)卡104可以直接對用戶空間1031中的數(shù)據(jù)進(jìn)行處理后發(fā)送出去,也可以對從外部接收到的數(shù)據(jù)進(jìn)行處理后緩存到用戶空間1031中。此外,RDMA網(wǎng)卡104可以通過網(wǎng)絡(luò)與主機(jī)105中的RDMA網(wǎng)卡107進(jìn)行數(shù)據(jù)交互,以接收或發(fā)送數(shù)據(jù)。
需要說明的是,本申請實施例所提供的用于處理遠(yuǎn)程直接內(nèi)存訪問請求的方法可以由主機(jī)101或主機(jī)102執(zhí)行,相應(yīng)地,用于處理遠(yuǎn)程直接內(nèi)存訪問請求的裝置一般設(shè)置于主機(jī)101或主機(jī)102中。
應(yīng)該理解,圖1中的主機(jī)、CPU、RDMA網(wǎng)卡等設(shè)備的數(shù)目僅僅是示意性的。根據(jù)實現(xiàn)需要,可以具有任意數(shù)目的主機(jī)、CPU、RDMA網(wǎng)卡以及存儲器。
繼續(xù)參考圖2,示出了根據(jù)本申請的用于處理遠(yuǎn)程直接內(nèi)存訪問請求的方法的一個實施例的流程200。所述的用于處理遠(yuǎn)程直接內(nèi)存訪問請求的方法,包括以下步驟:
步驟201,響應(yīng)于用戶空間發(fā)送批量遠(yuǎn)程直接內(nèi)存訪問RDMA請求,在RDMA網(wǎng)卡中為上述批量RDMA請求分配鏈路。
在本實施例中,用于處理遠(yuǎn)程直接內(nèi)存訪問請求的方法運行于其上的電子設(shè)備(例如圖1所示的主機(jī)101或主機(jī)102)可以接收用戶空間的RDMA請求。其中,所接收的RDMA請求可以是批量RDMA請求,即包括多個RDMA請求。這些RDMA請求可以是讀請求,也可以是寫請求。例如,批量RDMA請求可以是如圖3所示將遠(yuǎn)端進(jìn)程多個離散的等長內(nèi)存區(qū)段傳輸至本地進(jìn)程的一個連續(xù)大區(qū)段的操作。
RDMA網(wǎng)卡是支持RDMA功能的網(wǎng)卡,RDMA網(wǎng)卡中可以設(shè)置有多個用于對RDMA請求進(jìn)行處理的鏈路Link??蛇x的,RDMA網(wǎng)卡可以是基于FPGA實現(xiàn)的。商用RDMA解決方案需要專門的適配器和交換機(jī),費用昂貴,因此RDMA網(wǎng)卡可以是參考RDMA標(biāo)準(zhǔn)并利用FPGA(Field Programmable Gate Array)實現(xiàn)的兼容系統(tǒng)。使用基于FPGA實現(xiàn)的RDMA網(wǎng)卡,可以降低成本,提高可定制性。
對于上述批量RDMA請求,電子設(shè)備可以在RDMA網(wǎng)卡中為該批量RDMA請求分配鏈路,以使用所分配的鏈路進(jìn)行后續(xù)處理。
步驟202,將上述批量RDMA請求中的每個RDMA請求封裝成供RDMA網(wǎng)卡的鏈路識別的描述符。
在本實施例中,基于步驟201中得到的批量RDMA請求中的每個RDMA請求,上述電子設(shè)備(例如圖1所示的主機(jī)101或主機(jī)105)可以將對應(yīng)的RDMA請求封裝為供RDMA網(wǎng)卡的鏈路識別的描述符。
步驟203,將所封裝成的多個描述符的描述符物理地址構(gòu)造成鏈表。
在本實施例中,基于步驟203中針對每個RDMA請求封裝成的描述符,電子設(shè)備上可以將這些描述符的描述符物理地址構(gòu)成鏈表。所構(gòu)造的鏈表可以參照圖4a。如圖4a所示,鏈表中每個節(jié)點除了記錄當(dāng)前節(jié)點對應(yīng)的描述符外,還會有一個地址域,用于指向下一個節(jié)點,該地址域可以命名為nxt_addr。
步驟204,將鏈表的起始物理地址下發(fā)至所分配的鏈路,以使用所分配的鏈路依次讀取鏈表中的描述符物理地址并對描述符物理地址對應(yīng)的描述符中所封裝的RDMA請求進(jìn)行處理。
在本實施例中,針對步驟203所構(gòu)造的鏈表,電子設(shè)備將鏈表的起始物理地址下發(fā)至所分配的鏈路,以使用所分配的鏈路依次讀取上述鏈表中的描述符物理地址并對描述符物理地址對應(yīng)的描述符中所封裝的RDMA請求進(jìn)行處理。
由于所分配的鏈路得到鏈表的起始物理地址,RDMA網(wǎng)卡中所分配的鏈路可以通過鏈表的起始物理地址依次讀取作為鏈表各個節(jié)點的描述符物理地址,從而可以根據(jù)描述符物理地址訪問到對應(yīng)的描述符。如此,RDMA網(wǎng)卡可以對各個描述符進(jìn)行識別,從而處理描述符所封裝的RDMA請求。
在現(xiàn)有技術(shù)中,RDMA網(wǎng)卡中每個鏈路需要管理一系列信息。對于遠(yuǎn)程讀操作,本地終端需要記錄的信息包括:請求標(biāo)識、序列號、輪詢地址、控制信息;遠(yuǎn)程終端則需要記錄請求標(biāo)識和長度計數(shù)等信息。而對遠(yuǎn)程終端,本地需要記錄:請求標(biāo)識、序列號、輪詢地址、控制信息、長度計數(shù);遠(yuǎn)程終端則可以不記錄信息。其中,由于網(wǎng)絡(luò)有最大傳輸單元(MTU,Max Transfer Unit)限制,需要用長度計數(shù)進(jìn)行分組包計數(shù),同時,需要請求標(biāo)識、序列號來判斷數(shù)據(jù)包是否為一個過期請求。其中,上述信息中對應(yīng)單個RDMA請求。
在本實施例中,RDMA網(wǎng)卡中每個鏈路只需重新定義以上信息域即可。其中,請求標(biāo)識、序列號、輪詢地址均對應(yīng)一個批量RDMA請求。例如,每新增一個批量RDMA請求,請求標(biāo)識增加1。此外,對于長度計數(shù),RDMA網(wǎng)卡需要使用第一計數(shù)信息(例如rdma_length)表示一次RDMA所需操作的數(shù)據(jù)長度,并使用第二計數(shù)信息(例如batch_length)表示一次批量RDMA請求中所有第一計數(shù)信息的加和。如此,只需額外增加第二計數(shù)信息,即可以將一個鏈路的生命周期從一次RDMA操作,擴(kuò)展到一次批量RDMA操作。此外,對于遠(yuǎn)程寫操作,在本地需要存儲第一計數(shù)信息,將第二計數(shù)信息置入RDMA數(shù)據(jù)包,并在目的端進(jìn)行存儲和分組計數(shù)。對于遠(yuǎn)程讀操作,將第一計數(shù)信息置入RDMA數(shù)據(jù)包發(fā)送給目的節(jié)點,在本地存儲第二計數(shù)信息以進(jìn)行分組計數(shù)。
在本實施例的一些可選的實現(xiàn)方式中,上述步驟203包括:對上述多個描述符的描述符物理地址進(jìn)行分組,得到至少一個分組;將每個分組作為鏈表的節(jié)點,構(gòu)造成鏈表。在該實現(xiàn)方式中,可以對描述符進(jìn)行分組,每個節(jié)點可以對應(yīng)一組描述符,這樣RDMA網(wǎng)卡可以每次讀取一組描述符,從而可以提高讀取效率。
在本實施例的一些可選的實現(xiàn)方式中,上述對上述多個描述符的描述符物理地址進(jìn)行分組,得到至少一個分組,包括:按照預(yù)先為每個分組設(shè)置的描述符物理地址數(shù)量,對上述多個描述符的描述符物理地址進(jìn)行分組,得到至少一個分組。在該實現(xiàn)方式中,所構(gòu)造的鏈表中每個節(jié)點對應(yīng)的分組中描述符的數(shù)量可以設(shè)定為相同的數(shù)值。這樣,RDMA網(wǎng)卡即可以每次讀取固定數(shù)目的描述符,實現(xiàn)較為容易。可選的,每個分組中描述符數(shù)量可以設(shè)置為4,對應(yīng)的鏈表結(jié)構(gòu)如圖4b所示。在圖4b中所示的鏈表中,描述符進(jìn)行4個一組,RDMA網(wǎng)卡可以每次讀取4個描述符,如果鏈表的長度不是4的整數(shù)倍,則在結(jié)尾進(jìn)行補(bǔ)零。假設(shè)每個描述符需要占用64字節(jié)空間,一次批量RDMA請求最多支持讀取128個離散數(shù)據(jù)塊,則需要64×128=8KB空間,對應(yīng)兩個物理頁。因此,需要為RDMA網(wǎng)卡中的每個鏈路分配8KB的空間,則一共需要8KB×256=2MB大小的連續(xù)內(nèi)存空間。
在本實施例的一些可選實現(xiàn)方式中,上述步驟203還包括:在上述鏈表的每個節(jié)點中記錄下一個節(jié)點中描述符物理地址的數(shù)量。同時,上述方法還包括:將上述鏈表中第一個節(jié)點中描述符物理地址的數(shù)量下發(fā)給所分配的鏈路。該實現(xiàn)方式中,所構(gòu)造的鏈表可以參照圖4c。如圖4c所示,可以將每個分組的數(shù)量設(shè)定為不同的數(shù)值,各個節(jié)點對應(yīng)分組中描述符物理地址的數(shù)量分別為2、4、3。該實現(xiàn)方式中,由于每個節(jié)點中描述符物理地址的數(shù)量不固定,因此每個節(jié)點需要通過描述符數(shù)目域表明下一個節(jié)點對應(yīng)的分組中描述符的個數(shù),該描述符數(shù)目域可以命名為nxt_adj_num。如果采用這種方法,軟件每次下發(fā)一次批量RDMA操作,不僅需要下發(fā)一個起始地址,還需要多寫一個寄存器下發(fā)給RDMA網(wǎng)卡,表明第一個節(jié)點的分組中描述符的個數(shù)。該實現(xiàn)方式更靈活,在出現(xiàn)跨頁時可以將跨頁前后分成兩個不同的分組,從而可以解決一個分組中描述符的物理地址跨頁時RDMA網(wǎng)卡無法一次性讀取一組描述符的問題。
本申請的上述實施例提供的方法在RDMA網(wǎng)卡中為批量RDMA請求分配鏈路,并將批量RDMA請求中多個RDMA請求所封裝的描述符對應(yīng)的物理地址構(gòu)造成鏈表,并將該鏈表的起始物理地址下發(fā)給RDMA網(wǎng)卡,從而使RDMA網(wǎng)卡使用所分配的鏈路依次讀取鏈表中各個節(jié)點以對上述多個RDMA請求進(jìn)行處理,從而實現(xiàn)了RDMA請求的批量處理,在針對遠(yuǎn)程主機(jī)中離散的等長內(nèi)存區(qū)段的多個RDMA請求進(jìn)行處理時,處理器可以一次性批量處理,避免多次處理對處理器資源的消耗,從而提高處理效率。
進(jìn)一步參考圖5,其示出了用于處理遠(yuǎn)程直接內(nèi)存訪問請求的方法的又一個實施例的流程500。該用于處理遠(yuǎn)程直接內(nèi)存訪問請求的方法的流程500,包括以下步驟:
步驟501,響應(yīng)于用戶空間發(fā)送批量遠(yuǎn)程直接內(nèi)存訪問RDMA請求,在RDMA網(wǎng)卡中為上述批量RDMA請求分配鏈路。
在本實施例中,步驟501的具體處理可以參考圖2對應(yīng)實施例的步驟201,這里不再贅述。
步驟502,將上述批量RDMA請求中的每個RDMA請求封裝成供RDMA網(wǎng)卡的鏈路識別的描述符。
在本實施例中,步驟502的具體處理可以參考圖2對應(yīng)實施例的步驟202,這里不再贅述。
步驟503,將所封裝成的多個描述符的描述符物理地址構(gòu)造成鏈表。
在本實施例中,步驟503的具體處理可以參考圖2對應(yīng)實施例的步驟203,這里不再贅述。
步驟504,將鏈表的起始物理地址下發(fā)至所分配的鏈路,以使用所分配的鏈路依次讀取鏈表中的描述符物理地址并對描述符物理地址對應(yīng)的描述符中所封裝的RDMA請求進(jìn)行處理。
在本實施例中,步驟504的具體處理可以參考圖2對應(yīng)實施例的步驟204,這里不再贅述。
步驟505,檢測RDMA網(wǎng)卡對批量RDMA請求的處理是否超時。
在實際處理批量RDMA請求時,可能會出現(xiàn)如下異常。第一,鏈路層鏈路中斷。這種情況下,對應(yīng)的節(jié)點發(fā)送拓?fù)洚惓V袛?,整個網(wǎng)絡(luò)重新發(fā)起拓?fù)洌缓蟾侣酚杀?。相關(guān)節(jié)點的發(fā)送緩沖區(qū)中的數(shù)據(jù)一直殘留,從而導(dǎo)致一些數(shù)據(jù)包超時。第二,鏈路層誤碼。這種情況可以通過循環(huán)冗余校驗(CRC,Cyclic Redundancy Check)檢查來去除99%的誤碼情況,檢查到CRC誤碼后,可以選擇硬件重傳,也可以選擇NACK(否定回答)。CRC檢查可以在相鄰節(jié)點直接做,也可以在源節(jié)點和目的節(jié)點之間做。第三,網(wǎng)絡(luò)層的路由信息錯誤。FPGA邏輯異?;蛘叽懋惓?dǎo)致路由信息錯誤,從而使一些數(shù)據(jù)包被丟棄,進(jìn)一步導(dǎo)致傳輸超時。第四,網(wǎng)絡(luò)層死鎖。網(wǎng)絡(luò)層形成環(huán)形依賴死鎖,需要進(jìn)行數(shù)據(jù)包刪除,從而導(dǎo)致一些數(shù)據(jù)包操作,可以選擇在刪除數(shù)據(jù)包時發(fā)送NACK。第五,F(xiàn)PGA邏輯異常。發(fā)生單粒子效應(yīng)等情況導(dǎo)致FPGA邏輯錯誤,進(jìn)而導(dǎo)致一個或多個RDMA操作超時。第六,F(xiàn)PGA發(fā)生PCIE邏輯錯誤。FPGA和主機(jī)的PCIE(總線和接口標(biāo)準(zhǔn))鏈路故障,導(dǎo)致大量請求超時。本實施例通過步驟405和步驟406可以提供超時機(jī)制,在超時后會返回給用戶一個異常返回值。該超時機(jī)制可以在硬件由于誤碼、死鎖、斷路等情況產(chǎn)生丟包時觸發(fā),不會給源節(jié)點返回任何信息,命令發(fā)起者最終會發(fā)現(xiàn)請求超時,返回值只有正常和超時兩種情況。
在本實施例中,電子設(shè)備可以通過RDMA網(wǎng)卡檢測批量RDMA請求的處理是否超時。
步驟506,向用戶空間返回用于指示正?;虺瑫r的指示信息。
在本實例中,基于步驟505中進(jìn)行的檢測,電子設(shè)備可以確定批量RDMA請求的處理是正常還是超時,電子設(shè)備可以將指示正常還是超時的指示信息返回給用戶空間。運行在用戶空間的應(yīng)用程序即可根據(jù)該指示信息執(zhí)行對應(yīng)的策略。
此外,電子設(shè)備也可以在發(fā)生超時時執(zhí)行對應(yīng)的異常策略。例如,由于引入批量RDMA請求處理,超時可能導(dǎo)致軟硬件狀態(tài)不一致。當(dāng)硬件(RDMA網(wǎng)卡)超時后,軟件將該鏈路分配給其他請求,同時該鏈路對應(yīng)的鏈表空間會被新的批量RDMA請求所更新,而硬件之前舊的批量RDMA請求并沒有執(zhí)行結(jié)束。所以,硬件需要為每個鏈路維護(hù)一個最新的序列信息,如果當(dāng)前待讀取描述符的序列信息已經(jīng)過期,則丟棄該請求。軟件在每次下發(fā)RDMA命令之前,首先將鏈路標(biāo)識和對應(yīng)的序列下發(fā)下來,當(dāng)前序列占用48位,所以只要寫一次64位寄存器即可,而且下發(fā)描述符鏈表的地址寄存器之間不需要加鎖。當(dāng)發(fā)生超時后,驅(qū)動需要立即將當(dāng)前的序列加一并下發(fā)給硬件,通過這種方式可以通知硬件對應(yīng)鏈路的請求已經(jīng)過期,從而避免過期的描述符鏈表被繼續(xù)執(zhí)行。
在本實施例的一些可選實現(xiàn)方式中,上述方法還包括:檢測上述RDMA網(wǎng)卡是否接收到目標(biāo)節(jié)點或轉(zhuǎn)發(fā)節(jié)點在發(fā)生傳輸異常時發(fā)回的否定回答NACK包;當(dāng)接收到NACK包時,解析上述NACK包以確定異常類型,并向上述用戶空間返回用于指示異常類型的指示信息。
當(dāng)發(fā)生誤碼時,目的節(jié)點給源節(jié)點發(fā)送一個NACK包,表明數(shù)據(jù)包CRC校驗錯誤。當(dāng)發(fā)生死鎖刪包時,轉(zhuǎn)發(fā)節(jié)點給源節(jié)點發(fā)送一個NACK包,表明數(shù)據(jù)包由于死鎖被刪除。當(dāng)目的節(jié)點拒絕RDMA請求時,給源節(jié)點發(fā)送一個NACK包,表明請求被拒絕。此時,該實現(xiàn)方式中提供的機(jī)制會被觸發(fā)。該實現(xiàn)方式中,返回值有正常、超時、誤碼異常、死鎖異常、請求拒絕異常等。
在本實施例的一些可選實現(xiàn)方式中,上述方法還包括:判斷上述異常類型是否為預(yù)設(shè)異常類型;若上述異常類型為預(yù)設(shè)異常類型,使用上述RDMA網(wǎng)卡進(jìn)行數(shù)據(jù)重傳。該實現(xiàn)方式在上一實現(xiàn)方式的基礎(chǔ)上,對一些可恢復(fù)的異常進(jìn)行重傳嘗試,比如誤碼和死鎖刪包等。
從圖5中可以看出,與圖2對應(yīng)的實施例相比,本實施例中的用于處理遠(yuǎn)程直接內(nèi)存訪問請求的方法的流程500突出了對異常進(jìn)行處理的步驟。由此,本實施例描述的方案可以通過對RDMA請求的批量處理從而提高效率的同時,也盡可能地對有可能引入的處理異常進(jìn)行處理,提高了處理的可靠性。
進(jìn)一步參考圖6,作為對上述各圖所示方法的實現(xiàn),本申請?zhí)峁┝艘环N用于處理遠(yuǎn)程直接內(nèi)存訪問請求的裝置的一個實施例,該裝置實施例與圖2所示的方法實施例相對應(yīng),該裝置具體可以應(yīng)用于各種電子設(shè)備中。
如圖6所示,本實施例所述的用于處理遠(yuǎn)程直接內(nèi)存訪問請求的裝置600包括:分配單元601、封裝單元602、構(gòu)造單元603和第一下發(fā)單元604。其中,分配單元601用于響應(yīng)于用戶空間發(fā)送批量遠(yuǎn)程直接內(nèi)存訪問RDMA請求,在RDMA網(wǎng)卡中為上述批量RDMA請求分配鏈路;封裝單元602用于將上述批量RDMA請求中的每個RDMA請求封裝成供RDMA網(wǎng)卡的鏈路識別的描述符;構(gòu)造單元603用于將所封裝成的多個描述符的描述符物理地址構(gòu)造成鏈表;而第一下發(fā)單元604用于將上述鏈表的起始物理地址下發(fā)至所分配的鏈路,以使用所分配的鏈路依次讀取上述鏈表中的描述符物理地址并對描述符物理地址對應(yīng)的描述符中所封裝的RDMA請求進(jìn)行處理。
在本實施例中,分配單元601、封裝單元602、構(gòu)造單元603和第一下發(fā)單元604的具體處理可以參考圖2對應(yīng)實施例的步驟201、步驟202、步驟203以及步驟204,這里不再贅述。
在本實施例的一些可選實現(xiàn)方式中,構(gòu)造單元603包括:分組子單元,用于對上述多個描述符的描述符物理地址進(jìn)行分組,得到至少一個分組;構(gòu)造子單元,用于將每個分組作為鏈表的節(jié)點,構(gòu)造成鏈表。該實現(xiàn)方式的具體處理可以參考圖2對應(yīng)實施例中相應(yīng)的實現(xiàn)方式,這里不再贅述。
在本實施例的一些可選實現(xiàn)方式中,分組子單元進(jìn)一步用于:按照預(yù)先為每個分組設(shè)置的描述符物理地址數(shù)量,對上述多個描述符的描述符物理地址進(jìn)行分組,得到至少一個分組。該實現(xiàn)方式的具體處理可以參考圖2對應(yīng)實施例中相應(yīng)的實現(xiàn)方式,這里不再贅述。
在本實施例的一些可選實現(xiàn)方式中,構(gòu)造單元603還包括:記錄子單元(未示出),用于在上述鏈表的每個節(jié)點中記錄下一個節(jié)點中描述符物理地址的數(shù)量。以及,裝置600還包括:第二下發(fā)單元(未示出),用于將上述鏈表中第一個節(jié)點中描述符物理地址的數(shù)量下發(fā)給所分配的鏈路。該實現(xiàn)方式的具體處理可以參考圖2對應(yīng)實施例中相應(yīng)的實現(xiàn)方式,這里不再贅述。
在本實施例的一些可選實現(xiàn)方式中,裝置600還包括:超時檢測單元(未示出),用于檢測上述RDMA網(wǎng)卡對批量RDMA請求的處理是否超時;返回單元(未示出),用于向用戶空間返回用于指示正?;虺瑫r的指示信息。該實現(xiàn)方式的具體處理可以參考圖5對應(yīng)實施例中相應(yīng)的步驟,這里不再贅述。
在本實施例的一些可選實現(xiàn)方式中,裝置600還包括:包檢測單元(未示出),用于檢測上述RDMA網(wǎng)卡是否接收到目標(biāo)節(jié)點或轉(zhuǎn)發(fā)節(jié)點在發(fā)生傳輸異常時發(fā)回的否定回答NACK包;解析單元(未示出),用于當(dāng)接收到NACK包時,解析NACK包以確定異常類型,并向上述用戶空間返回用于指示異常類型的指示信息。該實現(xiàn)方式的具體處理可以參考圖5對應(yīng)實施例中相應(yīng)的實現(xiàn)方式,這里不再贅述。
在本實施例的一些可選實現(xiàn)方式中,裝置600還包括:判斷單元(未示出),用于判斷上述異常類型是否為預(yù)設(shè)異常類型;重傳單元(未示出),用于若上述異常類型為預(yù)設(shè)異常類型,使用上述RDMA網(wǎng)卡進(jìn)行數(shù)據(jù)重傳。該實現(xiàn)方式的具體處理可以參考圖5對應(yīng)實施例中相應(yīng)的實現(xiàn)方式,這里不再贅述。
下面參考圖7,其示出了適于用來實現(xiàn)本申請實施例的終端設(shè)備或服務(wù)器的計算機(jī)系統(tǒng)700的結(jié)構(gòu)示意圖。
如圖7所示,計算機(jī)系統(tǒng)700包括中央處理單元(CPU)701,其可以根據(jù)存儲在只讀存儲器(ROM)702中的程序或者從存儲部分708加載到隨機(jī)訪問存儲器(RAM)703中的程序而執(zhí)行各種適當(dāng)?shù)膭幼骱吞幚?。在RAM 703中,還存儲有系統(tǒng)700操作所需的各種程序和數(shù)據(jù)。CPU 701、ROM 702以及RAM 703通過總線704彼此相連。輸入/輸出(I/O)接口705也連接至總線704。
以下部件連接至I/O接口705:包括鍵盤、鼠標(biāo)等的輸入部分706;包括諸如陰極射線管(CRT)、液晶顯示器(LCD)等以及揚(yáng)聲器等的輸出部分707;包括硬盤等的存儲部分708;以及包括諸如LAN卡、調(diào)制解調(diào)器等的網(wǎng)絡(luò)接口卡的通信部分709。通信部分709經(jīng)由諸如因特網(wǎng)的網(wǎng)絡(luò)執(zhí)行通信處理。驅(qū)動器510也根據(jù)需要連接至I/O接口705??刹鹦督橘|(zhì)511,諸如磁盤、光盤、磁光盤、半導(dǎo)體存儲器等等,根據(jù)需要安裝在驅(qū)動器510上,以便于從其上讀出的計算機(jī)程序根據(jù)需要被安裝入存儲部分708。
特別地,根據(jù)本公開的實施例,上文參考流程圖描述的過程可以被實現(xiàn)為計算機(jī)軟件程序。例如,本公開的實施例包括一種計算機(jī)程序產(chǎn)品,其包括有形地包含在機(jī)器可讀介質(zhì)上的計算機(jī)程序,所述計算機(jī)程序包含用于執(zhí)行流程圖所示的方法的程序代碼。在這樣的實施例中,該計算機(jī)程序可以通過通信部分709從網(wǎng)絡(luò)上被下載和安裝,和/或從可拆卸介質(zhì)511被安裝。
附圖中的流程圖和框圖,圖示了按照本申請各種實施例的系統(tǒng)、方法和計算機(jī)程序產(chǎn)品的可能實現(xiàn)的體系架構(gòu)、功能和操作。在這點上,流程圖或框圖中的每個方框可以代表一個模塊、程序段、或代碼的一部分,所述模塊、程序段、或代碼的一部分包含一個或多個用于實現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。也應(yīng)當(dāng)注意,在有些作為替換的實現(xiàn)中,方框中所標(biāo)注的功能也可以以不同于附圖中所標(biāo)注的順序發(fā)生。例如,兩個接連地表示的方框?qū)嶋H上可以基本并行地執(zhí)行,它們有時也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的是,框圖和/或流程圖中的每個方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行規(guī)定的功能或操作的專用的基于硬件的系統(tǒng)來實現(xiàn),或者可以用專用硬件與計算機(jī)指令的組合來實現(xiàn)。
描述于本申請實施例中所涉及到的單元可以通過軟件的方式實現(xiàn),也可以通過硬件的方式來實現(xiàn)。所描述的單元也可以設(shè)置在處理器中,例如,可以描述為:一種處理器包括分配單元、封裝單元、構(gòu)造單元和第一下發(fā)單元。其中,這些單元的名稱在某種情況下并不構(gòu)成對該單元本身的限定,例如,構(gòu)造單元還可以被描述為“將所封裝成的多個描述符的描述符物理地址構(gòu)造成鏈表的單元”。
作為另一方面,本申請還提供了一種非易失性計算機(jī)存儲介質(zhì),該非易失性計算機(jī)存儲介質(zhì)可以是上述實施例中所述裝置中所包含的非易失性計算機(jī)存儲介質(zhì);也可以是單獨存在,未裝配入終端中的非易失性計算機(jī)存儲介質(zhì)。上述非易失性計算機(jī)存儲介質(zhì)存儲有一個或者多個程序,當(dāng)所述一個或者多個程序被一個設(shè)備執(zhí)行時,使得所述設(shè)備:響應(yīng)于用戶空間發(fā)送批量遠(yuǎn)程直接內(nèi)存訪問RDMA請求,在RDMA網(wǎng)卡中為所述批量RDMA請求分配鏈路;將所述批量RDMA請求中的每個RDMA請求封裝成供RDMA網(wǎng)卡的鏈路識別的描述符;將所封裝成的多個描述符的描述符物理地址構(gòu)造成鏈表;將所述鏈表的起始物理地址下發(fā)至所分配的鏈路,以使用所分配的鏈路依次讀取所述鏈表中的描述符物理地址并對描述符物理地址對應(yīng)的描述符中所封裝的RDMA請求進(jìn)行處理。
以上描述僅為本申請的較佳實施例以及對所運用技術(shù)原理的說明。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,本申請中所涉及的發(fā)明范圍,并不限于上述技術(shù)特征的特定組合而成的技術(shù)方案,同時也應(yīng)涵蓋在不脫離所述發(fā)明構(gòu)思的情況下,由上述技術(shù)特征或其等同特征進(jìn)行任意組合而形成的其它技術(shù)方案。例如上述特征與本申請中公開的(但不限于)具有類似功能的技術(shù)特征進(jìn)行互相替換而形成的技術(shù)方案。