本公開的實施例涉及數(shù)據(jù)存儲系統(tǒng),并且更具體地涉及用于控制從存儲系統(tǒng)讀取數(shù)據(jù)的方法和裝置。
背景技術(shù):
在數(shù)據(jù)存儲系統(tǒng)中,為了提高數(shù)據(jù)的安全性和可用性,可以同時存儲數(shù)據(jù)的多個備份。獨立磁盤冗余陣列(RAID)1是這種解決方案的一個示例。RAID 1通過磁盤數(shù)據(jù)鏡像實現(xiàn)數(shù)據(jù)冗余,其在RAID組內(nèi)的多個獨立磁盤上產(chǎn)生互為備份的數(shù)據(jù)。在RAID 1處于最優(yōu)狀態(tài)時,即RAID組內(nèi)的每個磁盤都可用時,RAID可以訪問其中的任何一個磁盤以讀取數(shù)據(jù)。根據(jù)RAID 1的特性,來自RAID組中任一磁盤的數(shù)據(jù)是相同的。當一個磁盤繁忙、從而不能夠及時處理原始數(shù)據(jù)時,可直接從另一磁盤上的鏡像拷貝中讀取數(shù)據(jù),因此RAID 1可以提高讀取性能。
技術(shù)實現(xiàn)要素:
為了獲得最優(yōu)的輸入/輸出(I/O)性能,如前所述的RAID可以將讀I/O請求發(fā)送到處理較快的磁盤,這能夠顯著縮短I/O的響應時間,提高RAID的整體每秒輸入輸出(IOPs)性能。
通常,磁盤的響應時間取決于,例如,磁盤介質(zhì)響應時間、磁盤隊列深度、I/O大小、邏輯區(qū)塊尋址(LBA)分布以及小型計算機系統(tǒng)接口(SCSI)端口的背景業(yè)務量負載。以具有兩個處理器節(jié)點和共享的后端磁盤的存儲架構(gòu)為例(例如EMC公司的VNX2序列采用了這種架構(gòu)),在該架構(gòu)中,讀業(yè)務量獨立地并行地來自每個處理器節(jié)點。如果到處理器節(jié)點的鏈路僅在一側(cè)發(fā)生故障(即單回路故 障的情況),則讀業(yè)務將被重定向到另一側(cè)的對等體,然后對等處理器節(jié)點將把該I/O請求發(fā)送到后端磁盤。這種重定向?qū)τ诠烙嫶疟P響應時間造成很多困難,例如,這使得針對每個I/O進行的響應時延的統(tǒng)計結(jié)果變化很快,同時變化很大。因此這種估計結(jié)果難以提供可靠的信息用于確定合適的磁盤來服務新的I/O請求,這也使得RAID組難以在組內(nèi)的磁盤間進行有效的負載平衡。
為了解決以上問題中的至少一些問題,本公開的實施例提出了用于控制從存儲系統(tǒng)讀取數(shù)據(jù)的方法和裝置。該方法和裝置不限于應用于以上作為示例提到的RAID 1存儲系統(tǒng),而是可以被更廣泛地應用于存在類似問題的其他存儲系統(tǒng)。
下面給出了對各實施例的簡要概述,以提供對各種實施例的一些方面的基本理解。該概述不旨在標識關(guān)鍵元素的要點或描述各種實施例的范圍。其唯一目的在于以簡化形式呈現(xiàn)一些概念,作為對后述更具體描述的前序。
本公開的第一方面提供了一種用于控制從存儲系統(tǒng)讀取數(shù)據(jù)的方法。該存儲系統(tǒng)包括多個存儲設(shè)備,并且所述數(shù)據(jù)的備份被存儲在所述多個存儲設(shè)備中的每個存儲設(shè)備中。該方法包括:接收用于從所述存儲系統(tǒng)讀取數(shù)據(jù)的讀請求;根據(jù)針對每個存儲設(shè)備所記錄的未完成的讀請求數(shù)目和已完成的讀請求數(shù)目,從所述多個存儲設(shè)備中確定用于處理所述讀請求的目標存儲設(shè)備;以及將所述讀請求發(fā)送到所述目標存儲設(shè)備。
在一個實施例中,針對每個存儲設(shè)備所記錄的未完成的讀請求數(shù)目和已完成的讀請求數(shù)目可以通過以下方式進行更新:在所述多個存儲設(shè)備中的第一存儲設(shè)備接收到新的讀請求時,將針對所述第一存儲設(shè)備的尚未完成的讀請求數(shù)目加一;以及在所述多個存儲設(shè)備中的第二存儲設(shè)備處理完一個讀請求時,將針對所述第二存儲設(shè)備的尚未完成的讀請求數(shù)目減一,并且將針對所述第二存儲設(shè)備的已完成的讀請求數(shù)目加一。
在另一實施例中,該方法可以進一步包括:在將所述讀請求發(fā) 送到所述目標存儲設(shè)備后,將針對所述多個存儲設(shè)備中的每個存儲設(shè)備的已完成的讀請求數(shù)目清零。
在又一實施例中,根據(jù)針對每個存儲設(shè)備所記錄的未完成的讀請求數(shù)目和已完成的讀請求數(shù)目,從所述多個存儲設(shè)備中確定用于處理所述讀請求的目標存儲設(shè)備可以包括:將所述多個存儲設(shè)備中的、未完成的讀請求數(shù)目最少的一個存儲設(shè)備確定為所述目標存儲設(shè)備。在一個實施例中,將所述多個存儲設(shè)備中的、未完成的讀請求數(shù)目最少的存儲設(shè)備確定為所述目標存儲設(shè)備可以進一步包括:將所述多個存儲設(shè)備中的、未完成的讀請求數(shù)目最少的一組存儲設(shè)備中、已完成的讀請求數(shù)目超過預定閾值的一個存儲設(shè)備確定為所述目標存儲設(shè)備,并且在所述一組存儲設(shè)備中每個存儲設(shè)備的已完成的讀請求數(shù)目均未超過預定閾值時,從所述一組存儲設(shè)備中隨機選取一個存儲設(shè)備作為所述目標存儲設(shè)備。在一個替代實施例中,將所述多個存儲設(shè)備中的、未完成的讀請求數(shù)目最少的存儲設(shè)備確定為所述目標存儲設(shè)備可以進一步包括:將所述多個存儲設(shè)備中的、未完成的讀請求數(shù)目最少的一組存儲設(shè)備中、已完成的讀請求數(shù)目最多的一個存儲設(shè)備確定為所述目標存儲設(shè)備。
在一個實施例中,替代地或者附加地,針對每個存儲設(shè)備所記錄的未完成的讀請求數(shù)目和已完成的讀請求數(shù)目可以通過以下方式進行更新:在針對所述多個存儲設(shè)備中的第三存儲設(shè)備的未完成的讀請求數(shù)目為零、但沒有新的讀請求到達所述第三存儲設(shè)備時,將針對所述第三存儲設(shè)備的已完成的讀請求數(shù)目清零,并且將用于處理所述讀請求的目標存儲設(shè)備的索引設(shè)置為無效;并且根據(jù)針對每個存儲設(shè)備所記錄的未完成的讀請求數(shù)目和已完成的讀請求數(shù)目,從所述多個存儲設(shè)備中確定用于處理所述讀請求的目標存儲設(shè)備可以包括:在所述目標存儲設(shè)備的索引被設(shè)置為無效時,從所述多個存儲設(shè)備中隨機選取一個存儲設(shè)備作為所述目標存儲設(shè)備。
本公開的第二方面提供了另一種用于控制從存儲系統(tǒng)讀取數(shù)據(jù)的方法。該存儲系統(tǒng)包括多個存儲設(shè)備,并且所述數(shù)據(jù)的備份被存 儲在所述多個存儲設(shè)備中的每個存儲設(shè)備中。該方法包括:通過將最優(yōu)存儲設(shè)備的索引設(shè)定為無效、并且將針對所述多個存儲設(shè)備中的每個存儲設(shè)備的未完成的讀請求數(shù)目和已完成的讀請求數(shù)目設(shè)置為0來進行初始化,并且執(zhí)行以下步驟:
步驟1:在所述多個存儲設(shè)備中的一個存儲設(shè)備的讀請求處理完成時,將針對所述一個存儲設(shè)備的未完成的讀請求數(shù)目減1;并進入步驟2;
步驟2:確定針對所述一個存儲設(shè)備的未完成的讀請求數(shù)目是否為0,在所述未完成的讀請求數(shù)目為0時,進入步驟3;否則進入步驟5;
步驟3:確定所述最優(yōu)存儲設(shè)備的索引是否為無效或者等于所述一個存儲設(shè)備的索引;并且如果所述最優(yōu)存儲設(shè)備的索引為無效或者等于所述一個存儲設(shè)備的索引,則進入步驟5,否則進入步驟4;
步驟4:將所述最優(yōu)存儲設(shè)備的所述索引設(shè)置為無效,并且將針對所述一個存儲設(shè)備的已完成的讀請求數(shù)目設(shè)置為0;并進入步驟8;
步驟5:將針對所述一個存儲設(shè)備的已完成的讀請求數(shù)目加1;并進入步驟6;
步驟6:確定針對所述一個存儲設(shè)備的已完成的讀請求數(shù)目是否超過預定閾值;并且如果針對所述一個存儲設(shè)備的已完成的讀請求數(shù)目超過所述預定閾值,則進入步驟7,否則,進入步驟8;
步驟7:將所述最優(yōu)存儲設(shè)備的索引設(shè)置為所述一個存儲設(shè)備的索引,并且將針對所述多個存儲設(shè)備中的每個存儲設(shè)備的已完成的讀請求數(shù)目清零;進入步驟8;
步驟8:如果所述最優(yōu)存儲設(shè)備的索引為無效,則從所述多個存儲設(shè)備中隨機選取目標存儲設(shè)備,用于服務下一讀請求;否則,從所述多個存儲設(shè)備中選取與所述最優(yōu)存儲設(shè)備的索引對應的存儲設(shè)備作為目標存儲設(shè)備,用于服務下一讀請求。
本公開的第三方面提供了一種用于控制從存儲系統(tǒng)讀取數(shù)據(jù)的裝置,所述存儲系統(tǒng)包括多個存儲設(shè)備,并且所述數(shù)據(jù)的備份被存 儲在所述多個存儲設(shè)備中的每個存儲設(shè)備中,所述裝置包括:計數(shù)模塊,被配置為針對所述多個存儲設(shè)備中的每個存儲設(shè)備,記錄當前尚未完成的讀請求數(shù)目、以及在預定時間段內(nèi)已完成的讀請求數(shù)目;讀請求接收模塊,被配置為接收用于從所述存儲系統(tǒng)讀取數(shù)據(jù)的讀請求;確定模塊,被配置為根據(jù)針對每個存儲設(shè)備所記錄的未完成的讀請求數(shù)目和已完成的讀請求數(shù)目,從所述多個存儲設(shè)備中確定用于處理所述讀請求的目標存儲設(shè)備;以及讀請求分配模塊,被配置為將所述讀請求發(fā)送到所述目標存儲設(shè)備。
本公開的第四方面提供了用于控制從存儲系統(tǒng)讀取數(shù)據(jù)的另一裝置,該存儲系統(tǒng)包括多個存儲設(shè)備,并且所述數(shù)據(jù)的備份被存儲在所述多個存儲設(shè)備中的每個存儲設(shè)備中,該裝置包括:初始化模塊,被配置為通過將最優(yōu)存儲設(shè)備的索引設(shè)定為無效、并且將針對所述多個存儲設(shè)備中的每個存儲設(shè)備的未完成的讀請求數(shù)目和已完成的讀請求數(shù)目設(shè)置為0來進行初始化,以及第一計數(shù)模塊,被配置為在所述多個存儲設(shè)備中的一個存儲設(shè)備的讀請求處理完成時,將針對所述一個存儲設(shè)備的未完成的讀請求數(shù)目減1;并將更新后的所述未完成的讀請求數(shù)目發(fā)送給第一判斷模塊;第一判斷模塊,被配置為確定針對所述一個存儲設(shè)備的未完成的讀請求數(shù)目是否為0,在所述未完成的讀請求數(shù)目為0時,促使第二判斷模塊執(zhí)行動作,否則促使第二計數(shù)模塊執(zhí)行動作;第二判斷模塊,被配置為確定所述最優(yōu)存儲設(shè)備的索引是否為無效或者等于所述一個存儲設(shè)備的索引;并且如果所述最優(yōu)存儲設(shè)備的索引為無效或者等于所述一個存儲設(shè)備的索引,則促使第二計數(shù)模塊執(zhí)行動作,否則促使第一設(shè)置模塊執(zhí)行動作;第一設(shè)置模塊,被配置為將所述最優(yōu)存儲設(shè)備的所述索引設(shè)置為無效,并且將針對所述一個存儲設(shè)備的已完成的讀請求數(shù)目設(shè)置為0;并促使選擇模塊執(zhí)行動作;第二計數(shù)模塊,被配置為將針對所述一個存儲設(shè)備的已完成的讀請求數(shù)目加1;并促使第三判斷模塊執(zhí)行動作;第三判斷模塊,被配置為確定針對所述一個存儲設(shè)備的已完成的讀請求數(shù)目是否超過預定閾值;并且如果針對所 述一個存儲設(shè)備的已完成的讀請求數(shù)目超過所述預定閾值,則促使第二設(shè)置模塊執(zhí)行動作,否則,促使所述選擇模塊執(zhí)行動作;第二設(shè)置模塊,被配置為將所述最優(yōu)存儲設(shè)備的索引設(shè)置為所述一個存儲設(shè)備的索引,并且將針對所述多個存儲設(shè)備中的每個存儲設(shè)備的已完成的讀請求數(shù)目清零;并且促使所述選擇模塊執(zhí)行動作;以及選擇模塊,被配置為如果所述最優(yōu)存儲設(shè)備的索引為無效,則從所述多個存儲設(shè)備中隨機選取目標存儲設(shè)備,用于服務下一讀請求;否則,從所述多個存儲設(shè)備中選取與所述最優(yōu)存儲設(shè)備的索引對應的存儲設(shè)備作為目標存儲設(shè)備,用于服務下一讀請求。
本公開的第五方面提供了一種裝置,該裝置包括至少一個處理器;以及至少一個包括計算機程序代碼的存儲器,其中所述至少一個存儲器和所述計算機程序代碼被配置為:與所述至少一個處理器一起,促使所述裝置執(zhí)行根據(jù)本公開的第一方面或者第二方面所述的任一方法。
根據(jù)本公開的實施例的方法或裝置,能夠縮短I/O響應時間、提高I/O性能,并且/或者在不進行跨節(jié)點通信的情況下實現(xiàn)多個存儲設(shè)備(例如多個磁盤)見的讀I/O的負載平衡,同時不降低存儲系統(tǒng)的吞吐量。
盡管在附圖中通過示例的方式示出了特定的實施例,然而,應當理解,本文的具體實施例的描述不意在將實施例限制為所公開的具體形式。
附圖說明
從下文的公開內(nèi)容和權(quán)利要求中,本公開的目的、優(yōu)點和其他特征將變得更加明顯。這里僅出于示例的目的,參考附圖來給出優(yōu)選實施例的非限制性描述,在附圖中:
圖1示出了示例存儲系統(tǒng)的示意性結(jié)構(gòu)圖,在該存儲系統(tǒng)中可以實施本公開的實施例的方法或裝置;
圖2示出了根據(jù)本公開的實施例的用于控制從存儲系統(tǒng)讀取數(shù) 據(jù)的方法的流程圖;
圖3示出了存儲系統(tǒng)中的兩個磁盤的不同I/O處理狀態(tài)的示意圖;
圖4示出了根據(jù)本公開的實施例的用于控制從存儲系統(tǒng)讀取數(shù)據(jù)的另一方法的流程圖;
圖5示出了根據(jù)本公開的一個實施例的、確定目標存儲設(shè)備的示例;
圖6示出了根據(jù)本公開的實施例的裝置的示例性結(jié)構(gòu)圖;以及
圖7示出了根據(jù)本公開的實施例的另一裝置的示例性結(jié)構(gòu)圖。
具體實施方式
在以下描述中,出于說明的目的而闡述許多細節(jié)。然而,本領(lǐng)域普通技術(shù)人員將認識到可以在不使用這些具體細節(jié)的情況下實現(xiàn)本公開的實施例。因此,本公開不旨在于受限于所示實施例、而是將被賦予與本文描述的原理和特征一致的最寬的范圍。
應當理解,術(shù)語“第一”、“第二”等僅被用來將一個元素與另一個元素區(qū)分開來。而實際上第一元素也能夠被稱為第二元素,反之亦然。另外還應當理解“包括”,“包含”僅被用來說明所陳述的特征、元素、功能或者部件的存在,然而并不排除存在一個或者多個其他的特征、元素、功能或者部件。
為了便于解釋,本文的一些實施例將以RAID 1結(jié)構(gòu)為例來介紹相應的方法或裝置,然而,如本領(lǐng)域技術(shù)人員可以理解的,本公開的實施例絕不限于應用于RAID 1結(jié)構(gòu)的存儲系統(tǒng),而是可以被應用于任何存在類似問題的存儲系統(tǒng)中。
在圖1中示出了具有兩個處理器節(jié)點的存儲系統(tǒng)100的示意圖,在該存儲系統(tǒng)中可以實施本公開的實施例的方法和裝置。如圖1的示例存儲系統(tǒng)100中,具有兩個處理器節(jié)點,即圖左的處理器節(jié)點1(標示為PN 101)和圖右的處理器2(標示為PN 102)。但是如本領(lǐng)域技術(shù)人員能夠理解的,本公開的實施例的方法和裝置同樣能夠應 用于存在更多個鏡像的存儲系統(tǒng)中,例如,本公開的實施例能夠應用于具有任意數(shù)目磁盤的RAID 1存儲結(jié)構(gòu)。
如圖1所示,RAID組和磁盤對象被鏡像映射到存儲器的兩側(cè)。RAID組具有兩個邊緣附接到下游的磁盤對象(112、113)。不同處理器節(jié)點處的鏡像的磁盤對象通過雙SCSI磁盤端口(108、109;110、111)訪問同一磁盤。這對于RAID組和磁盤提供了穩(wěn)定的可用性。
在圖1的架構(gòu)中,可以將讀請求發(fā)送到任一磁盤(112、113)。鏡像RAID組的讀性能在理論上具有兩倍的磁盤性能。然而,磁盤的響應時間變化很快,例如以秒的量級變化。磁盤性能的變化受許多因素的影響。通常,如果磁盤具有較多未完成的I/O待處理(例如,如103-106所示),則其響應時間會較長。對于轉(zhuǎn)軸(spindle)磁盤,順序的I/O能夠獲得比隨機I/O更好的性能。另外,磁盤封裝SCSI端口帶寬是和連接到同一端口的其它磁盤共享的。在圖1的結(jié)構(gòu)中,如果磁盤鏈路在一側(cè)出現(xiàn)故障,例如圖中示出在左側(cè)出現(xiàn)故障,則到該故障磁盤的所有業(yè)務將被重定向到其對等體。這種情況下,由于I/O轉(zhuǎn)發(fā)開銷,響應時間將顯著增加,尤其是對于固態(tài)磁盤驅(qū)動器(SSD)。
為了更有效地估計磁盤響應時間以更準確的確定用于處理讀請求的磁盤,本公開的實施例提出針對每個磁盤統(tǒng)計未完成的讀I/O的數(shù)目,并據(jù)此來估計磁盤的響應時間。由于寫I/O需要被發(fā)送到RAID 1中的每個磁盤,可以認為寫請求的隊列深度對所有磁盤的影響是相同的。
以下參考圖2來描述根據(jù)本公開的實施例的、用于控制從存儲系統(tǒng)讀取數(shù)據(jù)的示例方法200。該方法可以在圖1的存儲系統(tǒng)中被實施,但是不限于在該示例結(jié)構(gòu)中被實施。該存儲系統(tǒng)包括多個存儲設(shè)備(例如多個獨立的磁盤),并且所述數(shù)據(jù)的備份被存儲在所述多個存儲設(shè)備中的每個存儲設(shè)備中。
如圖2所示,該方法包括,在塊S201,接收用于從所述存儲系統(tǒng)讀取數(shù)據(jù)的讀請求;在塊S202,根據(jù)針對每個存儲設(shè)備所記錄的 未完成的讀請求數(shù)目和已完成的讀請求數(shù)目,從所述多個存儲設(shè)備中確定用于處理所述讀請求的目標存儲設(shè)備;以及在塊S203,將所述讀請求發(fā)送到所述目標存儲設(shè)備。
在一個實施例中,在塊S202中所利用的針對每個存儲設(shè)備所記錄的未完成的讀請求數(shù)目和已完成的讀請求數(shù)目可以通過以下方式進行更新:當存儲系統(tǒng)的多個存儲設(shè)備中的一個存儲設(shè)備,例如第一存儲設(shè)備,接收到新的讀請求時,將針對該第一存儲設(shè)備的未完成的讀請求數(shù)目加一;以及/或者,當多個存儲設(shè)備中的一個存儲設(shè)備,例如第二存儲設(shè)備,處理完一個讀請求時,將針對該第二存儲設(shè)備的尚未完成的讀請求數(shù)目減一,并且將針對該第二存儲設(shè)備的已完成的讀請求數(shù)目加一。如本領(lǐng)域技術(shù)人員能夠理解的,該計數(shù)更新操作也可以以其它的方式執(zhí)行。例如,計數(shù)的更新也可以以步長2為單位,即,每處理兩個I/O讀請求后執(zhí)行一次更新。本公開的實施例并不受限與此。
在一個實施例中,用于統(tǒng)計已完成的讀請求數(shù)目的時間段可以被預定為該存儲系統(tǒng)收到、或者分配兩個連續(xù)的讀請求之間的時間段。例如,在塊S203執(zhí)行后(即在將所述讀請求發(fā)送到所述目標存儲設(shè)備后),可以將針對多個存儲設(shè)備中的每個存儲設(shè)備的已完成的讀請求數(shù)目清零。使得已完成的讀請求數(shù)目表示在一個讀請求被分配和下一個讀請求被分配之間的時間段內(nèi)完成的讀請求數(shù)目。但是,該預定的時間段也可以被以其它方式設(shè)置。
在另一實施例中,在塊S202中確定用于處理所述讀請求的目標存儲設(shè)備可以包括將多個存儲設(shè)備中的、未完成的讀請求數(shù)目最少的一個存儲設(shè)備確定為該目標存儲設(shè)備。根據(jù)該實施例,能夠選擇當前讀請求負載最輕的存儲設(shè)備(例如磁盤)來處理新的讀請求,有利于讀請求的負載平衡。另外,如果多個存儲系統(tǒng)最初具有相同的負載,則處理速度較快的磁盤將能夠處理完成較多的讀請求,并導致其未完成的讀請求較少。這種情況下,結(jié)果是選擇了處理速度較快的磁盤來服務下一讀請求。假定磁盤1當前比磁盤0處理更快, 則下一到達的讀I/O請求將被發(fā)送到磁盤1以獲得更好的性能。
在圖3中示出了存儲系統(tǒng)中的兩個磁盤的不同I/O處理狀態(tài)的示意圖。其中隊列301-306中的每個小方塊表示一個未處理的IO請求。情況0可以是初始情況,磁盤0和1的未完成的讀請求數(shù)目均為0。這是還沒有哪個磁盤處理速度更快的信息,因此,可以將到達的讀請求發(fā)送到任一磁盤。對于情況1和3,每個磁盤的未完成的讀請求數(shù)目是不同的。根據(jù)本公開的實施例,可以將讀請求發(fā)送到具有較少未完成讀請求的磁盤。
在一個實施例中,如果在多個存儲設(shè)備中有一組(多個)存儲設(shè)備具有相同的未完成的讀請求數(shù)目,例如圖3中的情況2,其中磁盤0和磁盤1具有相同的未完成的讀請求數(shù)目(即,隊列303和304中的未處理的IO請求數(shù)相同),則在塊S202中可以進一步根據(jù)該一組存儲設(shè)備的已完成的讀請求數(shù)目確定目標存儲設(shè)備。例如,在塊S202中可以將多個存儲設(shè)備中的、未完成的讀請求數(shù)目最少的一組存儲設(shè)備中、已完成的讀請求數(shù)目超過預定閾值的一個存儲設(shè)備確定為目標存儲設(shè)備。在另一實施例中,如果該一組存儲設(shè)備中每個存儲設(shè)備的已完成的讀請求數(shù)目均未超過預定閾值,則在塊S202可以從該一組存儲設(shè)備中隨機選取一個存儲設(shè)備作為目標存儲設(shè)備。在又一實施例中,如果未完成的讀請求數(shù)目最少的一組存儲設(shè)備中每個存儲設(shè)備的已完成的讀請求數(shù)目均未超過預定閾值,也可以進一步考慮其它參數(shù)確定目標存儲設(shè)備,而不是隨機選擇。
在一個實施例中,在塊S202也可以將多個存儲設(shè)備中的、未完成的讀請求數(shù)目最少的一組存儲設(shè)備中、已完成的讀請求數(shù)目最多的一個存儲設(shè)備確定為所述目標存儲設(shè)備。在另一實施例中,可以首先根據(jù)預定閾值確定目標存儲設(shè)備,并且在該一組存儲設(shè)備中每個存儲設(shè)備的已完成的讀請求數(shù)目均未超過預定閾值時,選擇已完成的讀請求數(shù)目最多的一個存儲設(shè)備為目標存儲設(shè)備。
根據(jù)以上實施例,能夠通過一個磁盤的已完成的讀請求的數(shù)目來預測該磁盤在短期內(nèi)的速度,同時考慮該磁盤的當前負載,從而 選擇更適合的磁盤來服務下一讀請求。這明顯地優(yōu)于隨機選擇任一磁盤的傳統(tǒng)方法。
在方法200中,還可以考慮可能的不連續(xù)讀請求的情況。例如,在多個存儲設(shè)備中的一個存儲設(shè)備,例如第三存儲設(shè)備,的未完成的讀請求數(shù)目為零時,即該第三存儲設(shè)備已經(jīng)處理完所有的讀I/O請求時,如果沒有新的讀請求到達該第三存儲設(shè)備,則出現(xiàn)了不連續(xù)讀請求的情況。這種情況下,如果沒有新的讀I/O請求到達該存儲設(shè)備(例如磁盤),則該存儲設(shè)備的已完成的讀請求數(shù)目將不會增加,并且最終可能由于較小的已完成的讀請求數(shù)目而導致其不會被選為目標存儲系統(tǒng)。然而,在這種情況下,較少的已完成的讀請求數(shù)目已不能表示處理速度,因為其是由不連續(xù)的I/O請求導致的。因此,根據(jù)已完成的讀請求數(shù)目做出的目標存儲設(shè)備的選擇可能并不是最優(yōu)的??紤]到這種情況,在一個實施例中,當多個存儲設(shè)備中的第三存儲設(shè)備的未完成的讀請求數(shù)目為零、并且沒有新的讀請求到達該第三存儲設(shè)備時,可以通過將針對該第三存儲設(shè)備的已完成的讀請求數(shù)目清零,并且將用于處理讀請求的目標存儲設(shè)備的索引設(shè)置為無效來進行計數(shù)更新;并且在這種情況下,在塊S202中如果發(fā)現(xiàn)目標存儲設(shè)備的索引被設(shè)置為無效,則可以從多個存儲設(shè)備中隨機選取一個存儲設(shè)備作為目標存儲設(shè)備。
以下參考圖4描述用于控制從存儲系統(tǒng)讀取數(shù)據(jù)的另一方法400的流程。該方法400同樣利用了針對每個磁盤的未完成的讀請求數(shù)目和已完成的讀請求數(shù)目來確定用于服務讀請求的磁盤。
方法400也可以在如圖1所示的存儲系統(tǒng)中實施,但是不限于在這種存儲結(jié)構(gòu)中實施。而是可以應用于任何存儲系統(tǒng),該存儲系統(tǒng)包括多個存儲設(shè)備,并且數(shù)據(jù)的備份被存儲在該多個存儲設(shè)備中的每個存儲設(shè)備中。
如圖4所示,方法400包括初始化操作,其中通過將最優(yōu)存儲設(shè)備的索引設(shè)定為無效、并且將針對所述多個存儲設(shè)備中的每個存儲設(shè)備的未完成的讀請求數(shù)目和已完成的讀請求數(shù)目設(shè)置為0來進 行初始化,并且方法400還包括以下步驟:
步驟1:在多個存儲設(shè)備中的一個存儲設(shè)備的讀請求處理完成時,將針對所述一個存儲設(shè)備的未完成的讀請求數(shù)目減1;并進入步驟2;
步驟2:確定針對所述一個存儲設(shè)備的未完成的讀請求數(shù)目是否為0,在所述未完成的讀請求數(shù)目為0時,進入步驟3;否則進入步驟5;
步驟3:確定所述最優(yōu)存儲設(shè)備的索引是否為無效或者等于所述一個存儲設(shè)備的索引;并且如果所述最優(yōu)存儲設(shè)備的索引為無效或者等于所述一個存儲設(shè)備的索引,則進入步驟5,否則進入步驟4;
步驟4:將所述最優(yōu)存儲設(shè)備的所述索引設(shè)置為無效,并且將針對所述一個存儲設(shè)備的已完成的讀請求數(shù)目設(shè)置為0;并進入步驟8;
步驟5:將針對所述一個存儲設(shè)備的已完成的讀請求數(shù)目加1;并進入步驟6;
步驟6:確定針對所述一個存儲設(shè)備的已完成的讀請求數(shù)目是否超過預定閾值N;并且如果針對所述一個存儲設(shè)備的已完成的讀請求數(shù)目超過所述預定閾值,則進入步驟7,否則,進入步驟8;
步驟7:將所述最優(yōu)存儲設(shè)備的索引設(shè)置為所述一個存儲設(shè)備的索引,并且將針對所述多個模塊中的每個存儲設(shè)備的已完成的讀請求數(shù)目清零;進入步驟8;
步驟8:如果所述最優(yōu)存儲設(shè)備的索引為無效,則從所述多個存儲設(shè)備中隨機選取目標存儲設(shè)備,用于服務下一讀請求;否則,從所述多個存儲設(shè)備中選取與所述最優(yōu)存儲設(shè)備的索引對應的存儲設(shè)備作為目標存儲設(shè)備,用于服務下一讀請求。
在一個實施例中,在一組存儲設(shè)備具有相同的未完成的讀請求數(shù)目時,應用方法400來從這一組存儲設(shè)備中選取目標存儲設(shè)備。而對于具有不同的未完成的讀請求數(shù)目的情況,可以根據(jù)未完成的讀請求數(shù)目來確定目標存儲設(shè)備。
在另一個實施例中,方法400中的一些步驟可以被省略、或者 被其他操作所替換。例如,在不考慮不連續(xù)的I/O請求的情況下,可以省略步驟2、3和4,從步驟1直接進入步驟5。在另一實施例中,步驟6中的判斷也可以由比較操作來替換,例如,可以比較各個存儲設(shè)備的已完成的讀I/O數(shù)目,并且在步驟7將最優(yōu)存儲設(shè)備的索引設(shè)置為具有最大已完成的讀I/O數(shù)目的存儲設(shè)備的索引。
在圖5中給出了采用本公開的實施例的方法選擇目標存儲設(shè)備的示例0到示例9。在這些示例中,假定采用SSD RAID 1存儲系統(tǒng)。如果SSD中的磁盤1進入單回路故障,則響應時間將幾乎加倍。如果磁盤0的響應時間是T,則磁盤1的響應時間是2T。假定RAID組僅在當前節(jié)點具有讀業(yè)務,在對等節(jié)點沒有任何業(yè)務。
如圖5所示,示例0中,用戶依次向RAID組發(fā)出9個讀I/O請求,每個I/O間隔是T/2。初始化階段,步驟6中的閾值N被設(shè)置為2,最優(yōu)存儲設(shè)備的索引K被設(shè)置為無效。
在示例1中,兩個盤0和1均沒有未完成的I/O。因此I/O 0可以被隨機地發(fā)送到任何磁盤。在示例1中,該I/O 0被發(fā)送到磁盤0。
在示例2中,磁盤0具有一個未完成的讀請求,磁盤1沒有未完成的讀請求,因此,根據(jù)本公開的實施例的方法,I/O 1被發(fā)送到磁盤1。
在示例3中,磁盤0中的I/O 0被處理完成并返回,磁盤0的已完成的讀請求數(shù)目為1,未完成的讀請求數(shù)目為0,磁盤1的未完成的讀請求數(shù)目為1。根據(jù)本公開的實施例的方法,I/O 2被發(fā)送到磁盤0。
在示例4中,兩個磁盤均具有1個未完成的I/O。下一I/O 3可以被發(fā)送到任一磁盤,因為K被設(shè)置為無效。在該示例中,I/O 3被發(fā)送到磁盤0。
在示例5中,I/O 2在磁盤0被處理完成,同時兩個磁盤未完成的讀請求數(shù)目系統(tǒng),磁盤0的已完成的讀請求數(shù)目達到閾值N=2。因此根據(jù)本公開的實施例的方法,下一I/O 4被發(fā)送到磁盤0,K=0。
在示例6中,I/O 1和I/O 3均被處理完成,磁盤1沒有未完成 的I/O請求,下一I/O 5被發(fā)送到磁盤1。
在示例7中,I/O 4的處理完成,根據(jù)本公開的實施例的方法,將下一I/O 6發(fā)送到磁盤0,并且K被更新為0。
在示例8中,在I/O 7到達時,兩個磁盤的未完成的I/O數(shù)目均為1,該I/O 7被發(fā)送到K對應的磁盤0。
在示例9中,磁盤0處理完成I/O 6,兩個磁盤均具有相同的未完成的I/O數(shù)目,同樣將I/O 8發(fā)送給K對應的磁盤0。
由以上示例可見,根據(jù)本公開的實施例的方法,大部分的I/O被發(fā)送到速度快的磁盤0。這使得存儲系統(tǒng)的響應時間縮短,性能提高。
以下參考附圖6描述用于控制從存儲系統(tǒng)讀取數(shù)據(jù)的裝置600的結(jié)構(gòu)。裝置600所適用的存儲系統(tǒng)包括多個存儲設(shè)備,并且數(shù)據(jù)的備份被存儲在所述多個存儲設(shè)備中的每個存儲設(shè)備中。例如該存儲系統(tǒng)可以是(但是并不限于)如圖1所示的存儲系統(tǒng)100。裝置600可以執(zhí)行參考圖2所述的方法200,但是不限于執(zhí)行該方法200。同樣該方法200可以由裝置600執(zhí)行,但是不限于由裝置600執(zhí)行。例如方法200的至少一些操作可以由其它的裝置來執(zhí)行。
如圖6所示,裝置600包括計數(shù)模塊601,被配置為針對所述多個存儲設(shè)備中的每個存儲設(shè)備,記錄當前尚未完成的讀請求數(shù)目、以及在預定時間段內(nèi)已完成的讀請求數(shù)目;讀請求接收模塊602,被配置為接收用于從所述存儲系統(tǒng)讀取數(shù)據(jù)的讀請求;確定模塊603,被配置為根據(jù)針對每個存儲設(shè)備所記錄的未完成的讀請求數(shù)目和已完成的讀請求數(shù)目,從所述多個存儲設(shè)備中確定用于處理所述讀請求的目標存儲設(shè)備;以及讀請求分配模塊604,被配置為將所述讀請求發(fā)送到所述目標存儲設(shè)備。
在一個實施例中,模塊602-604可以被配置為執(zhí)行參考圖2所述的方法200的步驟S201-S203。因此,參考方法200進行的相關(guān)描述在此同樣適用。
在一個實施例中計數(shù)模塊601可以進一步被配置為在所述多個存儲設(shè)備中的第一存儲設(shè)備接收到新的讀請求時,將針對所述第一 存儲設(shè)備的尚未完成的讀請求數(shù)目加一;以及在所述多個存儲設(shè)備中的第二存儲設(shè)備處理完一個讀請求時,將針對所述第二存儲設(shè)備的尚未完成的讀請求數(shù)目減一,并且將針對所述第二存儲設(shè)備的已完成的讀請求數(shù)目加一。
在另一實施例中,計數(shù)模塊601可以進一步被配置為在將讀請求發(fā)送到目標存儲設(shè)備后,將針對多個存儲設(shè)備中的每個存儲設(shè)備的已完成的讀請求數(shù)目清零。
在一個實施例中,確定模塊603可以進一步被配置為將所述多個存儲設(shè)備中的、未完成的讀請求數(shù)目最少的一個存儲設(shè)備確定為所述目標存儲設(shè)備。在另一實施例中,該確定模塊可以進一步被配置為將所述多個存儲設(shè)備中的、未完成的讀請求數(shù)目最少的一組存儲設(shè)備中、已完成的讀請求數(shù)目超過預定閾值的一個存儲設(shè)備確定為所述目標存儲設(shè)備,并且在所述一組存儲設(shè)備中每個存儲設(shè)備的已完成的讀請求數(shù)目均未超過預定閾值時,從所述一組存儲設(shè)備中隨機選取一個存儲設(shè)備作為所述目標存儲設(shè)備。
替代地,在一個實施例中,確定模塊還可以被配置為將所述多個存儲設(shè)備中的、未完成的讀請求數(shù)目最少的一組存儲設(shè)備中、已完成的讀請求數(shù)目最多的一個存儲設(shè)備確定為目標存儲設(shè)備。
考慮到不連續(xù)的讀請求的情況,在一個實施例中,計數(shù)模塊601可以進一步被配置為:在針對所述多個存儲設(shè)備中的第三存儲設(shè)備的未完成的讀請求數(shù)目為零、但沒有新的讀請求到達所述第三存儲設(shè)備時,將針對所述第三存儲設(shè)備的已完成的讀請求數(shù)目清零,并且將用于處理所述讀請求的目標存儲設(shè)備的索引設(shè)置為無效;并且確定模塊603可以進一步被配置為:在所述目標存儲設(shè)備的索引被設(shè)置為無效時,從所述多個存儲設(shè)備中隨機選取一個存儲設(shè)備作為所述目標存儲設(shè)備。這使得在根據(jù)已完成的讀請求數(shù)目不能夠得到最優(yōu)目標存儲設(shè)備時,能夠回退到隨機選擇,保證負載的平衡。
在圖7中示出了用于控制從存儲系統(tǒng)讀取數(shù)據(jù)的另一裝置700的示例結(jié)構(gòu)。裝置700同樣適用于包括多個存儲設(shè)備的存儲系統(tǒng), 并且其中數(shù)據(jù)的備份被存儲在所述多個存儲設(shè)備中的每個存儲設(shè)備中。該存儲系統(tǒng)可以是如圖1所示的存儲系統(tǒng)100,例如可以是RAID1。但是本公開的實施例不限于這種存儲結(jié)構(gòu)。
裝置700可以執(zhí)行參考圖4所示的方法400,但是不限于用于執(zhí)行該方法。同樣,方法400也不限于由裝置700來執(zhí)行。方法400的至少以下步驟可以由其它的裝置來執(zhí)行。
如圖7所示,裝置700包括初始化模塊710,被配置為通過將最優(yōu)存儲設(shè)備的索引設(shè)定為無效、并且將針對所述多個存儲設(shè)備中的每個存儲設(shè)備的未完成的讀請求數(shù)目和已完成的讀請求數(shù)目設(shè)置為0來進行初始化,以及以下模塊:
第一計數(shù)模塊701,被配置為在所述多個存儲設(shè)備中的一個存儲設(shè)備的讀請求處理完成時,將針對所述一個存儲設(shè)備的未完成的讀請求數(shù)目減1;并將更新后的所述未完成的讀請求數(shù)目發(fā)送給第一判斷模塊702;
第一判斷模塊702,被配置為確定針對所述一個存儲設(shè)備的未完成的讀請求數(shù)目是否為0,在所述未完成的讀請求數(shù)目為0時,促使第二判斷模塊703執(zhí)行動作,否則促使第二計數(shù)模塊705執(zhí)行動作;
第二判斷模塊703,被配置為確定所述最優(yōu)存儲設(shè)備的索引是否為無效或者等于所述一個存儲設(shè)備的索引;并且如果所述最優(yōu)存儲設(shè)備的索引為無效或者等于所述一個存儲設(shè)備的索引,則促使第二計數(shù)模塊705執(zhí)行動作,否則促使第一設(shè)置模塊704執(zhí)行動作;
第一設(shè)置模塊704,被配置為將所述最優(yōu)存儲設(shè)備的所述索引設(shè)置為無效,并且將針對所述一個存儲設(shè)備的已完成的讀請求數(shù)目設(shè)置為0;并促使選擇模塊708執(zhí)行動作;
第二計數(shù)模塊705,被配置為將針對所述一個存儲設(shè)備的已完成的讀請求數(shù)目加1;并促使第三判斷模塊706執(zhí)行動作;
第三判斷模塊706,被配置為確定針對所述一個存儲設(shè)備的已完成的讀請求數(shù)目是否超過預定閾值;并且如果針對所述一個存儲設(shè)備的已完成的讀請求數(shù)目超過所述預定閾值,則促使第二設(shè)置模塊 707執(zhí)行動作,否則,促使所述選擇模塊708執(zhí)行動作;
第二設(shè)置模塊707,被配置為將所述最優(yōu)存儲設(shè)備的索引設(shè)置為所述一個存儲設(shè)備的索引,并且將針對所述多個存儲設(shè)備中的每個存儲設(shè)備的已完成的讀請求數(shù)目清零;并且促使所述選擇模塊708執(zhí)行動作;
選擇模塊708,被配置為如果所述最優(yōu)存儲設(shè)備的索引為無效,則從所述多個存儲設(shè)備中隨機選取目標存儲設(shè)備,用于服務下一讀請求;否則,從所述多個存儲設(shè)備中選取與所述最優(yōu)存儲設(shè)備的索引對應的存儲設(shè)備作為目標存儲設(shè)備,用于服務下一讀請求。
在一個實施例中,模塊701-708可以被配置為執(zhí)行參考圖4所述的方法400的步驟1到步驟8。因此,參考方法400進行的相關(guān)描述在此同樣適用,并不在贅述。
如本領(lǐng)域技術(shù)人員能夠理解的,裝置600-700分別還可以包括圖6-7中未示出的其它單元,并且在一些實施例中,圖6-7中的某些單元可以被省略。
本公開的實施例所提出的方法和裝置的優(yōu)點包括以下的至少一項:
-縮短I/O響應時間、提高I/O性能,
-在不進行跨節(jié)點通信的情況下實現(xiàn)多個存儲設(shè)備(例如多個磁盤)間的讀I/O的負載平衡,同時不降低存儲系統(tǒng)的吞吐量。
本領(lǐng)域技術(shù)人員將容易地認識到,各種上述各種方法中的塊或者步驟可以通過編程的計算機來執(zhí)行。在本公開中,一些實施例還意在涵蓋程序存儲系統(tǒng),例如,數(shù)字數(shù)據(jù)存儲介質(zhì),這是機器或計算機可讀的并且編碼機器可執(zhí)行或計算機可執(zhí)行的指令程序,其中,所述指令執(zhí)行上述方法的一些或所有步驟。程序存儲系統(tǒng)可以是,例如,數(shù)字存儲器、諸如磁盤和磁帶的磁存儲介質(zhì)、硬盤驅(qū)動器或光學可讀數(shù)字數(shù)據(jù)存儲介質(zhì)。該實施例還意在涵蓋編程為執(zhí)行所述上述方法的步驟的計算機。一些實施例還意在涵蓋一種裝置,該裝置包括至少一個處理器;以及至少一個包括計算機程序代碼的存儲 器,其中所述至少一個存儲器和所述計算機程序代碼被配置為:與所述至少一個處理器一起,促使所述裝置執(zhí)行方法200或者400。
在附圖中示出的裝置的各種元件的功能,可以通過使用軟件、專用硬件以及與適當軟件相關(guān)聯(lián)的能夠執(zhí)行軟件的硬件、或者固件、或者其結(jié)合來提供。當由處理器提供時,該功能可以由單個專用處理器、由單個共享處理器或由多個單獨的處理器來提供。此外,術(shù)語“處理器”可以包括但不限于,數(shù)字信號處理器(DSP)硬件、網(wǎng)絡處理器、專用集成電路(ASIC)、現(xiàn)場可編程門陣列(FPGA),用于存儲軟件的只讀存儲器(ROM)、隨機存取存儲器(RAM)和非易失性存儲裝置。還可以包括其他常規(guī)和/或定制的硬件。
本領(lǐng)域技術(shù)人員應當理解,說明書和附圖僅僅說明本公開的實施例的原理。因此,應當理解,本領(lǐng)域的技術(shù)人員將能夠設(shè)計出各種布置,雖然這里沒有明確地描述或示出,但是該布置體現(xiàn)本公開的實施例的原理并且被包括在本公開的實施例的精神和范圍內(nèi)。此外,這里闡述的所有示例主要旨在明確僅用于教學目的,以幫助讀者理解本公開的實施例的原理和發(fā)明人貢獻的用于促進本領(lǐng)域的概念,并且應被解釋為不限于這些具體闡釋的示例和條件。而且,這里闡述本公開的實施例的原理、方面和實施例的所有闡述及其具體示例也意在包含其等同物。