TWI840896B - 用於raid存儲裝置的直接存儲器訪問數據路徑 - Google Patents

用於raid存儲裝置的直接存儲器訪問數據路徑 Download PDF

Info

Publication number
TWI840896B
TWI840896B TW111127775A TW111127775A TWI840896B TW I840896 B TWI840896 B TW I840896B TW 111127775 A TW111127775 A TW 111127775A TW 111127775 A TW111127775 A TW 111127775A TW I840896 B TWI840896 B TW I840896B
Authority
TW
Taiwan
Prior art keywords
storage devices
request
raid controller
subset
write
Prior art date
Application number
TW111127775A
Other languages
English (en)
Other versions
TW202314518A (zh
Inventor
曾國輔
游宗霖
張正岳
Original Assignee
美商圖睿科技有限公司
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Priority claimed from US17/486,643 external-priority patent/US11662955B2/en
Application filed by 美商圖睿科技有限公司 filed Critical 美商圖睿科技有限公司
Publication of TW202314518A publication Critical patent/TW202314518A/zh
Application granted granted Critical
Publication of TWI840896B publication Critical patent/TWI840896B/zh

Links

Abstract

公開了用於RAID存儲裝置的直接存儲器訪問數據路徑,包括:在獨立磁盤冗餘陣列(RAID)控制器處接收對寫入數據的請求,所述數據要在多個存儲設備之間分佈;至少部分地基於與所述請求相關聯的數據來計算奇偶校驗信息;使得所述奇偶校驗信息存儲在所述多個存儲設備的第一子集上;以及使得與所述請求相關聯的數據存儲在所述多個存儲設備的第二子集上,其中所述多個存儲設備被配置成直接從對於所述RAID控制器遠程的存儲器獲得與所述請求相關聯的數據,並且其中與所述請求相關聯的數據不通過所述RAID控制器。

Description

用於RAID存儲裝置的直接存儲器訪問數據路徑
本發明係有關用於RAID存儲裝置的直接存儲器訪問數據路徑。
獨立磁盤冗餘陣列(RAID)存儲裝置跨一組盤驅動器來存儲數據,以改進數據冗餘和性能。然而,用於實現RAID算法的一些常規技術會導致低效率。在其中使用硬件RAID控制器來實現RAID算法的第一示例(例如,實現RAID算法可能涉及基於要寫入到存儲盤驅動器的數據來計算校驗和)中,硬件RAID控制器成為瓶頸,尤其是在處理寫入操作時,這是因為RAID控制器需要獲得要寫入的數據,基於要寫入的數據來生成校驗和,並且將要寫入的數據連同校驗和一起存儲在RAID組的盤驅動器處。在其中主機(例如,CPU)使用軟件來實現RAID算法的第二示例中,CPU的重要計算資源可以致力於實現與RAID算法相關聯的任務,從而限制可用於實現在CPU處接收到的許多其他類型的請求的CPU資源的量。由此,以更高效的方式來實現用於盤驅動器的RAID組的RAID技術是合期望的。
本發明可以以許多方式來實現,包括作為過程;裝置;系統;物質組成;包含在計算機可讀存儲介質上的計算機程序產品;和/或處理器,諸如被配置成執行存儲在耦合到處理器的存儲器上和/或由耦合到處理器的存儲器提供的指令的處理器。在本說明書中,這些實現方式或者本發明可以採用的任何其他形式可以被稱為技術。一般而言,所公開的過程的步驟的次序可以在本發明的範圍內被更改。除非另行聲明,否則被描述為被配置成執行任務的諸如處理器或存儲器之類的部件可以被實現為被臨時配置成在給定時間處執行該任務的通用部件或被製造成執行該任務的特定部件。如本文中所使用的,術語“處理器”指代被配置成處理數據(諸如計算機程序指令)的一個或多個設備、電路和/或處理核。
下面連同圖示本發明原理的附圖一起來提供本發明的一個或多個實施例的詳細描述。結合此類實施例描述了本發明,但是本發明不限於任何實施例。本發明的範圍僅由申請專利範圍限定,並且本發明涵蓋了許多替代物、修改和等同物。在以下描述中闡述了許多具體細節,以便提供對本發明的全面理解。這些細節是出於示例的目的而提供的,並且本發明可以在沒有這些具體細節中的一些或全部的情況下根據申請專利範圍來實踐。出於清楚性的目的,沒有詳細地描述與本發明相關的技術領域中已知的技術材料,使得不會不必要地使本發明含糊難懂。
本文中描述了實現用於RAID存儲裝置的直接存儲器訪問(DMA)數據路徑的實施例。在RAID控制器處接收對寫入數據的請求,該寫入數據要在多個存儲設備之中分佈。在各種實施例中,從主機(例如,中央處理單元(CPU))接收該請求。在各種實施例中,使用圖形處理單元(GPU)來實現RAID控制器。在各種實施例中,該多個存儲設備包括存儲設備的RAID組。在各種實施例中,每個存儲設備是固態驅動器(SSD),其使用快速非易失性存儲器(NVMe)通信傳輸協議來與其他部件進行通信。在各種實施例中,每個SSD通過快速外圍組件互連(PCIe)總線與其他部件通信。在各種實施例中,響應於接收到將數據寫入到RAID存儲設備組的該請求,RAID控制器被配置成使用直接存儲器訪問(DMA)從與主機相關聯的存儲器(這個存儲器有時被稱為“主機存儲器”)讀取被請求寫入的數據。在各種實施例中,“直接存儲器訪問”指代獨立於主機來訪問主機存儲器的部件。例如,RAID控制器可以通過從主機存儲器進行直接讀取來從主機存儲器獲得待寫入數據,而沒有等待CPU將那個數據取回並發送到RAID控制器。然後,RAID控制器被配置成使用所配置的RAID模式基於待寫入數據來計算奇偶校驗信息(例如,不同的RAID模式可以使用待寫入數據來不同地計算奇偶校驗信息,並且一些RAID模式可能根本不計算/存儲奇偶校驗信息)。RAID控制器被配置成使得該奇偶校驗信息被存儲在該多個存儲設備的第一子集上(基於正在實現的具體RAID模式)。RAID控制器還被配置成使得待寫入數據被存儲在該多個存儲設備的第二子集上(基於正在實現的具體RAID模式)。由RAID控制器經由寫入命令使得存儲設備從對於RAID控制器遠程的存儲器獲得待寫入數據。在各種實施例中,由RAID控制器使得存儲設備使用DMA直接從主機存儲器讀取待寫入數據,然後在該多個存儲設備的第二子集處本地寫入所讀取的待寫入數據,其中第二子集是基於正在實現的具體RAID模式來選擇的。因為RAID組的存儲設備被指示直接從主機存儲器讀取待寫入數據和/或奇偶校驗信息,所以待寫入數據不會通過RAID控制器,並且RAID控制器由此在RAID組的存儲設備處完成寫入請求中不再充當待寫入數據或奇偶校驗信息的源。在其中RAID控制器被配置成實現不需要計算奇偶校驗信息的RAID模式(例如,RAID 0、1或10)的其他示例中,RAID控制器被完全從寫入數據路徑中移除,並且因此避免了充當瓶頸的可能性,如將在下面進一步詳細描述的那樣。
圖1是示出了用於實現用於RAID存儲裝置的直接存儲器訪問(DMA)數據路徑的系統的實施例的圖。CPU 102被配置成在主機(例如,計算機)處執行一個或多個應用。CPU 102耦合到主機存儲器104,所述主機存儲器104是由CPU 102本地可訪問的主存儲器,並且被配置成存儲將由CPU 102執行的指令。在各種實施例中,主機存儲器104包括隨機存取存儲器(RAM)。CPU 102被配置成向RAID控制器108發送請求,以用於跨至少存儲設備110、112、114和116來讀取和寫入數據,所述存儲設備中的至少一些可以與RAID組相關聯。在各種實施例中,存儲設備110、112、114和116中的每一個是具有快速非易失性存儲器(NVMe)接口的固態驅動器(SSD)。RAID控制器108包括被配置成針對跨RAID組存儲的數據來實現RAID算法的硬件部件,該RAID組包括存儲設備110、112、114和116中的至少一些。在各種實施例中,RAID控制器108是電子電路。例如,RAID控制器108是圖形處理單元(GPU),其被配置成執行快速並行計算。由RAID控制器108實現的具體RAID算法取決於RAID控制器108被配置成實現的具體RAID模式/級別。不同的RAID模式/級別採用不同數目的存儲設備、數據的鏡像(例如,在兩個或更多存儲設備上存儲相同數據的多個副本)和/或奇偶校驗信息的使用(例如,奇偶校驗信息是基於所存儲的數據來計算的,並且可以用來恢復例如由於被存儲在故障存儲設備上而變得不可用的所存儲數據的一部分)。例如,RAID 0、RAID 1和RAID 10不使用奇偶校驗信息,但是RAID 1和RAID 10確實使用數據的鏡像。而且,RAID 3、4、5和6使用奇偶校驗信息。由此,CPU 102被配置成向RAID控制器108發送對讀取和/或寫入數據(例如,與它正在執行的應用相關聯的數據)的請求,以用於RAID控制器108使用所配置的RAID模式和諸如存儲設備110、112、114和116之類的存儲設備來處理。總線106包括在其端點之間傳輸數據的硬件通信系統。在圖1的示例中,CPU 102、主機存儲器104、RAID控制器108、存儲設備110、存儲設備112、存儲設備114和存儲設備116中的每一個是總線106的端點,並且因此可以通過總線106彼此通信。總線106可以連接到圖1中未示出的另外的端點。在各種實施例中,總線106包括被配置成實現高吞吐量通信的快速外圍組件互連(PCIe)總線。
為了發起寫入操作,CPU 102被配置成通過總線106向RAID控制器108發送寫入請求。在各種實施例中,從CPU 102到RAID控制器108的寫入請求包括主機存儲器104內的(多個)位置(例如,偏移和數據長度),將由RAID控制器108分佈在RAID組上的數據被存儲在該(多個)位置處。在各種實施例中,RAID控制器108如何跨諸如存儲設備110、112、114和116之類的存儲設備來存儲與該寫入請求相關聯的待寫入數據對於CPU 102來說是透明的,並且RAID控制器108對於CPU 102來說似乎像單個NVMe驅動器。RAID控制器108如何處置來自CPU 102的寫入請求取決於RAID控制器108被配置成實現的RAID模式,如下面將描述的。
在RAID控制器108被配置成實現使用奇偶校驗信息的RAID模式(例如,RAID 3、4、5或6)的情況下,響應於接收到該寫入請求,RAID控制器108被配置成通過總線106對該寫入請求中提供的主機存儲器104內的(多個)位置執行(多個)直接存儲器訪問(DMA)讀取操作,以獲得待寫入數據,然後基於從主機存儲器104獲得的待寫入數據來生成奇偶校驗信息。在各種實施例中,在RAID控制器108生成奇偶校驗信息之後,RAID控制器108被配置成在主機存儲器104處執行DMA寫入操作,以將奇偶校驗信息寫入到主機存儲器104。然後,RAID控制器108被配置成通過總線106向RAID組的存儲設備的第一子集發送寫入命令的第一集合以使得存儲設備的該第一子集:通過總線106來執行從主機存儲器104對奇偶校驗信息的DMA讀取,並且然後將奇偶校驗信息寫入到存儲設備的第一子集。例如,寫入命令的第一集合包括主機存儲器104內的從其讀取奇偶校驗信息的(多個)位置、以及還有存儲設備的第一子集之內的在其處存儲奇偶校驗信息的(多個)位置。RAID控制器108進一步被配置成通過總線106向存儲設備的第二子集發送寫入命令的第二集合以使得存儲設備的那個第二子集:通過總線106來執行從主機存儲器104對待寫入數據的DMA讀取,並且然後將待寫入數據寫入在存儲設備的第二子集上。例如,寫入命令的第二集合包括主機存儲器104內的從其讀取待寫入數據的(多個)位置、以及還有存儲設備的第二子集內的在其處存儲待寫入數據的(多個)位置。在一些實施例中,寫入命令的第一集合和寫入命令的第二集合可以由RAID控制器108在單個批中一起發出。如本文中所描述,在處置來自CPU 102的寫入請求中,在其中RAID控制器108被配置成存儲其已經在主機存儲器104處生成的奇偶校驗信息的各種實施例中,RAID控制器108通過指示RAID組的相關存儲設備使用DMA讀取直接從主機存儲器104獲得待寫入數據以及奇偶校驗信息兩者來最小化成為對於完成寫入請求的瓶頸的可能性。與其中存儲設備將需要從RAID卡讀取待寫入數據和奇偶校驗信息兩者並且其中RAID卡本身將會成為對寫入請求可以被完成所處的速度的限制的常規硬件RAID卡形成對照,RAID控制器108既不會將與寫入請求相關聯的待寫入數據、也不會將所生成的奇偶校驗信息存儲在其本地存儲器中。
在RAID控制器108被配置成實現不使用奇偶校驗信息的RAID模式(例如,RAID 0、1或10)的情況下,響應於接收到寫入請求,RAID控制器108被配置成:通過總線106向RAID組的存儲設備的子集發送寫入命令的集合,以使存儲設備的那個子集:通過總線106來執行從主機存儲器104對待寫入數據的DMA讀取,並且然後將待寫入數據寫入在該存儲設備的子集上。例如,該寫入命令的集合包括主機存儲器104內的從其讀取待寫入數據的(多個)位置、以及還有該存儲設備的子集內的在其處存儲待寫入數據的(多個)位置。如本文中所描述,在處置來自CPU 102的寫入請求中,在其中不需要RAID控制器108計算奇偶校驗信息的各種實施例中,RAID控制器108通過指示RAID組的相關存儲設備使用DMA讀取直接從主機存儲器104獲得待寫入數據來避免成為對於完成寫入請求的瓶頸。換句話說,在其中不需要RAID控制器108計算奇偶校驗信息的各種實施例中,RAID控制器108被配置成僅接收寫入請求,然後繼而向存儲設備的子集發出寫入命令,同時對數據的所有DMA讀取和寫入由存儲設備經由主機存儲器104來完成。與其中存儲設備將需要從RAID卡讀取待寫入數據並且其中RAID卡本身將會成為對寫入請求可以被完成所處的速度的限制的常規硬件RAID卡形成對照,RAID控制器108不會將與寫入請求相關聯的待寫入數據存儲在其本地存儲器中。
因此,根據本文中所描述的一些實施例,RAID控制器108作為將數據寫入到RAID存儲設備的數據路徑中的瓶頸的影響被最小化或完全移除。而且,與CPU內的常規軟件RAID實現方式形成對照,在本文中描述的各種實施例中,CPU 102不需要使用其資源來實現RAID算法,並且可以替代地將RAID控制器108視為處置讀取和寫入請求的單個NVMe存儲設備,該RAID控制器108部分地通過實現RAID算法來這樣做。
在一些其他實施例中,在處理寫入請求時,RAID控制器108被配置成將奇偶校驗信息存儲在其自己的本地存儲器(圖1中未示出)中(而不是執行DMA寫入以將奇偶校驗信息寫入到主機存儲器104)。因此,RAID控制器108被配置成通過總線106向存儲設備的第一子集發送寫入命令的第一集合,以使得存儲設備的那個第一子集:通過總線106來執行從主機存儲器104對奇偶校驗信息的DMA讀取,並且然後將奇偶校驗信息寫入到存儲設備的第一子集。在RAID控制器108已經將奇偶校驗信息存儲在其自己的本地存儲器中的情況下,RAID控制器108進一步被配置成:通過總線106向存儲設備的第二子集發送寫入命令的第二集合以使存儲設備的那個第二子集:通過總線106在RAID控制器108的本地存儲器上執行DMA讀取,以獲得待寫入數據,並且然後將待寫入數據寫入到存儲設備的第二子集。與其中存儲設備將需要從RAID卡讀取待寫入數據以及奇偶校驗信息兩者並且其中RAID卡本身將會成為對寫入請求可以被完成所處的速度的限制的常規RAID卡形成對照,在此類實施例中,RAID控制器108不會將與寫入請求相關聯的待寫入數據存儲在其本地存儲器中,並且仍然可以使得存儲設備能夠在不需要從RAID控制器108的本地存儲器讀取與寫入請求相關聯的待寫入數據的情況下完成寫入請求。
為了發起讀取操作,CPU 102被配置成通過總線106向RAID控制器108發送讀取請求。在各種實施例中,從CPU 102到RAID控制器108的讀取請求包括標識信息(例如,偏移和數據長度),該標識信息與所請求的數據在從存儲設備被讀取之後應當被存儲在主機存儲器104內的何處相關聯。在各種實施例中,從CPU 102到RAID控制器108的讀取請求還包括由RAID控制器108實現的所模擬的NVMe設備上的偏移以及所請求數據的長度。響應於接收到該讀取請求,RAID控制器108被配置成首先確定使用相關RAID模式來確定所請求的數據被存儲在哪個(哪些)存儲設備上。然後,RAID控制器108被配置成向(多個)存儲設備中的(例如,存儲設備110、112、114和116當中的)所請求數據被存儲在其上的那些存儲設備發送讀取命令。在一些實施例中,從RAID控制器108發送到特定存儲設備的每個讀取命令至少包括所請求的數據的至少一部分在該存儲設備內被存儲所處的位置。讀取命令被配置成使得接收方存儲設備讀取所請求數據(的一部分),並且然後通過總線106對主機存儲器104執行所讀取數據的DMA寫入。例如,所請求的數據被存儲在主機存儲器104處的如下位置處:該位置被包括在讀取請求中,並且其中該位置由進行請求的用戶來確定。在RAID控制器108已經向其發送了讀取命令的所有存儲設備可用(健康/未故障)並且因此能夠本地讀取所請求的數據並且然後對主機存儲器104執行該數據的DMA寫入的情況下,不需要從存儲設備檢索奇偶校驗信息(如果存儲了任何奇偶校驗信息的話),並且RAID控制器108也能夠完成讀取請求,而不需要本地存儲要讀取的所請求數據。換句話說,在其上存儲了所請求數據的存儲設備中沒有一個已發生故障或已以其他方式變得不可用的情況下,RAID控制器108被配置成便於來自CPU 102的跨(多個)存儲設備(例如,在存儲設備110、112、114和116當中)的讀取請求,而不會由於作為其中存儲了所請求的數據並且在所請求的數據被放置在主機存儲器104上之前的中間位置而成為瓶頸。因此,根據本文中所描述的一些實施例,從讀取來自RAID存儲設備的數據的數據路徑中移除了RAID控制器108。
然而,在RAID控制器108已向其發送讀取命令的存儲設備中的至少一個已經發生故障或已經以其他方式變得不可用的情況下,則RAID控制器108被配置成讀取被存儲在(多個)存儲設備上的奇偶校驗信息(如果存儲了任何奇偶校驗信息的話),並且然後重建所請求的數據的缺失部分。例如,為了讀取奇偶校驗信息,RAID控制器108被配置成向存儲設備發送讀取命令,以使得存儲設備本地讀取所存儲的奇偶校驗信息,並且然後使用DMA將奇偶校驗信息寫入到主機存儲器104。RAID控制器108已經向其發送讀取命令的剩餘可用(沒有故障的)存儲設備被配置成本地讀取所請求的數據,然後對主機存儲器104執行所讀取數據的DMA寫入。RAID控制器108被配置成然後執行DMA寫入,以通過總線106將所請求數據的重建(部分)寫入到主機存儲器104,由此完成讀取請求。
如利用圖1所描述的並且將在下面詳述的各種示例中示出的,在各種實施例中,RAID控制器108被配置成:通過使得RAID組的相關存儲設備從對於RAID控制器108本身不是本地的位置(主機存儲器104)檢索待寫入數據來完成針對本地主機(諸如CPU 102)的寫入請求,並且RAID控制器108也不會成為該待寫入數據在它跨RAID組的存儲設備被分佈之前所通過的位置。此外,如利用圖1所描述的並且將在下面詳述的各種示例中示出的,在各種實施例中,RAID控制器108被配置成:通過使得RAID組的相關存儲設備本地讀取所請求的數據並且然後將該數據存儲在對於RAID控制器108遠程(不是本地)的位置(主機存儲器104)處來完成針對本地主機(諸如CPU 102)的讀取請求,並且在其中所有此類存儲設備是健康的(例如,未發生故障或以其他方式不可用)的情況下,RAID控制器108也不會成為該讀取數據在它被寫入到主機存儲器104之前所通過的位置。通過利用RAID組的存儲設備來直接發出DMA讀取和寫入,RAID控制器108能夠高效地完成主機發起的對RAID組的讀取和寫入請求。
圖2是示出了針對對於RAID存儲設備集合遠程的主機來實現用於RAID存儲裝置的直接存儲器訪問(DMA)數據路徑的系統的實施例的圖。在圖2的示例中,RDMA網絡接口控制器(RNIC)222被配置成通過網絡220與遠程主機218通信。RNIC 222是被配置成加速用於多個主機關於彼此執行DMA操作的路徑的硬件。與對於包括存儲設備210、212、214和216中的至少一些的RAID組是本地的CPU 202形成對照,遠程主機218對於RAID組是遠程的(例如,至少由網絡220與其分開)。然而,在各種實施例中,RNIC 222仍然可以通過對存儲設備(諸如存儲設備210、212、214和216)的存儲器的至少例如暴露的部分執行DMA讀取來代表遠程主機218執行高效的讀取請求。在一些實施例中,存儲設備的存儲器的各部分可以經由NVMe協議的控制器存儲器緩衝器(CMB)特徵被暴露到RNIC 222。為了發起讀取操作,遠程主機218被配置成通過網絡220向RNIC 222發送讀取請求。RNIC 222然後被配置成向RAID控制器208發送讀取請求。基於接收的讀取請求,RAID控制器208被配置成確定相關存儲設備(例如,在至少存儲設備210、212、214和216當中)上的位置(例如,地址/位置)以訪問所請求的數據。RAID控制器208然後被配置成向相關存儲設備發送讀取命令,以使得那些存儲設備將所請求的數據拷貝到它們相應的本地CMB。RAID控制器208被配置成向RNIC 222發送相關存儲設備的CMB的位置。RNIC 222然後被配置成通過總線206在存儲設備的CMB位置處執行DMA讀取,以獲得所請求的數據。在RNIC 222基於DMA讀取獲得所請求的數據之後,RNIC 222被配置成通過網絡220將所請求的數據返回回到遠程主機218。如利用圖2所描述的並且將在下面進一步詳細描述的,跨包括存儲設備210、212、214和216中的至少一些的RAID組而分佈的數據可以由遠程主機218經由RNIC 222以不需要該數據通過本地主機(例如,主機存儲器204)或被配置成跨那些存儲設備實現RAID的RAID控制器208的方式來讀取。
圖3是示出了用於處理對多個存儲設備的寫入請求的過程的實施例的流程圖。在一些實施例中,過程300由圖1的RAID控制器108來實現。
在302處,接收對寫入數據的請求,該數據要在多個存儲設備之間分佈。在各種實施例中,從主機的CPU接收該寫入請求。例如,在應用的執行期間生成該寫入請求。該寫入請求包括要寫入到存儲設備的數據在主機(例如,在主機存儲器處)上被存儲所處的一個或多個位置。
在304處,至少部分地基於與該請求相關聯的數據來計算奇偶校驗信息。對於使用奇偶校驗性的RAID模式(例如,RAID 3、4、5或6),RAID控制器被配置成使用該寫入請求中指示的位置在主機存儲器上執行DMA讀取,並且基於所讀取的數據來計算奇偶校驗信息。
在306處,使得奇偶校驗信息被存儲在該多個存儲設備的第一子集上。在各種實施例中,RAID控制器被配置成通過將RAID控制器連接到主機存儲器的(例如,PCIe)總線來執行DMA寫入操作,以將所計算的奇偶校驗信息寫入到主機存儲器上。然後,在各種實施例中,RAID控制器被配置成向被指定存儲奇偶校驗信息的一個或多個存儲設備發送(多個)寫入命令。此類(多個)寫入命令包括主機存儲器內的奇偶校驗信息已經被寫入到的位置。響應於接收到這些(多個)寫入命令,(多個)存儲設備被配置成對主機存儲器執行(多個)DMA讀取操作,以檢索奇偶校驗信息,並且然後本地存儲(在(多個)存儲設備上存儲)奇偶校驗信息。
在308處,使得與該請求相關聯的數據被存儲在該多個存儲設備的第二子集上,其中該多個存儲設備被配置成直接從對於RAID控制器遠程的存儲器獲得與該請求相關聯的數據,並且其中與該請求相關聯的數據不通過RAID控制器。RAID控制器被配置成向被指定存儲待寫入數據的存儲設備發送(多個)寫入命令。此類(多個)寫入命令包括主機存儲器之內的待寫入數據已經被存儲在主機處的位置(這些位置被包括在已從CPU接收到的寫入請求中)。響應於接收到這些(多個)寫入命令,(多個)存儲設備被配置成對主機存儲器執行DMA讀取操作,以檢索待寫入數據,並且然後本地存儲(在(多個)存儲設備上存儲)待寫入數據。因為RAID控制器已經將奇偶校驗信息存儲到主機存儲器上,並且還使得存儲設備直接從主機存儲器讀取待寫入數據,所以待寫入數據和相關奇偶校驗信息是從遠離RAID控制器的位置(主機存儲器)檢索的,而不是從RAID控制器本身檢索的。
圖4是示出了用於處理對多個存儲設備的寫入請求的過程的示例的流程圖。在一些實施例中,過程400由圖1的RAID控制器108來實現。在一些實施例中,圖3的過程300可以至少部分地由過程400來實現。
在402處,從主機接收將數據塊集合寫入到多個存儲設備的請求。在各種實施例中,從主機的CPU接收該寫入請求。該寫入請求包括要被寫入到存儲設備的數據塊集合在主機上(例如,在主機存儲器處)被存儲所處的一個或多個位置。
在404處,從與主機相關聯的主機存儲器讀取該數據塊集合。該數據塊集合是由RAID控制器使用被包括在該寫入請求中的(多個)位置、通過(例如,PCIe)總線從主機存儲器讀取的。
在406處,至少部分地基於該數據塊集合和相關RAID模式來生成奇偶校驗塊。對於使用奇偶校驗的RAID模式(例如,RAID 3、4、5或6),RAID控制器被配置成基於所讀取的數據塊集合來計算奇偶校驗信息。
在408處,直接訪問主機存儲器以在主機存儲器處寫入奇偶校驗塊。在各種實施例中,RAID控制器通過總線來執行DMA寫入,以將奇偶校驗塊寫入在主機存儲器處。
在410處,將寫入命令發送到該多個存儲設備,其中寫入命令被配置成使得該多個存儲設備:直接訪問主機存儲器以讀取該數據塊集合和奇偶校驗塊;以及在該多個存儲設備處本地存儲該數據塊集合和奇偶校驗塊。RAID控制器被配置成向存儲設備發送寫入命令,並且其中寫入命令包括主機存儲器處的該數據塊集合以及還有奇偶校驗塊被存儲所處的位置。例如,每個寫入命令包括主機存儲器之內的數據塊的地址和/或奇偶校驗塊的地址(例如,奇偶校驗塊可以與數據塊鄰接地存儲)。存儲設備然後被配置成通過總線來執行讀取DMA讀取,以訪問主機存儲器並且讀取該數據塊集合以及奇偶校驗塊。每個存儲設備被配置成本地寫入所讀取的數據塊或所讀取的奇偶校驗塊,以完成該寫入請求。
圖5A和5B示出了跨存儲設備的RAID組完成從主機接收的寫入請求的示例過程。圖5A和5B示出了示例過程,該示例過程可以至少部分地用來實現圖3的過程300或圖4的過程400。
在圖5A中,在步驟502處,主機的CPU向RAID控制器發送寫入請求,並且其中該請求請求RAID控制器將數據塊D1、D2和D3寫入到存儲裝置。該寫入請求包括數據塊D1、D2和D3在與CPU相關聯的主機存儲器處被存儲所處的位置(例如,偏移和數據長度)。在步驟504處,響應於接收到該寫入請求,RAID控制器被配置成在該寫入請求中提供的位置處通過(例如,PCIe)總線對主機存儲器執行DMA讀取操作,以從主機存儲器讀取數據塊D1、D2和D3。假定RAID控制器正在實現涉及使用奇偶校驗信息的RAID模式,在506處,RAID控制器然後基於所讀取的數據塊D1、D2和D3來計算奇偶校驗塊P。
圖5A的示例在圖5B中繼續。在圖5B中,在508處,RAID控制器被配置成通過總線對主機存儲器執行DMA寫入操作,以將奇偶校驗塊P寫入到主機存儲器。然後,在510處,RAID控制器被配置成通過總線向存儲設備1、2、3和4發送寫入命令,以分別使得存儲設備1、2、3和4通過總線來執行DMA讀取操作,以讀取數據塊D1、數據塊D2、數據塊D3和奇偶校驗塊P。由RAID控制器向存儲設備1、2、3和4發送的相應寫入命令包括數據塊D1、數據塊D2、數據塊D3和奇偶校驗塊P在主機存儲器中的相應位置。在步驟512a、512b、512c和512d處,存儲設備1、2、3和4通過總線來執行DMA讀取操作,以從主機存儲器讀取數據塊D1、數據塊D2、數據塊D3和奇偶校驗塊P,並且還分別本地寫入數據塊D1、數據塊D2、數據塊D3和奇偶校驗塊P。如圖5A和5B的示例中所示,如本文中所描述的各種實施例中所描述,RAID控制器被配置成便於完成CPU的寫入請求,而不成為存儲設備要從其讀取數據塊或奇偶校驗塊的源。
圖6A到6D示出了針對不使用奇偶校驗信息的RAID模式的便於寫入請求而不會變成內嵌到寫入數據路徑的RAID控制器中涉及的命令隊列的示例。在跨圖6A至6D描述的特定示例中,RAID控制器被配置成通過在不使用奇偶校驗信息或冗餘的情況下跨兩個存儲設備均勻地劃分數據來實現RAID模式0。
圖6A示出了使用RAID 0模式將與兩個寫入請求(寫入請求1和寫入請求2)相關聯的數據寫入到RAID組的兩個存儲設備(SSD 0和SSD 1)的結果,其甚至跨兩個存儲設備來劃分數據並且也不使用奇偶校驗信息。在跨圖6A至6D描述的示例中,主機(未示出)已發出寫入請求1和寫入請求2,以在與RAID組相關聯的存儲設備SSD 0和SSD 1處完成。寫入請求1請求將偏移0處的8KB數據寫入到包括SSD 0和SSD 1的RAID組。因為4KB是所配置的頁面大小,並且因此是存儲設備所使用的最小數據單位,所以實現RAID 0的RAID控制器(未示出)通過將8KB數據劃分成4KB和4KB的兩個塊來處理寫入請求1,所述兩個塊然後分別跨SSD 0和SSD 1來分佈。寫入請求2請求將偏移8KB處的4KB數據寫入到包括SSD 0和SSD 1的RAID組。在給定與寫入請求2相關聯的4KB大小的數據與被寫入到存儲設備的數據單位相匹配的情況下,實現RAID 0的RAID控制器(未示出)不需要劃分寫入請求2,而是可以使得該4KB數據僅被寫入到SSD 0。
圖6B示出了與寫入請求1和2相關聯的數據被存儲在主機的主機存儲器內的何處的示例。在跨圖6A至6D示出的示例中,由主機的CPU使用NVMe協議來通過(例如,PCIe)總線與RAID組進行通信。因此,主機存儲器存儲被稱為“NVMe命令隊列(主機到RAID控制器)”的(例如虛擬)隊列,該隊列存儲與從主機到RAID控制器的寫入請求1和寫入請求2相關聯的指令。具體地,“NVMe命令隊列(主機到RAID控制器)”存儲寫入請求1(“寫入OP1”)的參數(偏移:0,長度:8K)以及還有與寫入請求1相關聯的8KB數據的每個4KB塊的地址(數據地址#1和數據地址#2)。與寫入請求1相關聯的地址(數據地址#1和數據地址#2)中的每一個指向主機存儲器的數據緩衝器中的相應位置(數據緩衝器1或數據緩衝器2),與寫入請求1相關聯的相應4KB被存儲在該位置處。此外,“NVMe命令隊列(主機到RAID控制器)”存儲寫入請求2(“寫入OP2”)的參數(偏移:8K,長度:4K)、以及還有與寫入請求2相關聯的4KB塊的地址(數據地址#3)。與寫入請求2相關聯的數據地址(數據地址#3)指向主機存儲器的數據緩衝器中的位置(數據緩衝器3),與寫入請求2相關聯的相應4KB被存儲在該位置處。
圖6C示出了RAID控制器如何執行被存儲在“NVMe命令隊列(主機到RAID控制器)”中的命令的示例。具體地,RAID控制器通過總線在存儲在主機存儲器中的“NVMe命令隊列(主機到RAID控制器)”上執行DMA讀取操作,以從主機獲得請求。基於存儲在“NVMe命令隊列(主機到RAID控制器)”中的與寫入請求1(“寫入OP1”)相關聯的信息,RAID控制器將通過總線來執行DMA讀取,以從數據地址#1和數據地址#2獲得數據緩衝器1和數據緩衝器2的位置。RAID控制器通過確定與寫入請求1相關聯的8KB應當跨SSD 0和SSD 1被劃分為兩個4KB塊來在寫入請求1上實現RAID 0。RAID控制器然後通過總線向SSD 0和SSD 1發送對應的寫入命令,包括通過使用通過總線的DMA寫入來更新位於主機存儲器中的被稱為“NVMe命令隊列(RAID控制器到SSD 0)”和“NVMe命令隊列(RAID控制器到SSD 1)”的(例如,物理)隊列,以包括分別與SSD 0和SSD 1相關的與寫入請求1相關聯的指令。具體地,RAID控制器在“NVMe命令隊列(RAID控制器到SSD 0)”中存儲與寫入請求1(“寫入OP1-1”)的參數相關聯的參數(偏移:0,長度:4K)以及還有與SSD 0相關的地址(數據地址#1)。RAID控制器還在“NVMe命令隊列(RAID控制器到SSD 1)”中存儲與寫入請求1(“寫入OP1-2”)的參數相關聯的參數(偏移:0,長度:4K)以及還有與SSD 1相關的地址(數據地址#2)。
基於存儲在“NVMe命令隊列(主機到RAID控制器)”中的與寫入請求2(“寫入OP2”)相關聯的信息,RAID控制器將通過總線來執行DMA讀取,以從數據地址#3獲得數據緩衝器3的位置。RAID控制器通過確定與寫入請求2相關聯的4KB不需要被劃分並且可以替代地僅被存儲在SSD 0處來在寫入請求2上實現RAID 0。然後,RAID控制器通過總線向SSD 0發送對應的寫入命令,包括通過更新位於主機存儲器中的被稱為“NVMe命令隊列(RAID控制器到SSD 0)”的(例如,物理)隊列,以包括與SSD 0相關的寫入請求2所關聯的指令。具體地,RAID控制器在“NVMe命令隊列(RAID控制器到SSD 0)”中存儲與寫入請求2(“寫入OP2”)的參數相關聯的參數(偏移:4K,長度:4K)以及還有地址(數據地址#3)。
圖6D示出了SSD 0和SSD 1如何執行分別存儲在“NVMe命令隊列(RAID控制器到SSD 0)”和“NVMe命令隊列(RAID控制器到SSD 1)”中的命令的示例。
SSD 0和SSD 1中的每一個將把存儲在它們相應的RAID控制器中的命令從主機存儲器拉到SSD NVMe命令隊列,並且然後執行所述命令。例如,SSD 0將通過總線來執行DMA讀取,以從“NVMe命令隊列(RAID控制器到SSD 0)”讀取與“寫入OP1-1”相關聯的寫入命令,並且獲得數據地址#1。SSD 0然後將通過總線對與數據地址#1相關聯的數據緩衝器1執行DMA讀取,以獲得與寫入請求1相關聯的第一4KB數據塊,並且然後將它寫入到其自己的偏移0。類似地,SSD 0將通過總線來執行DMA讀取,以從“NVMe命令隊列(RAID控制器至SSD 0)”讀取與“寫入OP2”相關的寫入命令,並且獲得數據地址#3。SSD 0然後將通過總線對與數據地址#3相關聯的數據緩衝器3執行DMA讀取,以獲得與寫入請求2相關聯的4KB數據塊,並且然後將它寫入到其自己的偏移4KB。
而且,例如,SSD 1將通過總線來執行DMA讀取,以從“NVMe命令隊列(RAID控制器到SSD 1)”讀取與“寫入OP1-2”相關聯的寫入命令,並且獲得數據地址#2。SSD 0然後將通過總線對與數據地址#2相關聯的數據緩衝器2執行DMA讀取,以得到與寫入請求1相關聯的第二4KB數據塊,然後將它寫入到其自己的偏移0。
如跨圖6A至6D所描述的使用不涉及奇偶校驗信息的RAID模式來完成兩個寫入請求的示例中所示,DMA讀取和寫入操作可以在完成寫入請求中由RAID組的存儲設備以如下方式來利用:將RAID控制器從獲得待寫入數據並且將此類數據寫入到存儲設備的數據路徑中移除。
雖然跨圖6B至6D的示例示出了一個“NVMe命令隊列(主機到RAID控制器)”隊列,但是在其他示例中,可以針對每個SSD/存儲設備來維持多個此類隊列。例如,“NVMe命令隊列(主機到RAID控制器)”的每個實例可以與不同的用戶或不同的應用相關聯,其中每個用戶或應用被綁定到不同的核。雖然跨圖6A至6D的示例示出了用於SSD 0的一個“NVMe命令隊列(RAID控制器到SSD 0)”隊列和用於SSD 1的一個“NVMe命令隊列(RAID控制器到SSD 1)”隊列,但是在其他示例中,可以針對每個SSD/存儲設備維持多個此類隊列。通過每單個SSD利用多個“NVMe命令隊列(RAID控制器到SSD)”隊列,在RAID控制器中運行的IO作業可以被並行化,以同時使用多個隊列。
圖7是示出了用於處理對多個存儲設備的讀取請求的過程的實施例的流程圖。在一些實施例中,過程700由圖1的RAID控制器108來實現。
在702處,從主機接收從多個存儲設備讀取數據塊集合的請求。在各種實施例中,由該請求請求讀取的數據塊集合跨與RAID組相關聯的存儲設備被存儲。當數據被存儲在存儲設備處時,數據以與如下RAID模式相關聯的方式跨存儲設備而分佈和/或被鏡像:RAID控制器被配置成在該RAID模式的情況下實現。
在704處,確定該多個存儲設備中的至少一個是否已經發生故障。在該多個存儲設備中的至少一個已發生故障的情況下,控制被轉移到708。否則,在該多個存儲設備中沒有一個已發生故障的情況下,控制被轉移到706。在第一示例中,RAID控制器已經向其發送了讀取命令的存儲設備在該存儲設備在預定時間段之內沒有對RAID控制器進行響應的情況下被確定成已發生故障。在第二示例中,RAID控制器已經向其發送讀取命令的存儲設備當RAID控制器從該存儲設備接收具有完成隊列中的狀態代碼的報告時被確定成已發生故障。在第三示例中,RAID控制器已向其發送讀取命令的存儲設備當硬件移除事件被操作系統捕獲並重定向到RAID控制器時被確定成已發生故障。在第四示例中,RAID控制器已經向其發送讀取命令的存儲設備當DMA錯誤在主機輪詢該存儲設備的完成隊列的時候被捕獲時被確定成已發生故障。NVMe協議針對每個NVMe存儲設備提供包括完成隊列和提交隊列的對(pair)。如果該存儲設備是健康的並且完成了該請求,則它將把完成隊列條目放到其完成隊列,其中狀態代碼被設置到成功(SUCCESS)。該存儲設備的提交隊列由(執行命令的)存儲設備來輪詢,並且完成隊列由(發出命令的)主機來輪詢。
在706處,將讀取命令的第一集合發送到該多個存儲設備,以使得該多個存儲設備直接訪問主機存儲器,以將該數據塊集合寫入到主機存儲器。RAID控制器被配置成使用讀取請求和它被配置成實現的RAID模式(例如,0、1、2、3、4、5、6、01或10)來標識應當存儲該數據塊集合的存儲設備。RAID控制器然後被配置成向已經被確定成每個存儲該數據塊集合的至少一部分的所標識的存儲設備發送讀取命令。響應於接收到讀取命令,存儲設備被配置成獲得所請求的數據塊,然後使用DMA寫入來直接訪問主機存儲器,以將所請求的數據塊寫入到主機存儲器。
在708處,確定重建是否可用于重建存儲在(多個)故障存儲設備上的數據塊。在重建可用于重建(多個)故障存儲設備上的數據塊的情況下,控制被轉移到712。否則,在重建不可用於重建(多個)故障存儲設備上的數據塊的情況下,控制被轉移到710。在使用奇偶校驗信息的RAID模式(例如RAID 3、4、5或6)被用來存儲該數據並且奇偶校驗信息被存儲在可用(沒有故障的)存儲設備上的情況下,重建可用於被使用以重建所請求的數據塊(“不可用的”數據塊)。在使用奇偶校驗信息的RAID模式(例如,RAID 3、4、5或6)被用於存儲該數據但是奇偶校驗信息被存儲在故障存儲設備上的情況下,重建是不可用的。在使用不使用奇偶校驗信息的RAID模式(例如,RAID 0、1或10)來存儲該數據的情況下,重建是不可用的。
在710處,確定存儲在故障存儲設備上的數據塊的冗餘是否可用。在存儲在故障存儲設備上的數據塊的冗餘可用的情況下,控制被轉移到720。否則,在存儲在故障存儲設備上的數據塊的冗餘不可用的情況下,控制被轉移到722。在奇偶校驗信息不可用於重建不可用數據塊的情況下,不可用數據塊仍然可以從可用(沒有故障的)存儲設備獲得,該可用(沒有故障的)存儲設備存儲已經從故障存儲設備請求的(多個)數據塊的冗餘/鏡像副本。如上面所提到的,某些RAID模式(例如,RAID 0、1和10)將相同的數據冗餘地存儲在兩個或更多存儲設備中。
在712處,將讀取命令發送到可用存儲設備,以使得可用存儲設備將奇偶校驗信息和可用數據塊寫入到主機存儲器。奇偶校驗信息是基於不可用數據塊來計算的,並且因此可以用來重建不可用數據塊。RAID控制器向可用(沒有故障的)存儲設備發送讀取命令,以使得那些存儲設備本地讀取可用數據塊(所請求的數據塊的子集)和相關聯的奇偶校驗信息,並且然後將可用數據塊和相關聯的奇偶校驗信息寫入到主機存儲器。
在713處,確定在步驟712處發送的所有讀取命令是否成功。在步驟712處發送的所有讀取命令成功的情況下,控制被轉移到714。否則,在步驟712處發送的讀取命令中的至少一個不成功的情況下,控制被轉移到715。例如,如果讀取命令可以由對應的存儲設備來完成,則該讀取命令被確定為成功。而且,例如,如果對應的存儲設備不能夠完成讀取命令和/或將故障消息發送回到RAID控制器,則該讀取命令被確定為故障。
在715處,將在步驟712處發送的讀取命令未成功所處的(多個)存儲設備標記為有故障的。在步驟715之後,控制被返回到步驟702以再次開始過程700。
在714處,從主機存儲器獲得奇偶校驗信息和可用數據塊。RAID控制器然後通過總線對主機存儲器執行DMA讀取,以獲得可用數據塊(所請求的數據塊的子集)和相關聯的奇偶校驗信息。
在716處,基於可用數據塊和奇偶校驗信息來生成重建數據。RAID控制器使用奇偶校驗信息和所請求的數據塊中的可用數據塊來重建/生成被存儲在故障存儲設備上的剩餘數據塊。
在718處,直接訪問主機存儲器以將重建數據寫入到主機存儲器。RAID控制器然後使用DMA寫入通過(例如,PCIe)總線將重建數據寫入到主機存儲器。可用數據塊也已經由可用存儲設備響應於RAID控制器在步驟712處已發送到它們的讀取命令使用DMA寫入通過總線而寫入到主機存儲器。
在720處,將讀取命令的第二集合發送到冗餘存儲設備集合,以使得該冗餘存儲設備集合直接訪問主機存儲器,以將鏡像數據塊的集合寫入到主機存儲器。在所配置的RAID模式使用數據冗餘來存儲不可用數據塊的情況下,已經被用來存儲不可用數據塊但是尚未被RAID控制器在步驟712處發送讀取命令的冗餘存儲設備被發送讀取命令。響應於讀取命令,冗餘存儲設備被配置成通過總線使用DMA寫入來將所請求的數據塊(其已經被存儲在初始被查詢的故障存儲設備上)寫入到主機存儲器。
在724處,確定在步驟706或步驟720處發送的所有讀取命令是否成功。在步驟706或步驟720處發送的所有讀取命令成功的情況下,控制被轉移到726。否則,在步驟706或步驟720處發送的讀取命令中的至少一個不成功的情況下,控制被轉移到728。例如,如果讀取命令可以由對應的存儲設備來完成,則該讀取命令被確定為成功。而且,例如,如果對應的存儲設備不能夠完成讀取命令和/或將故障消息發送回到RAID控制器,則讀取命令被確定為故障。
在726處,向讀取請求的請求者發送成功消息。步驟726是在如上面所描述的如下三個可能場景之一之後到達的:1)與讀取請求相關的存儲設備中沒有一個已發生故障,並且存儲設備已經成功地完成了發送到它們的讀取命令;2)與讀取請求相關的存儲設備中的至少一個已經發生故障,但是所請求的數據的重建在使用所存儲的奇偶校驗信息的情況下是成功的;以及3)與讀取請求相關的存儲設備中的至少一個已經發生故障,但是從冗餘存儲設備成功地獲得了缺失的數據塊(其存儲在(多個)故障存儲設備上)。
在728處,將在步驟720處發送的讀取命令未成功所處的(多個)存儲設備標記為有故障的。在步驟728之後,控制被返回到步驟702以再次開始過程700。
在722處,向讀取請求的請求者發送錯誤消息。如果重建和數據冗餘都不可用,則讀取請求已經失敗。例如,為了指示讀取請求已經失敗,在其狀態字段中指示錯誤代碼的條目被添加到與RAID控制器(其正在模擬NVMe設備)相關聯的完成隊列。
如在過程700的示例過程中所示,來自主機的讀取請求仍然可以以如下方式來完成:其中從數據路徑中移除RAID控制器,使得存儲設備可以直接將所請求的數據寫入到主機存儲器。在與讀取請求相關的存儲設備中沒有一個已發生故障的情況下、或者在至少一個相關存儲設備已發生故障但是存儲在(多個)故障存儲設備上的數據已經被冗餘地存儲在作為RAID組的一部分的其他存儲設備上的情況下,存儲設備可以將所請求的數據直接寫入到主機存儲器(與將所請求的數據存儲到RAID控制器上並且使RAID控制器用作然後將該數據返回到主機的中介物相反)。
圖8示出了跨存儲設備的RAID組完成從主機接收到的讀取請求的示例過程。圖8示出了完成對寫入到可用(沒有故障的)存儲設備的集合的數據的讀取請求的示例過程,這意味著既不需要奇偶校驗信息來執行重建,也不需要查詢鏡像/冗餘存儲設備。
在802處,主機的CPU向RAID控制器發送讀取請求,並且其中該讀取請求請求RAID控制器讀取數據塊D1、D2和D3(在它們的指定地址處)。響應於接收到該讀取請求,RAID控制器被配置成確定數據塊D1、D2和D3分別被存儲在存儲設備1、存儲設備2和存儲設備3處。在804處,RAID控制器然後被配置成向存儲設備1、存儲設備2和存儲設備3發送相應的讀取命令。由RAID控制器發送到存儲設備1、存儲設備2和存儲設備3的相應讀取命令包括與CPU相關聯的主機存儲器處的相應指定位置,存儲設備1、存儲設備2和存儲設備3將在該指定位置處寫入數據塊D1、D2和D3。在步驟806a、806b和806c處,存儲設備1、存儲設備2和存儲設備3然後被配置成本地讀取數據塊D1、D2和D3,然後通過(例如,PCIe)總線來執行DMA寫入操作,以分別將數據塊D1、D2和D3寫入到主機存儲器之內的指定位置。例如,可以在從CPU到RAID控制器的讀取請求之內規定所請求的數據塊要被寫入到與CPU相關聯的主機存儲器所處的指定位置。假定在圖8中描述的特定示例中,RAID控制器已經向其發送讀取命令的所有三個存儲設備(存儲設備1、存儲設備2和存儲設備3)是可用的(未發生故障),已經基於數據塊D1、D2和D3計算並且被存儲在存儲設備4上的奇偶校驗信息(例如,使用諸如利用上面描述的圖5A和5B所描述的示例過程之類的過程)不需要由RAID控制器獲得並被用來重建缺失/不可用的數據塊。由此,如圖8的示例中所示,其中完成來自CPU的讀取請求所涉及的存儲設備是健康的/可用的(沒有故障的),則還從將所請求的數據寫入到主機存儲器的存儲設備的數據路徑中移除RAID控制器(例如,如圖7的過程700中所描述),以實現更高效的讀取數據路徑。
圖9是示出了用於處理對多個存儲設備的讀取請求的過程的示例的流程圖,並且其中該讀取請求是從對於該多個存儲設備遠程的主機接收的。在一些實施例中,過程900由圖2的RNIC 222來實現。
在902處,從遠程主機接收從多個存儲設備讀取數據塊集合的請求。主機對於與RAID組相關聯的該多個存儲設備是“遠程的”。例如,主機可以通過由網絡與該多個存儲設備分開而對於該多個存儲設備是遠程的,諸如如圖2中所示的遠程主機218。來自遠程主機的讀取請求由對於存儲設備本地的RNIC通過網絡來接收。例如,RNIC對於存儲設備是本地的,這是因為RNIC不通過網絡與存儲設備分開,並且可以替代地通過(例如,PCIe)總線來直接訪問存儲設備。
在904處,將該請求發送到與該多個存儲設備相關聯的RAID控制器,其中響應於該請求,RAID控制器被配置成向該多個存儲設備的至少子集發送命令,以使得該多個存儲設備的至少子集將與該請求相關聯的數據拷貝到其本地CMB。RNIC然後將讀取請求轉發到RAID控制器。RAID控制器然後向所請求的數據被存儲在其上的存儲設備(其已經啟用了CMB特徵)發出命令,並且此類存儲設備被配置成將所請求的數據塊從其永久存儲介質拷貝到其本地CMB。在RAID控制器向存儲設備發送命令之後,RAID控制器用存儲設備的CMB位置來回復RNIC。
在906處,直接訪問該多個存儲設備以讀取該數據塊集合。因為NVMe協議的CMB特徵使得存儲設備的存儲器的一部分能夠暴露到RNIC,所以RNIC可以通過總線對(多個)存儲設備執行DMA讀取操作,以到達它們相應的CMB位置,從而獲得所請求的數據塊。
在908處,將該數據塊集合發送到遠程主機。已經由RNIC讀取的數據塊然後通過網絡被發送回到遠程主機。
圖10示出了跨存儲設備的RAID組完成從遠程主機接收的讀取請求的示例過程。圖10示出了完成對來自可用(沒有故障的)存儲設備的集合的數據的讀取請求的示例過程,這意味著既不需要奇偶校驗信息來執行重建,也不需要查詢鏡像/冗餘存儲設備。
圖2的RNIC對於存儲設備1、2、3和4是本地的,所述存儲設備1、2、3和4已經基於RAID控制器的指令存儲數據。存儲設備1、2、3和4中的每一個已被配置有NVMe協議的CMB特徵,這使得存儲設備1、2、3和4的存儲器的至少一部分能夠被RNIC暴露(例如,直接地可訪問)。與本地主機(其CPU可以與RAID控制器通信以執行讀取和寫入請求)形成對照,遠程主機必須通過網絡向RNIC發送讀取和寫入請求。在圖10的示例中,在1002處,遠程主機通過網絡向RNIC發送讀取請求。該讀取請求請求讀取指定地址處的數據塊D1、D2和D3。響應於接收該讀取請求,在1008處,RNIC被配置成向RAID控制器發送該讀取請求。在1010處,RAID控制器然後向存儲設備1、存儲設備2和存儲設備3發出讀取命令,以指示存儲設備1、存儲設備2和存儲設備3將待讀取數據拷貝到它們相應的CMB中的每個。在RAID控制器將讀取命令發送到存儲設備1、存儲設備2和存儲設備3之後,RAID控制器然後用存儲設備1、存儲設備2和存儲設備3中的每一個上的CMB位置來回復RNIC,所請求的數據塊D1、D2和D3被存儲在所述CMB位置處。然後,在1012a、1012b和1012c處,RNIC通過總線對存儲設備1、存儲設備2和存儲設備3的CMB位置執行DMA讀取,以獲得所請求的數據塊D1、D2和D3。在1014處,RNIC然後通過網絡將數據塊D1、D2和D3發送回到遠程主機。由此,如圖10的示例中所示,其中完成從遠程主機的讀取請求所涉及的存儲設備是健康的/可用的(沒有故障的),然後還從將所請求的數據寫入到主機存儲器的存儲設備的數據路徑中移除RAID控制器(例如,如圖9的過程900中所描述),以實現更高效的讀取數據路徑。
雖然已出於理解清楚的目的來相當詳細地描述了前述實施例,但是本發明不限於所提供的細節。存在實現本發明的許多替代方式。所公開的實施例是說明性的,並且不是限制性的。
102,202:CPU 104,204:主機存儲器 106,206:總線 108,208:RAID控制器 110,112,114,116,210,212,214,216:存儲設備 218:遠程主機 220:網絡 222:RNIC 300,400,700,900:過程 302:接收對寫入數據的請求,該數據要在多個存儲設備之間分佈 304:至少部分地基於與該請求相關聯的數據來計算奇偶校驗信息 306:使得奇偶校驗信息被存儲在該多個存儲設備的第一子集上 308:使得與該請求相關聯的數據被存儲在該多個存儲設備的第二子集上,其中該多個存儲設備被配置成直接從對於RAID控制器遠程的存儲器獲得與該請求相關聯的數據,並且其中與該請求相關聯的數據不通過RAID控制器 402:從主機接收將數據塊集合寫入到多個存儲設備的請求 404:從與主機相關聯的主機存儲器讀取該數據塊集合 406:至少部分地基於該數據塊集合和相關RAID模式來生成奇偶校驗塊 408:直接訪問主機存儲器以在主機存儲器處寫入奇偶校驗塊 410:將寫入命令發送到該多個存儲設備,其中寫入命令被配置成使得該多個存儲設備;直接訪問主機存儲器以讀取該數據塊集合和奇偶校驗塊;以及在該多個存儲設備處本地存儲該數據塊集合和奇偶校驗塊 502,504,506,508,510,512a,512b,512c,512d,802,804,806a,806b,806c,1002,1014,1008,1010,1012a,1012b,1012c:步驟 702:從主機接收從多個存儲設備讀取數據塊集合的請求 704:(多個)存儲設備發生故障 706:將讀取命令的第一集合發送到該多個存儲設備,以使得該多個存儲設備直接訪問主機存儲器,以將該數據塊集合寫入到主機存儲器 708:重建可用 710:冗餘可用 712:將讀取命令發送到可用存儲設備,以使得可用存儲設備將奇偶校驗信息和可用數據塊寫入到主機存儲器 713:所有命令成功 714:從主機存儲器獲得奇偶校驗信息和該數據塊集合 715:將(多個)存儲設備標記為有故障的 716:基於可用數據塊和奇偶校驗信息來生成重建數據 718:直接訪問主機存儲器以將重建數據寫入到主機存儲器 720:將讀取命令的第二集合發送到冗餘存儲設備集合,以使得該冗餘存儲設備集合直接訪問主機存儲器,以將鏡像數據塊的集合寫入到主機存儲器 722:向請求者發送錯誤消息 724:所有命令成功 726:向請求者發送成功消息 728:將(多個)存儲設備標記為有故障的 902:從遠程主機接收從多個存儲設備讀取數據塊集合的請求 904:將該請求發送到與該多個存儲設備相關聯的RAID控制器,其中響應於該請求,RAID控制器被配置成向該多個存儲設備的至少子集發送命令,以使得該多個存儲設備的至少子集將與該請求相關聯的數據拷貝到本地CMB 906:直接訪問該多個存儲設備以讀取該數據塊集合 908:將該數據塊集合發送到遠程主機
在以下詳細描述和附圖中公開了本發明的各種實施例。
[圖1]是示出了用於實現用於RAID存儲裝置的直接存儲器訪問(DMA)數據路徑的系統的實施例的圖。
[圖2]是示出了針對對於RAID存儲設備集合遠程的主機來實現用於RAID存儲裝置的直接存儲器訪問(DMA)數據路徑的系統的實施例的圖。
[圖3]是示出了用於處理對多個存儲設備的寫入請求的過程的實施例的流程圖。
[圖4]是示出了用於處理對多個存儲設備的寫入請求的過程的示例的流程圖。
[圖5A和5B]示出了跨存儲設備的RAID組完成從主機接收的寫入請求的示例過程。
[圖6A到6D]示出了針對不使用奇偶校驗信息的RAID模式的便於寫入請求而不會變得內嵌(inline)到寫入數據路徑的RAID控制器中涉及的命令隊列的示例。
[圖7]是示出了用於處理對多個存儲設備的讀取請求的過程的實施例的流程圖。
[圖8]示出了跨存儲設備的RAID組完成從主機接收的讀取請求的示例過程。
[圖9]是示出了用於處理對多個存儲設備的讀取請求的過程的示例的流程圖,並且其中從對於該多個存儲設備遠程的主機接收該讀取請求。
[圖10]示出了跨存儲設備的RAID組完成從遠程主機接收的讀取請求的示例過程。
102:CPU
104:主機存儲器
106:總線
108:RAID控制器
110,112,114,116:存儲設備

Claims (20)

  1. 一種用於獨立磁盤冗餘陣列存儲裝置的系統,包括;多個存儲設備;以及獨立磁盤冗餘陣列(RAID)控制器,其被配置成:從主機接收對寫入數據的請求,所述數據要在所述多個存儲設備之間分佈;至少部分地基於與所述請求相關聯的數據來計算奇偶校驗信息;使得所述奇偶校驗信息存儲在所述多個存儲設備的第一子集上;以及使得與所述請求相關聯的數據存儲在所述多個存儲設備的第二子集上,其中所述多個存儲設備被配置成直接從對於所述RAID控制器遠程的存儲器獲得與所述請求相關聯的數據,並且其中與所述請求相關聯的數據不通過所述RAID控制器,包括用以:使用直接存儲器訪問(DMA)寫入操作以將與使得與所述請求相關聯的數據存儲在所述多個存儲設備的所述第二子集上相關聯的寫入命令存儲在與所述多個存儲設備的所述第二子集相關聯的相應命令隊列中;其中所述相應命令隊列是位於對於所述RAID控制器遠程的存儲器中;其中所述多個存儲設備的所述第二子集被配置成執行對於所述RAID控制器遠程的存儲器中的所述相應命令隊 列的DMA讀取操作,以讀取與所述請求相關聯的數據;以及其中所述多個存儲設備的所述第二子集被配置成將與所述請求相關聯的數據本地寫入到所述多個存儲設備的所述第二子集。
  2. 根據請求項1所述的系統,其中所述RAID控制器是使用圖形處理單元(GPU)來實現的。
  3. 根據請求項1所述的系統,其中使得所述奇偶校驗信息存儲在所述多個存儲設備的第一子集上包括:所述RAID控制器進一步被配置成:執行直接存儲器訪問(DMA)寫入操作到對於所述RAID控制器遠程的存儲器,以將所述奇偶校驗信息寫入到對於所述RAID控制器遠程的存儲器;以及向所述多個存儲設備的第一子集發送寫入命令,以使得所述多個存儲設備的第一子集:執行對於所述RAID控制器遠程的存儲器之DMA讀取操作,以讀取所述奇偶校驗信息;以及將所述奇偶校驗信息本地寫入到所述多個存儲設備的第一子集。
  4. 根據請求項1所述的系統,其中從與所述主機相關聯的中央處理單元(CPU)接收所述請求,並且其中對於所述RAID控制器遠程的存儲器是與CPU相關聯的主機存儲器。
  5. 根據請求項1所述的系統,其中所述多個 存儲設備和所述RAID控制器包括總線的端點。
  6. 根據請求項1所述的系統,其中所述RAID控制器被配置成進一步基於所配置的RAID模式來計算所述奇偶校驗信息。
  7. 根據請求項1所述的系統,其中所述RAID控制器被配置成將與使得所述奇偶校驗信息存儲在所述多個存儲設備的第一子集上相關聯的寫入命令存儲在與所述多個存儲設備的第一子集相關聯的相應命令隊列中。
  8. 根據請求項1所述的系統,其中所述請求包括第一請求,並且其中所述RAID控制器進一步被配置成:從所述多個存儲設備接收讀取與第一請求相關聯的數據的第二請求;以及使得所述多個存儲設備的第二子集:從所述多個存儲設備的第二子集本地讀取與第一請求相關聯的數據;以及將與第一請求相關的數據直接寫入到對於所述RAID控制器遠程的存儲器。
  9. 根據請求項8所述的系統,其中使得所述多個存儲設備的第二子集將所述數據直接寫入到對於所述RAID控制器遠程的存儲器包括:向所述多個存儲設備的第二子集發送讀取命令。
  10. 根據請求項8所述的系統,其中使得所 述多個存儲設備的第二子集將與第一請求相關聯的數據直接寫入到對於所述RAID控制器遠程的存儲器包括:使得所述多個存儲設備的第二子集執行對於所述RAID控制器遠程的存儲器之DMA寫入操作,以直接寫入與第一請求相關聯的數據。
  11. 根據請求項1所述的系統,其中所述請求包括第一請求,並且進一步包括:RDMA網絡接口卡(RNIC),其配置成:從遠程主機接收從所述多個存儲設備讀取與第一請求相關聯的數據的第二請求;向所述RAID控制器發送第二請求,其中響應於第二請求,所述RAID控制器進一步被配置成向所述多個存儲設備的第二子集發送命令,以使得所述多個存儲設備的第二子集將與第二請求相關聯的數據拷貝到其本地控制器存儲器緩衝器(CMB);直接訪問所述多個存儲設備的第二子集以讀取與第一請求相關聯的數據;以及將與第一請求相關的數據發送到遠程主機。
  12. 一種用於獨立磁盤冗餘陣列存儲裝置之方法,包括:在獨立磁盤冗餘陣列(RAID)控制器處從主機接收對寫入數據的請求,所述數據要在多個存儲設備之間分佈;至少部分地基於與所述請求相關聯的數據來計算奇偶校驗信息; 使得所述奇偶校驗信息存儲在所述多個存儲設備的第一子集上;以及使得與所述請求相關聯的數據存儲在所述多個存儲設備的第二子集上,其中所述多個存儲設備被配置成直接從對於所述RAID控制器遠程的存儲器獲得與所述請求相關聯的數據,並且其中與所述請求相關聯的數據不通過所述RAID控制器,包括:使用直接存儲器訪問(DMA)寫入操作以將與使得與所述請求相關聯的數據存儲在所述多個存儲設備的所述第二子集上相關聯的寫入命令存儲在與所述多個存儲設備的所述第二子集相關聯的相應命令隊列中;其中所述相應命令隊列是位於對於所述RAID控制器遠程的存儲器中;其中所述多個存儲設備的所述第二子集被配置成執行對於所述RAID控制器遠程的存儲器中的所述相應命令隊列的DMA讀取操作,以讀取與所述請求相關聯的數據;以及其中所述多個存儲設備的所述第二子集被配置成將與所述請求相關聯的數據本地寫入到所述多個存儲設備的所述第二子集。
  13. 根據請求項12所述的方法,其中使得所述奇偶校驗信息存儲在所述多個存儲設備的第一子集上進一步包括:執行直接存儲器訪問(DMA)寫入操作到對於所述 RAID控制器遠程的存儲器,以將所述奇偶校驗信息寫入到對於所述RAID控制器遠程的存儲器;以及向所述多個存儲設備的第一子集發送寫入命令,以使得所述多個存儲設備的第一子集:執行對於所述RAID控制器遠程的存儲器之DMA讀取操作,以讀取所述奇偶校驗信息;以及將所述奇偶校驗信息本地寫入到所述多個存儲設備的第一子集。
  14. 根據請求項12所述的方法,其中從與所述主機相關聯的中央處理單元(CPU)接收所述請求,並且其中對於所述RAID控制器遠程的存儲器是與CPU相關聯的主機存儲器。
  15. 根據請求項12所述的方法,其中所述請求包括第一請求,並且進一步包括:從所述多個存儲設備接收讀取與第一請求相關聯的數據的第二請求;以及使得所述多個存儲設備的第二子集:從所述多個存儲設備的第二子集本地讀取與第一請求相關聯的數據;以及將與第一請求相關的數據直接寫入到對於所述RAID控制器遠程的存儲器。
  16. 根據請求項15所述的方法,其中使得所述多個存儲設備的第二子集將所述數據直接寫入到對於所述RAID控制器遠程的存儲器包括:向所述多個存儲設備 的第二子集發送讀取命令。
  17. 根據請求項15所述的方法,其中使得所述多個存儲設備的第二子集將與第一請求相關聯的數據直接寫入到對於所述RAID控制器遠程的存儲器包括:使得所述多個存儲設備的第二子集執行對於所述RAID控制器遠程的存儲器之DMA寫入操作,以直接寫入與第一請求相關聯的數據。
  18. 根據請求項12所述的方法,其中所述RAID控制器是使用圖形處理單元(GPU)來實現的。
  19. 根據請求項12所述的方法,其中所述多個存儲設備和所述RAID控制器包括總線的端點。
  20. 根據請求項12所述的方法,其中所述RAID控制器被配置成進一步基於所配置的RAID模式來計算所述奇偶校驗信息。
TW111127775A 2021-09-27 2022-07-25 用於raid存儲裝置的直接存儲器訪問數據路徑 TWI840896B (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US17/486,643 2021-09-27
US17/486,643 US11662955B2 (en) 2021-09-27 2021-09-27 Direct memory access data path for RAID storage

Publications (2)

Publication Number Publication Date
TW202314518A TW202314518A (zh) 2023-04-01
TWI840896B true TWI840896B (zh) 2024-05-01

Family

ID=

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20200218617A1 (en) 2019-01-04 2020-07-09 Western Digital Technologies, Inc. Data Rebuild Using Dynamic Peer Work Allocation

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20200218617A1 (en) 2019-01-04 2020-07-09 Western Digital Technologies, Inc. Data Rebuild Using Dynamic Peer Work Allocation

Similar Documents

Publication Publication Date Title
JP6067230B2 (ja) 観測可能クライアント側メモリアクセスを用いる高性能データストレージ
US8074017B2 (en) On-disk caching for raid systems
US9986028B2 (en) Techniques to replicate data between storage servers
US10838885B2 (en) Method for supporting erasure code data protection with embedded PCIE switch inside FPGA+SSD
US9870157B2 (en) Command balancing and interleaving for write and reads between front end and back end of solid state drive
CN107430494B (zh) 用于远程直接存储器访问的系统、方法和介质
US6993676B2 (en) Method and apparatus for fast initialization of redundant arrays of storage devices
CN107430585B (zh) 用于远程直接存储器访问的系统和方法
CN112912851B (zh) 用于寻址的系统和方法、以及媒体控制器
TWI636366B (zh) 資料冗餘的處理方法及其相關電腦系統
CN107533537B (zh) 存储系统、用于存储的方法和非暂时性计算机可读介质
JP2020038650A (ja) ベクトルプロセッサ格納
CN111587420A (zh) 分布式存储系统快速故障恢复的方法和系统
CN115495389A (zh) 存储控制器、计算存储装置以及计算存储装置的操作方法
US20230221899A1 (en) Direct memory access data path for raid storage
US11074010B2 (en) Storage system and control method thereof
US7725654B2 (en) Affecting a caching algorithm used by a cache of storage system
TWI840896B (zh) 用於raid存儲裝置的直接存儲器訪問數據路徑
TWI797022B (zh) 儲存控制器、計算儲存裝置以及計算儲存裝置的操作方法
WO2018055686A1 (ja) 情報処理システム
CN109445686A (zh) 一种存储磁盘以及存取数据的方法
EP4246330A1 (en) Storage device and operating method thereof
US20240095196A1 (en) Method for supporting erasure code data protection with embedded pcie switch inside fpga+ssd
TW202416147A (zh) 具有啟動器模式的固態硬碟