專利名稱:用于磁盤陣列的讀取方法和系統(tǒng)的制作方法
技術領域:
本發(fā)明涉及通信領域,具體而言,涉及一種用于磁盤陣列(RAID)的讀取方法和系 統(tǒng)。
背景技術:
隨著半導體技術的發(fā)展,磁盤I/O帶寬和CPU/內存速度之間存在巨大的和持續(xù)擴 大的差距,因而磁盤存儲往往成為系統(tǒng)中的性能瓶頸。為了彌合兩者的差距,需要進行并行 I/O。利用磁盤陣列(RAID)技術堆疊多個磁盤的I/O能力,就可以提供更大的I/O帶寬。如 果需要的I/O帶寬巨大,可以進一步求助于存儲網(wǎng)絡,集群文件系統(tǒng)等在內的技術和架構 建造容量和性能可擴展的存儲系統(tǒng)。相對于I/O帶寬,訪問延遲往往是一個更為嚴重的性 能問題。由于機械尋道方式的限制,磁盤的平均數(shù)據(jù)訪問時間在毫秒數(shù)量級。雖然已經(jīng)很 快了,但是相對于內存和高速網(wǎng)絡的納秒級訪問時間,訪問磁盤數(shù)據(jù)的代價是巨大的。更糟 糕的是,這一差距一直不斷地在擴大。在這種情況下,CACHE技術對彌補兩者之間的性能差異有著至關重要的作用。 CACHE系統(tǒng)作為最近訪問數(shù)據(jù)的緩沖區(qū),采取預讀回寫等策略,提高數(shù)據(jù)的命中率,從而提 高整個系統(tǒng)的性能。在添加了 CACHE以后,縮短了 I/O路徑,每一次數(shù)據(jù)的訪問都要先搜索CACHE空 間,這樣需要一個高效的查找算法以避免長時間的查找而抵消CACHE帶來的優(yōu)勢。此外 CACHE存放的數(shù)據(jù)是共享的,如何減少數(shù)據(jù)的競爭粒度也是需要關注的。CACHE系統(tǒng)主要處理讀寫命令,為提高讀操作的性能,相關技術提出了預取方法。 下面將簡單描述預取方法。1)預取的概念預取分為順序預取和隨機預取。在順序預取中又分為同步預取和異步預取。同步 預取是在確定是順序流的情況下,發(fā)生命中缺失(命中缺失即為用戶訪問的數(shù)據(jù)不存在于 Cache空間中)而進行的預取,它僅僅是在原來讀請求之上再多讀取一定長度的數(shù)據(jù)。異步 預取是在命中了頁面的情況下,創(chuàng)建一個新的讀命令并讀取一定長度的數(shù)據(jù)。異步預取總 是跟同步預取一起使用的。如下圖所示同步預取在預取P長的頁面集后,如果P值達到了 異步預取的閾值,那么將會設置一個異步觸發(fā)頁面(該頁面離頁面集中的最后一個頁面的 長度為g),如果有讀操作訪問設置有異步觸發(fā)標識的頁面時,就會觸發(fā)一個異步預取。理論 上來說如果異步預取的參數(shù)P和g選取的好的話,那么讀操作就不會發(fā)生非命中的情況。跟同步預取相比,異步預取的使用更加廣泛有效。例如讀取數(shù)據(jù)時,磁盤忙碌而 CPU等待;在處理數(shù)據(jù)時,CPU忙碌而磁盤空閑。這種交替的空閑和等待是對系統(tǒng)資源的一 種閑置浪費。通過異步預取,系統(tǒng)在后臺提前進行1/0,可以消減CPU的等待時間,使之與磁 盤并行工作,實現(xiàn)流水線作業(yè)。2)預取參數(shù)的時機選擇如圖2所示,假設一個文件頁面,它在Ta時刻將被應用程序實際訪問,而預取算法在時間Tp發(fā)起對這個頁面的I/O請求,經(jīng)過操作系統(tǒng)和磁盤內部的調度排隊,以及磁盤的 尋道和數(shù)據(jù)傳送等操作,到Tr時頁面數(shù)據(jù)準備就緒。那么td = Tr-Tp代表此頁面的實際 I/O延遲,而應用程序感知到的延遲時間是t’ d = max(Tr-Ta,0)。如果記預取的提前量為te = Ta-Tp,如果有te彡td,即Ta-Tp彡Tr_Tp,那么就 有Tr-Ta < 0,此時t’ d = 0,底層的I/O延遲將被完全隱藏起來,應用程序不必為等待I/O 而阻塞。顯然最佳的預取時機是te = td,預取太早會使每塊預取數(shù)據(jù)占用更長時間的內 存,太晚了則會導致應用程序的阻塞。因而預取位置的選擇也是影響預讀性能的一個重要 因素。影響預取的時機即為p,g的值,p代表一次預取的數(shù)據(jù)長度(數(shù)據(jù)的讀取很大一 部分的時間是在磁盤尋找,因為順序讀取1K的數(shù)據(jù)跟順序讀取1M的數(shù)據(jù)花費的時間相差 不大),但是P不能過大,因為緩存空間相對于磁盤空間而言是很小的,預取的數(shù)據(jù)過大而 用沒有使用會造成緩存空間的浪費。g的值也影響到了預期的時機,如果g的值比較大,那 么在很早的時候就會進行異步預取,增加數(shù)據(jù)在緩存空間中停留的時間,如果g過小,那么 異步預取就來不及出現(xiàn)上圖(b)的情況,需要等待數(shù)據(jù)準備好??傊琍,g的值共同影響著 預讀的進行。要想預取能夠取得比較好的效果,就需要有比較合適的P,g的值。但是,在相關的技術中,p,g通常是被預先設置的,而不是根據(jù)當前的讀取情況動 態(tài)設置。這樣,根據(jù)P和g進行預取之后,往往會出現(xiàn)用戶需要的數(shù)據(jù)還沒有從磁盤中讀取 到緩存空間中,從而延長了讀取時間,降低了讀取的效率;或者,還會出現(xiàn)已經(jīng)從磁盤中預 讀到緩存空間中的數(shù)據(jù)并沒有被訪問到,從而造成了空間的浪費。
發(fā)明內容
本發(fā)明的主要目的在于提供一種用于RAID的讀取方法和系統(tǒng),以至少解決上述 相關技術中的讀取時間較長的問題。根據(jù)本發(fā)明的一個方面,提供了一種用于磁盤陣列RAID的讀取方法,其包括接 收讀取命令;從緩存空間中讀出上述讀取命令要訪問的數(shù)據(jù);判斷所訪問的地址是否設置 異步預取標志;若是,則按照異步預取長度進行異步預取,并調整上述異步預取長度。進一步地,調整上述異步預取長度時,上述方法還包括調整同步預取長度。進一步地,調整上述異步預取長度包括若當前讀取出來的數(shù)據(jù)沒有被訪問,則減 少異步預取長度,并清除上述異步預取標志;若當前訪問的地址中的數(shù)據(jù)正在從RAID讀取 的過程中,則增加上述異步預取觸發(fā)長度或者調整異步預取標志的大??;若在按照異步預 取長度進行異步預取的過程中,如果當前預取的數(shù)據(jù)有被訪問過或者在還沒有檢查結果時 當前預取的最后一個數(shù)據(jù)有被訪問過,則增加上述異步預取長度。進一步地,按照異步預取長度進行異步預取包括從磁盤中預取具有第一長度的 數(shù)據(jù),其中,上述第一長度為調整前的異步預取長度與上述讀取命令所需訪問的但未命中 的地址的個數(shù)之和;在上述緩存空間中確定上次讀取的最后一個地址;從所確定的地址的 下一個地址開始讀取上述第一長度的數(shù)據(jù)。進一步地,上述緩存空間中沒有上述讀取命令要訪問的數(shù)據(jù),上述方法還包括按 照同步預取長度進行同步預?。徽{整上述同步預取長度。進一步地,調整上述同步預取長度時,上述方法還包括調整異步預取長度。
進一步地,調整上述同步預取長度包括若當前同步預取出來的數(shù)據(jù)并沒有被訪 問,則減小上述同步預取長度;或者在當前訪問的數(shù)據(jù)預取出來之后,增加上述同步預取長度。進一步地,按照同步預取長度進行同步預取包括從磁盤中預取具有第二長度的 數(shù)據(jù),其中,上述第二長度為調整前的同步預取長度與上述讀取命令所需訪問的但未命中 的地址的個數(shù)之和;在上述緩存空間中確定上次讀取的最后一個地址;從所確定的地址的 下一個地址開始讀取上述第二長度的數(shù)據(jù)。根據(jù)本發(fā)明的另一方面,提供了一種用于RAID的讀取系統(tǒng),其包括命令處理模 塊,用于接收讀取命令;讀出模塊,用于從緩存空間中讀出上述讀取命令要訪問的數(shù)據(jù);預 取模塊,用于在判斷所訪問的地址設置有異步預取標志時,按照異步預取長度進行異步預 取,并調整上述異步預取長度。進一步地,上述預取模塊還用于在上述緩存空間中沒有上述讀取命令要訪問的數(shù) 據(jù)時,按照同步預取長度進行同步預取,并調整上述當前的同步預取長度。本發(fā)明具有以下有益效果1)通過動態(tài)調整同步預取和異步預取的長度,使得預取更加符合系統(tǒng)運行的實際 情況,盡量避免了用戶需要的數(shù)據(jù)還沒有從磁盤中讀取到緩存空間中、或者,已經(jīng)從磁盤中 預讀到緩存空間中的數(shù)據(jù)并沒有被訪問到等問題,有效地提高cache空間的利用率,縮短 讀取的時間,提高讀取的效率。2)同時調整異步預取長度和同步預取長度,增加了對控制的靈活性。3)通過CACHE系統(tǒng)的實現(xiàn),緩存最近訪問的數(shù)據(jù),提高整個系統(tǒng)的性能。
此處所說明的附圖用來提供對本發(fā)明的進一步理解,構成本申請的一部分,本發(fā) 明的示意性實施例及其說明用于解釋本發(fā)明,并不構成對本發(fā)明的不當限定。在附圖中圖1是根據(jù)相關技術中的異步預取方法的示意圖;圖2是根據(jù)相關技術中的異步預取I/O與讀命令時間線的示意圖;圖3是根據(jù)本發(fā)明實施例的Cache子系統(tǒng)在整個系統(tǒng)架構中的位置示意圖;圖4是根據(jù)本發(fā)明實施例的Cache子系統(tǒng)的功能模塊的示意圖;圖5是根據(jù)本發(fā)明實施例的使用Radix-Tree和Lru鏈表管理整個Cache空間的 示意圖;圖6是根據(jù)本發(fā)明實施例的用于RAID的讀取方法的流程圖;圖7是根據(jù)本發(fā)明實施例的用于RAID的讀取方法中的預取步驟的示意圖;圖8是根據(jù)本發(fā)明實施例的用于RAID的讀取系統(tǒng)的示意圖。
具體實施例方式下文中將參考附圖并結合實施例來詳細說明本發(fā)明。需要說明的是,在不沖突的 情況下,本申請中的實施例及實施例中的特征可以相互組合。首先描述本發(fā)明實施例所采用的Cache子系統(tǒng)。該Cache子系統(tǒng)可以作為用于磁 盤陣列RAID的讀取系統(tǒng)。
圖3是根據(jù)本發(fā)明實施例的Cache子系統(tǒng)在整個系統(tǒng)架構中的位置示意圖。如圖 3所示,整個系統(tǒng)架構主要包括主機服務器31、SCSI目標器32、Cache子系統(tǒng)33、Raid管 理器34、SCSI啟動器35和SCSI磁盤36。主機服務器31對存儲系統(tǒng)訪問時,將會發(fā)送SCSI命令。SCSI目標器32接收到 SCSI命令后,將對命令進行解析,然后向Cache子系統(tǒng)33發(fā)送I/O請求。Cache子系統(tǒng)33 響應SCSI目標器的I/O請求。如果訪問的數(shù)據(jù)不在Cache中時,將向RAID管理器34提交 實際的I/O請求操作。RAID管理器34會將I/O請求分解到具體的存儲設備上執(zhí)行,例如, 通過SCSI啟動器35訪問SCSI磁盤36。下面將結合圖6來描述圖3所示的Cache子系統(tǒng)所采用的用于磁盤陣列RAID的 讀取方法。圖6是根據(jù)本發(fā)明實施例的用于磁盤陣列RAID的讀取方法的流程圖。如圖6所 示,用于磁盤陣列RAID的讀取方法包括如下步驟S61,接收讀取命令。優(yōu)選的,讀取命令用于指示緩存空間中待訪問的地址范圍;S62,從緩存空間中讀出讀取命令要訪問的數(shù)據(jù)。S63,判斷所訪問的地址是否設置異步預取標志。S64,若是,則按照異步預取長度進行異步預取,并調整異步預取長度。相關技術中,異步預取長度是保持不變的,而在本實施例中,在調整當前的異步預 取長度之后,對下一個讀取命令來說,異步預取長度是根據(jù)上一次讀取命令所讀取的情況 來進行調整的,也就是說,根據(jù)上一次的情況來提前對下一個讀取命令中的預取參數(shù)進行 設置。例如,在出現(xiàn)用戶從磁盤中預讀到緩存空間中的數(shù)據(jù)很快被訪問時,增加異步預取 長度;或者,在已經(jīng)從磁盤中預讀到緩存空間中的數(shù)據(jù)并沒有被訪問到時,減小異步預取長 度。通過上述對異步預取長度進行的動態(tài)調整,使得預取更加符合系統(tǒng)運行的實際情 況,盡量避免了用戶需要的數(shù)據(jù)還沒有從磁盤中讀取到緩存空間中、或者,已經(jīng)從磁盤中預 讀到緩存空間中的數(shù)據(jù)并沒有被訪問到等問題,有效地提高cache空間的利用率,縮短讀 取的時間,提高讀取的效率。優(yōu)選的,在調整當前的異步預取長度時,還可以調整當前的同步預取長度。通過同 時調整異步預取長度和同步預取長度,增加了對控制的靈活性。優(yōu)選的,若當前訪問的地址上沒有保存有數(shù)據(jù),則按照當前的同步預取長度進行 同步預取;調整當前的同步預取長度。與動態(tài)調整異步預取長度相似,在調整當前的同步預取長度之后,對下一次讀取 命令來說,同步預取長度是根據(jù)上一次讀取命令所讀取的情況來進行調整的,也就是說,根 據(jù)上一次的情況來提前對下一次讀取命令中的預取參數(shù)進行設置。例如,在觸發(fā)同步預取 后,自動增加同步預取長度;或者,在已經(jīng)從磁盤中預讀到緩存空間中的數(shù)據(jù)并沒有被訪問 到時,減小同步預取長度。同樣,通過上述對同步預取長度進行的動態(tài)調整,使得預取更加符合系統(tǒng)運行的 實際情況,盡量避免了用戶需要的數(shù)據(jù)還沒有從磁盤中讀取到緩存空間中、或者,已經(jīng)從磁 盤中預讀到緩存空間中的數(shù)據(jù)并沒 被訪問到等問題,有效地提高cache空間的利用率,縮短讀取的時間,提高讀取的效率。此外,在調整當前的同步預取長度時,還可以調整當前的異步預取長度。通過同時 調整異步預取長度和同步預取長度,增加了對控制的靈活性。優(yōu)選的,在本實施例中,在預取完成一定時間后,檢查本次預取的結果。根據(jù)檢查 的結果,調整當前的異步預取長度包括1)若當前讀取出來的數(shù)據(jù)沒有被訪問時,則減少異步預取長度p,清除異步預取 設置的異步預取標志。通過減少下次預取數(shù)據(jù)的長度以及清除下次異步預取的標志,可以 避免不必要的讀取操作,節(jié)省空間,提高空間利用率。2)若當前訪問的地址中的數(shù)據(jù)正在從RAID讀取當中,則增加所述異步預取觸發(fā) 長度或者調整異步預取標志g的大小(這里,異步預取標志g指的是異步觸發(fā)頁面離頁面 集中的最后一個頁面的長度),例如,增大當前的異步觸發(fā)標志g的值。因為此時需要等待 從磁盤中將用戶需要的數(shù)據(jù)讀取到緩存空間中,在這種情況下,增大當前的異步觸發(fā)標志g 的值,提前進行預取,使得縮短等待的時間,提高了讀取效率。3)若在本次預取過程中,如果當前預取的數(shù)據(jù)有被訪問過或者在還沒有檢查結果 時當前預取的最后一個數(shù)據(jù)有被訪問過,那么增大異步預取的長度。這樣說明當前需要更 加積極的預取策略,增大預取長度,提高預取效率。優(yōu)選的,在本實施例中,在預取完成一定時間后,檢查本次預取的結果。根據(jù)檢查 的結果,調整當前的同步預取長度包括1)若當前同步預取訪問出來的數(shù)據(jù)并沒有被訪問,則減小當前的同步預取長度。 如果當前同步預取還設置了異步預取的標識,則清除異步預取的標識。這樣,避免不必要的 預取,可以節(jié)省空間,提高空間利用率。2)當前訪問的數(shù)據(jù)預取出來以后,自動增加同步預取的長度。如果同步預取的長 度達到異步預取的閾值,設置異步預取的標識。優(yōu)選的,在本實施例中,按照當前的異步預取長度進行異步預取包括1)從磁盤中預取具有第一長度的數(shù)據(jù),其中,第一長度為調整前的異步預取長度 與讀取命令所需訪問的但未命中的地址的個數(shù)之和;2)在緩存空間中確定上次讀取的最后一個地址;3)從所確定的地址的下一個地址開始讀取第一長度的數(shù)據(jù)。優(yōu)選的,在本實施例中,按照當前的同步預取長度進行同步預取包括1)從磁盤中預取具有第二長度的數(shù)據(jù),其中,所述第二長度為調整前的同步預取 長度與讀取命令所需訪問的但未命中的地址的個數(shù)之和;2)在所述緩存空間中確定上次讀取的最后一個地址;3)從所確定的地址的下一個地址開始讀取上次讀取的最后一個地址。下面將結合圖7對用于磁盤陣列RAID的讀取方法中的預取步驟進行詳細的描述。圖7是根據(jù)本發(fā)明實施例的用于磁盤陣列RAID的讀取方法中的預取步驟的示意 圖。如圖7所示,用于磁盤陣列RAID的讀取方法中的預取步驟包括S71,依次訪問由讀命令指示的待讀取的地址范圍。如果當前訪問的地址上保存有 數(shù)據(jù),則稱為命中Cache節(jié)點,轉至S72 ;否則,轉至S75。S72,判斷當前訪問的地址是否設置異步預取標志。如設置,則轉至S73 ;否則,轉至 S79。S73,進行異步預取。具體的,從磁盤中預取具有第一長度的數(shù)據(jù),其中,所述第一 長度為調整前的異步預取長度與所述讀取命令所需訪問的但未命中的地址的個數(shù)之和;在 緩存空間中確定上次讀取的最后一個地址;從所確定的地址的下一個地址開始讀取第一長 度的數(shù)據(jù)。在本實施例中,“從磁盤中預取具有第一長度的數(shù)據(jù)”的步驟與“在緩存空間中 確定上次讀取的最后一個地址”的步驟可以同時進行,或按任意順序進行。執(zhí)行異步預取操 作以后,清除該地址上的異步預取標志。S74,調整異步預取參數(shù)。具體的,可以按照以下情況調整預取參數(shù)1)若當前讀取出來的數(shù)據(jù)沒有被訪問,則減少異步預取長度,并清除異步預取設 置的異步預取標志;2)若當前訪問的地址中的數(shù)據(jù)正在從RAID讀取的過程中,則增加所述異步預取 觸發(fā)長度或者調整異步預取標志g的大小(這里,異步預取標志g指的是異步觸發(fā)頁面離 頁面集中的最后一個頁面的長度),例如,增大當前的異步觸發(fā)標志g的值;3)若在按照異步預取長度進行異步預取的過程中,如果當前預取的數(shù)據(jù)有被訪問 過或者在還沒有檢查結果時當前預取的最后一個數(shù)據(jù)有被訪問過,則增加所述異步預取長 度。S75,判斷是否是順序流。若是,轉至S76 ;否則,轉至S78。具體的,判斷是否為順序流的步驟包括1)確定當前訪問的地址為緩存空間中連續(xù)的第N個地址;2)若N大于閾值,則為順序流;否則,為非順序流。S76,進行同步預取。具體的,通過以下步驟進行同步預取1)從磁盤中預取具有第二長度的數(shù)據(jù),其中,所述第二長度為調整前的同步預取 長度與所述讀取命令所需訪問的但未命中的地址的個數(shù)之和;2)在所述緩存空間中確定上次讀取的最后一個地址;3)從所確定的地址的下一個地址開始讀取所述第二長度的數(shù)據(jù)。S77,調整同步預取參數(shù)。具體的,可以按照以下情況調整預取參數(shù)1)若當前同步預取出來的數(shù)據(jù)并沒有被訪問,則減小所述同步預取長度,如果當 前同步預取還設置了異步預取的標識,則清除異步預取的標識;或者2)在當前訪問的數(shù)據(jù)預取出來之后,自動增加同步預取的長度。如果同步預取的 長度達到異步預取的閾值,設置異步預取的標識。S78,從磁盤中讀取一個數(shù)據(jù)到當前訪問的地址中,并從當前訪問的地址中將該數(shù) 據(jù)讀出。S79,進行讀命令的其他操作。本發(fā)明實施例適用于在不同的情況下對異步預取長度和/或同步預取長度進行 動態(tài)調整。下面將描述不同情況下進行預取長度動態(tài)調整的具體過程的實施例。實施例1假定順序流的閾值為8,達到異步預取的值為6,p的初始值為4。具體的,A命令訪問的地址為6-10,原來cache空間中0_6地址中的數(shù)據(jù)已經(jīng)存 在,那么在處理A命令時,7沒有命中,從磁盤中讀取,當訪問到地址8時,這時候已經(jīng)達到一個順序流的要求,觸發(fā)一個同步預取的操作,將一次性的從磁盤中讀取8-14的數(shù)據(jù)到 cache空間中,當這次預取數(shù)據(jù)完成以后,我們就增大p的值(例如由原來的4增大到6), 我們把這個值存放在管理地址14數(shù)據(jù)的數(shù)據(jù)結構上。由于此時的p = 6,已經(jīng)達到異步預 取的閾值,我們設置g = P/2.,那么在14-3 = 11的位置上設置一個異步預取的標識。在上述情況下,假設C命令訪問的地址為8-12,那么在命中11的時候,會觸發(fā)一 個異步預取,讀取15-22的數(shù)據(jù),如果此時又有一個D命令訪問14-18的數(shù)據(jù),此時訪問的 數(shù)據(jù)正在等待從RAID中讀取出來,那么增加g的值,如從原來的3增大到4,存放在地址22 的管理數(shù)據(jù)結構中。在地址18上設置異步預取的標識。在地址15-22的預取結束后一定時間內(例如2s),我們發(fā)現(xiàn)15_22中的數(shù)據(jù)有被 訪問過,那么增加P的值為8,并將該值存儲在地址22上面;或者在15-22預取結束后,在 還沒有觸發(fā)檢查預取結果操作的情況下,有命令命中22,那么也將增加p的值為8 (這兩種 情況增加P的值不重復疊加)。實施例2在實施例1的基礎上,假設讀取8-14 —段時間以后,發(fā)現(xiàn)11-14的數(shù)據(jù)沒有人訪 問,那么我們就減少P的值,將14上面原來存儲的p = 6的值修改為p = 4。在15-22的預取結束后一定時間內(例如2s),我們發(fā)現(xiàn)15-22中的數(shù)據(jù)沒有用戶 訪問,那么減少P的值為6,并將該值存儲在地址22上面。g減少為3.入股原來在18上的 異步預取的標識還存在,那么將清除18上的異步預取標識。圖4是根據(jù)本發(fā)明實施例的Cache子系統(tǒng)的功能模塊的示意圖。如圖4所示,該 Cache子系統(tǒng)包括初始化模塊41、命令處理模塊42、Cache管理模塊43,預取/讀取單元 44、回寫模塊45和Raid管理模塊46。初始化模塊41主要負責初始化模塊負責模塊的加載與退出,在初始化時申請內 存數(shù)據(jù)結構,創(chuàng)建工作線程,在退出時,釋放申請的內存,注銷工作線程。命令處理模塊42接收從主機服務器發(fā)送來的讀寫命令,并對讀寫命令進行處理, 其中,讀取命令用于指示緩存空間中待訪問的地址范圍。Cache子系統(tǒng)緩存了近一段時間訪 問的磁盤數(shù)據(jù),對于讀命令,將查找緩存空間,如果找到就返回數(shù)據(jù),如果沒有找到將分配 新的緩存空間,發(fā)起磁盤讀操作。對于寫命令,將查找緩存空間,如果找到就返回地址空間, 沒有找到就分配新的緩存空間,以接受用戶的寫數(shù)據(jù)。CACHE管理模塊43主要負責cache空間的組織與查找。Cache空間的分配以及 cache空間的替換。它為每一個邏輯單元創(chuàng)建一棵Radix-Tree,提高查找效率。并為cache 數(shù)據(jù)維護一份LRU鏈表,保留數(shù)據(jù)流訪問的歷史信息,為回寫和替換處理提供參考依據(jù)。回寫模塊45主要是在臟數(shù)據(jù)達到用戶指定的比例或者臟數(shù)據(jù)在cache空間駐留 的時間超過用戶指定的閾值,將臟數(shù)據(jù)同步到磁盤空間上,保證數(shù)據(jù)的一致性和完整性。Raid管理模塊46用于對Raid進行管理。預取/讀取單元44主要負責訪問模式的識別、訪問和讀出數(shù)據(jù),以及發(fā)起預取請 求和調整預讀參數(shù)。預取/讀取單元44主要包括訪問模塊441、讀出模塊442、預取模塊443。其中, 讀出模塊442用于從緩存空間中讀出所述讀取命令要訪問的數(shù)據(jù);預取模塊443用于在判 斷所訪問的地址設置有異步預取標志時,按照異步預取長度進行異步預取,并調整所述異步預取長度。在工作狀態(tài)下,訪問模塊441按順序對待訪問的地址范圍中的地址進行訪問。在 當前訪問的地址發(fā)生命中缺失的情況下(命中缺失即為用戶訪問的數(shù)據(jù)不存在于Cache空 間中),讀出模塊442將當前訪問的地址上的數(shù)據(jù)從磁盤中讀到Cache空間中。在當前訪問 的地址發(fā)生命中的情況下,判斷當前訪問的地址上是否設置有異步預取標志,若設置有,則 預取模塊443按照當前的異步預取長度進行異步預取,并在進行異步預取之后調整當前的 異步預取長度。優(yōu)選的,在當前訪問的地址上沒有命中的情況下(命中即為用戶訪問的數(shù)據(jù)已在 cache空間中),預取模塊443按照當前的同步預取長度進行同步預取。在進行同步預取子 后,調整模塊444調整當前的同步預取長度。預取/讀取單元44在線監(jiān)控讀請求,對于順序的讀請求,提前發(fā)起I/O操作請求, 將數(shù)據(jù)填充到cache空間中,并調整預讀參數(shù)。在CACHE中數(shù)據(jù)是以塊的方式組織的,沒有 更高的抽象形式。但是可以通過10數(shù)據(jù)流以及地址的連續(xù)性來將數(shù)據(jù)塊串聯(lián)起來,通過在 Cache節(jié)點中添加預取參數(shù)結構,能夠較好地維持數(shù)據(jù)流的讀取歷史信息,并通過這些信息 確定預取的時機,長度并根據(jù)實際情況進行調整。此外,這種方式也便于擴展使用不同的預 取算法,只需為不同的預取算法定義其對應的預取參數(shù)結構,而無需對整個軟件架構進行 變更。圖5是根據(jù)本發(fā)明實施例的使用Radix-Tree和Lru鏈表管理整個Cache空間的示 意圖。如圖5所示,存儲系統(tǒng)上的設備資源是以邏輯單元呈現(xiàn)給用戶使用的,每個邏輯單元 都有自己的一維地址空間,在查找cache空間時,將先確定命令訪問數(shù)據(jù)所屬的邏輯單元, 然后在搜索相應邏輯單元的Radix-Tree。Radix-Tree用來快速定位請求的cache節(jié)點,而 Lru鏈表用來記錄數(shù)據(jù)訪問的歷史信息。Cache節(jié)點是管理的基本單元,包括預取參數(shù),邏 輯地址,鎖,引用計數(shù),狀態(tài),數(shù)據(jù)空間等成員變量。下面將對包括圖4所示的Cache子系統(tǒng)的RAID的緩存系統(tǒng)的工作流程進行詳細 的描述。S1,系統(tǒng)初始化時,申請cache空間以及創(chuàng)建內核線程。S2,命令處理模塊接收到上層發(fā)送的SCSI命令。對于讀寫命令,將其添加到各自 的等待隊列中,并喚醒讀命令處理線程或寫命令處理線程進行處理。具體的,對于讀命令,如果在cache空間中找到,那么就直接返回,如果沒有找到 就從磁盤中進行讀取。在此過程中可以觸發(fā)預取操作,并進行相應的預取參數(shù)調整。對于寫命令,如果在cache空間中找到,則獲取該節(jié)點的鎖,如果獲取不到鎖,則 等待,獲取到了鎖,則返回地址空間;如果沒有找到,則直接分配空間,分配空間時,有可能 會觸發(fā)回寫線程進行處理。對于讀命令,返回數(shù)據(jù),命令處理結束。對于寫命令,返回地址空間,接收上層傳輸 的數(shù)據(jù),命令處理結束。本實施例在Radix-Tree中實現(xiàn)RCU鎖,該鎖能允許一塊數(shù)據(jù)能夠被一個寫和多個 讀同時訪問,因而在讀命令處理時,不需要考慮讀跟寫同時訪問的情況,只需考慮多個寫同 時訪問同一數(shù)據(jù)的情況,簡化了處理流程。采用本發(fā)明的方法和裝置,與現(xiàn)有技術相比,提高了查找效率,減小了數(shù)據(jù)競爭情況,提高了系統(tǒng)的并發(fā)處理能力,有效支持了預取的實現(xiàn),能夠更加有效利用系統(tǒng)的資源, 提高系統(tǒng)的整體性能。本發(fā)明還提供了用于RAID的讀取系統(tǒng)的實施例,其適用于上述實施例中描述的 用于RAID的讀取方法。圖8是根據(jù)本發(fā)明實施例的用于RAID的讀取系統(tǒng)的示意圖,如圖 8所示,用于RAID的讀取系統(tǒng)包括命令處理模塊802,用于接收讀取命令;讀出模塊804, 用于從緩存空間中讀出上述讀取命令要訪問的數(shù)據(jù);預取模塊806,用于在判斷所訪問的 地址設置有異步預取標志時,按照異步預取長度進行異步預取,并調整上述異步預取長度。優(yōu)選的,上述預取模塊806還用于在上述緩存空間中沒有上述讀取命令要訪問的 數(shù)據(jù)時,按照同步預取長度進行同步預取,并調整上述當前的同步預取長度。優(yōu)選的,在本實施例中,在預取完成一定時間后,檢查本次預取的結果。根據(jù)檢查 的結果,調整當前的異步預取長度,其具體包括1)若當前讀取出來的數(shù)據(jù)沒有被訪問時,則減少異步預取長度p,清除異步預取 設置的異步預取標志。通過減少下次預取數(shù)據(jù)的長度以及清除下次異步預取的標志,可以 避免不必要的讀取操作,節(jié)省空間,提高空間利用率。2)若當前訪問的地址中的數(shù)據(jù)正在從RAID讀取當中,則增加所述異步預取觸發(fā) 長度或者調整異步預取標志g的大小(這里,異步預取標志g指的是異步觸發(fā)頁面離頁面 集中的最后一個頁面的長度),例如,增大當前的異步觸發(fā)標志g的值。因為此時需要等待 從磁盤中將用戶需要的數(shù)據(jù)讀取到緩存空間中,在這種情況下,增大當前的異步觸發(fā)標志g 的值,提前進行預取,使得縮短等待的時間,提高了讀取效率。3)若在本次預取過程中,如果當前預取的數(shù)據(jù)有被訪問過或者在還沒有檢查結果 時當前預取的最后一個數(shù)據(jù)有被訪問過,那么增大異步預取的長度。這樣說明當前需要更 加積極的預取策略,增大預取長度,提高預取效率。優(yōu)選的,在本實施例中,在預取完成一定時間后,檢查本次預取的結果。根據(jù)檢查 的結果,調整當前的同步預取長度,其具體包括1)若當前同步預取訪問出來的數(shù)據(jù)并沒有被訪問,則減小當前的同步預取長度。 如果當前同步預取還設置了異步預取的標識,則清除異步預取的標識。這樣,避免不必要的 預取,可以節(jié)省空間,提高空間利用率。2)當前訪問的數(shù)據(jù)預取出來以后,自動增加同步預取的長度。如果同步預取的長 度達到異步預取的閾值,設置異步預取的標識。優(yōu)選的,在本實施例中,按照當前的異步預取長度進行異步預取包括1)從磁盤中預取具有第一長度的數(shù)據(jù),其中,第一長度為調整前的異步預取長度 與讀取命令所需訪問的但未命中的地址的個數(shù)之和;2)在緩存空間中確定上次讀取的最后一個地址;3)從所確定的地址的下一個地址開始讀取第一長度的數(shù)據(jù)。優(yōu)選的,在本實施例中,按照當前的同步預取長度進行同步預取包括1)從磁盤中預取具有第二長度的數(shù)據(jù),其中,所述第二長度為調整前的同步預取 長度與讀取命令所需訪問的但未命中的地址的個數(shù)之和;2)在所述緩存空間中確定上次讀取的最后一個地址;3)從所確定的地址的下一個地址開始讀取上次讀取的最后一個地址。
本發(fā)明實施例具有以下有益效果1)通過動態(tài)調整同步預取和異步預取的長度,使得預取更加符合系統(tǒng)運行的實際 情況,盡量避免了用戶需要的數(shù)據(jù)還沒有從磁盤中讀取到緩存空間中、或者,已經(jīng)從磁盤中 預讀到緩存空間中的數(shù)據(jù)并沒有被訪問到等問題,有效地提高cache空間的利用率,縮短 讀取的時間,提高讀取的效率。2)在同時調整異步預取長度和同步預取長度,增加了對控制的靈活性。3)通過CACHE系統(tǒng)的實現(xiàn),緩存最近訪問的數(shù)據(jù),提高整個系統(tǒng)的性能。顯然,本領域的技術人員應該明白,上述的本發(fā)明的各模塊或各步驟可以用通用 的計算裝置來實現(xiàn),它們可以集中在單個的計算裝置上,或者分布在多個計算裝置所組成 的網(wǎng)絡上,可選地,它們可以用計算裝置可執(zhí)行的程序代碼來實現(xiàn),從而,可以將它們存儲 在存儲裝置中由計算裝置來執(zhí)行,并且在某些情況下,可以以不同于此處的順序執(zhí)行所示 出或描述的步驟,或者將它們分別制作成各個集成電路模塊,或者將它們中的多個模塊或 步驟制作成單個集成電路模塊來實現(xiàn)。這樣,本發(fā)明不限制于任何特定的硬件和軟件結合。以上所述僅為本發(fā)明的優(yōu)選實施例而已,并不用于限制本發(fā)明,對于本領域的技 術人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內,所作的任何修 改、等同替換、改進等,均應包含在本發(fā)明的保護范圍之內。
權利要求
一種用于磁盤陣列RAID的讀取方法,其特征在于,包括接收讀取命令;從緩存空間中讀出所述讀取命令要訪問的數(shù)據(jù);判斷所訪問的地址是否設置異步預取標志;若是,則按照異步預取長度進行異步預取,并調整所述異步預取長度。
2.根據(jù)權利要求1所述的方法,其特征在于,調整所述異步預取長度時,所述方法還包 括調整同步預取長度。
3.根據(jù)權利要求1所述的方法,其特征在于,調整所述異步預取長度包括若當前讀取出來的數(shù)據(jù)沒有被訪問,則減少異步預取長度,并清除所述異步預取標志;若當前訪問的地址中的數(shù)據(jù)正在從RAID讀取的過程中,則增加所述異步預取觸發(fā)長 度或者調整異步預取標志的大??;若在按照異步預取長度進行異步預取的過程中,如果當前預取的數(shù)據(jù)有被訪問過或者 在還沒有檢查結果時當前預取的最后一個數(shù)據(jù)有被訪問過,則增加所述異步預取長度。
4.根據(jù)權利要求1所述的方法,其特征在于,按照異步預取長度進行異步預取包括 從磁盤中預取具有第一長度的數(shù)據(jù),其中,所述第一長度為調整前的異步預取長度與所述讀取命令所需訪問的但未命中的地址的個數(shù)之和; 在所述緩存空間中確定上次讀取的最后一個地址; 從所確定的地址的下一個地址開始讀取所述第一長度的數(shù)據(jù)。
5.根據(jù)權利要求1所述的方法,其特征在于,所述緩存空間中沒有所述讀取命令要訪 問的數(shù)據(jù),所述方法還包括按照同步預取長度進行同步預?。?調整所述同步預取長度。
6.根據(jù)權利要求5所述的方法,其特征在于,調整所述同步預取長度時,所述方法還包 括調整異步預取長度。
7.根據(jù)權利要求2或5所述的方法,其特征在于,調整所述同步預取長度包括 若當前同步預取出來的數(shù)據(jù)并沒有被訪問,則減小所述同步預取長度;或者 在當前訪問的數(shù)據(jù)預取出來之后,增加所述同步預取長度。
8.根據(jù)權利要求5所述的方法,其特征在于,按照同步預取長度進行同步預取包括 從磁盤中預取具有第二長度的數(shù)據(jù),其中,所述第二長度為調整前的同步預取長度與所述讀取命令所需訪問的但未命中的地址的個數(shù)之和; 在所述緩存空間中確定上次讀取的最后一個地址; 從所確定的地址的下一個地址開始讀取所述第二長度的數(shù)據(jù)。
9.一種用于RAID的讀取系統(tǒng),其特征在于,包括 命令處理模塊,用于接收讀取命令;讀出模塊,用于從緩存空間中讀出所述讀取命令要訪問的數(shù)據(jù); 預取模塊,用于在判斷所訪問的地址設置有異步預取標志時,按照異步預取長度進行 異步預取,并調整所述異步預取長度。
10.根據(jù)權利要求9所述的系統(tǒng),其特征在于,所述預取模塊還用于在所述緩存空間中 沒有所述讀取命令要訪問的數(shù)據(jù)時,按照同步預取長度進行同步預取,并調整所述當前的 同步預取長度。
全文摘要
本發(fā)明公開了一種用于RAID的讀取方法和系統(tǒng),其中,用于RAID的讀取方法包括接收讀取命令;從緩存空間中讀出上述讀取命令要訪問的數(shù)據(jù);判斷所訪問的地址是否設置異步預取標志;若是,則按照異步預取長度進行異步預取,并調整上述異步預取長度。本發(fā)明通過動態(tài)調整異步預取的長度,使得預取更加符合系統(tǒng)運行的實際情況,解決了現(xiàn)有技術中的讀取時間較長的問題,從而縮短讀取的時間,提高讀取的效率。
文檔編號G06F12/08GK101853218SQ20101018339
公開日2010年10月6日 申請日期2010年5月12日 優(yōu)先權日2010年5月12日
發(fā)明者周洋, 顏欽華 申請人:中興通訊股份有限公司