本發(fā)明涉及存儲系統(tǒng)領(lǐng)域,尤其涉及一種面向讀寫數(shù)據(jù)流的閃存數(shù)據(jù)分布方法。
背景技術(shù):
數(shù)據(jù)寫入模式包括覆蓋寫模式和追加寫模式,如圖1所示,覆蓋寫模式(圖1左側(cè))是對數(shù)據(jù)進(jìn)行更新操作時,更新內(nèi)容“b”寫入已經(jīng)被寫入“a”的存儲塊中。追加寫模式(圖1右側(cè))是對已經(jīng)寫入的數(shù)據(jù)“a”進(jìn)行更新操作時,為更新數(shù)據(jù)“b”重新分配存儲塊,更新內(nèi)容寫入新分配的存儲塊中。
flash閃存介質(zhì)在寫入數(shù)據(jù)的過程中,允許編程值從“1”到“0”,而不允許從“0”到“1”,因此,如果想實現(xiàn)閃存介質(zhì)編程值返回到“1”,需要首先進(jìn)行擦除操作。在flash閃存介質(zhì)的擦除過程中,屬于被擦除范圍的數(shù)據(jù)無法訪問。此外,flash閃存介質(zhì)的擦除/寫入周期數(shù)是有限的,頻繁的擦除-寫入過程會加速閃存介質(zhì)的磨損。
以常見的nand閃存顆粒為例,nand閃存顆粒由page(頁)組成,page(頁)是nand閃存顆粒讀寫的最小單元。多個連續(xù)page(頁)構(gòu)成一個block(塊),block(塊)是擦除的最小單元。當(dāng)nand閃存顆粒被寫入一個page(頁)時,先進(jìn)行page(頁)所在block(塊)的擦除操作,擦除成功后,再進(jìn)行page(頁)的寫入操作。擦除過程中,整個block(塊)將阻塞所有對block(塊)內(nèi)部page(頁)的訪問請求。nand閃存顆粒的讀操作最快,在20us左右;寫操作慢于讀操作,在200us左右;擦除操作最慢,在1ms左右的數(shù)量級?;趎and閃存顆粒的存儲設(shè)備通常會為使用者提供修剪(trim)命令,用于告知閃存設(shè)備某些數(shù)據(jù)塊的數(shù)據(jù)已經(jīng)無效,可以回收數(shù)據(jù)塊。存儲設(shè)備會在后臺背景下對無效數(shù)據(jù)塊集中進(jìn)行擦除,然后再投入使用。
由此可知,對于采用nand閃存介質(zhì)的固態(tài)硬盤(ssd):
一次寫大數(shù)據(jù)塊比多次寫小數(shù)據(jù)塊的性能要好,因為一次寫大塊的寫前擦除次數(shù)最少。追加寫比覆蓋寫的性能要好,追加寫產(chǎn)生的寫前擦除次數(shù)最少。但是追加寫的過程中,會產(chǎn)生無效數(shù)據(jù),占用ssd使用空間。沿著ssd設(shè)備的邏輯尋址空間順序追加寫ssd比隨機式追加寫ssd,在空間利用率上要好,因為順序式追加寫的無效數(shù)據(jù)塊更集中,有利于回收更加“聚合”的大數(shù)據(jù)塊。順序式追加寫大塊數(shù)據(jù)是對ssd最友好的寫入模式。
在順序追加寫ssd的過程中,會產(chǎn)生許多無效數(shù)據(jù)。可以將已經(jīng)確認(rèn)的無效數(shù)據(jù)塊集中進(jìn)行修剪(trim)操作,由存儲設(shè)備進(jìn)行后臺回收擦除。這樣,一方面保證ssd有足夠的空閑數(shù)據(jù)塊循環(huán)使用;另一方面,在循環(huán)使用一個數(shù)據(jù)塊時,數(shù)據(jù)塊就已經(jīng)是全1的狀態(tài),盡可能的避免寫時同步擦除,最終可以提高性能。
ext系列是經(jīng)典的linux磁盤塊設(shè)備文件系統(tǒng),也是當(dāng)前最主流的linux塊設(shè)備文件系統(tǒng)。磁盤設(shè)備利用磁頭的機械移動進(jìn)行尋址,當(dāng)磁頭尋訪到對應(yīng)的磁道以后,停止移動,此后利用盤片的高速轉(zhuǎn)動進(jìn)行數(shù)據(jù)讀寫傳輸。因此,在讀寫過程中,磁頭的尋址占用了大比重的時間。磁盤設(shè)備的順序?qū)ぶ吩L問性能較高,隨機訪問性能極差,這也是由于隨機訪問產(chǎn)生了大量磁頭物理尋址造成的。磁盤設(shè)備的寫入過程沒有寫前擦除的限制,因此可以進(jìn)行反復(fù)的覆蓋寫。因此,ext系統(tǒng)采用了按數(shù)據(jù)類型分布的方案,元數(shù)據(jù)集中存放在元數(shù)據(jù)區(qū)域,數(shù)據(jù)集中存放在數(shù)據(jù)區(qū)域。元數(shù)據(jù)的訪問集中在元數(shù)據(jù)區(qū)域小范圍內(nèi)尋址,數(shù)據(jù)訪問集中在數(shù)據(jù)區(qū)域小范圍內(nèi)尋址。同時,ext系列文件系統(tǒng)采用覆蓋寫的方式實現(xiàn)對文件的寫訪問,盡可能的減少尋址浪費。
技術(shù)實現(xiàn)要素:
現(xiàn)有的linux塊設(shè)備文件系統(tǒng),在數(shù)據(jù)分布上采用按數(shù)據(jù)類型分布的方案。元數(shù)據(jù)存放在元數(shù)據(jù)區(qū)域,數(shù)據(jù)存放在數(shù)據(jù)區(qū)域,盡可能的避免一次訪問內(nèi)的大范圍尋址。因此,這種方案需要覆蓋寫的支持。
ssd是不同于磁盤的存儲介質(zhì):ssd設(shè)備的隨機訪問性能高,不存在尋址的問題;ssd需要寫前擦除,不利于小寫(單次寫的數(shù)據(jù)量較小),不利于覆蓋寫。
采用覆蓋寫進(jìn)行ssd訪問,將會放大ssd寫前擦除的負(fù)面影響。在并發(fā)寫應(yīng)用場景中,會產(chǎn)生一個擦除塊內(nèi)的寫寫沖突,原本沒有數(shù)據(jù)相關(guān)性的寫寫操作,會因為物理位置的相鄰性,導(dǎo)致可以并發(fā)執(zhí)行的操作被寫前擦除串行化,最終影響并發(fā)寫性能。在大量隨機小寫的場景中,每一次小寫都會產(chǎn)生一次寫前擦除,放大了ssd寫前擦除的負(fù)面影響。在并發(fā)讀寫的過程中,一個擦除塊內(nèi)的讀寫會產(chǎn)生碰撞,如果讀請求先于寫請求到達(dá),則讀請求阻塞寫請求,如果寫請求先于讀請求達(dá)到,則寫請求的擦除操作會阻塞讀請求。這樣,原本沒有數(shù)據(jù)相關(guān)性的讀寫操作,會因為物理位置的相鄰性,導(dǎo)致可以并發(fā)執(zhí)行的操作串行化,最終影響讀寫性能。
因此,現(xiàn)有的linux塊設(shè)備文件系統(tǒng)沒有有效解決ssd設(shè)備寫前擦除的問題,也沒有充分利用ssd隨機讀高性能的優(yōu)勢。
根據(jù)本發(fā)明的一個方面,提供了一種數(shù)據(jù)寫入方法,所述方法包括:將數(shù)據(jù)寫入緩沖區(qū),向?qū)懻埱蟀l(fā)出方應(yīng)答寫入成功;將緩沖區(qū)中的數(shù)據(jù)聚合成指定大小的數(shù)據(jù)集;以及將數(shù)據(jù)集順序?qū)懭牖顒哟鎯ο蟆?/p>
根據(jù)本發(fā)明的一個實施方式,進(jìn)一步包括:接收寫請求。
根據(jù)本發(fā)明的一個實施方式,其中,由第一線程組執(zhí)行所述將緩沖區(qū)中的數(shù)據(jù)聚合成指定大小的數(shù)據(jù)集緩沖區(qū),以及將數(shù)據(jù)集順序?qū)懭氪鎯ο蟮牟僮鳌?/p>
根據(jù)本發(fā)明的一個實施方式,其中,所述第一線程組包括多個線程,每個線程綁定一個獨立的cpu核,使得每個線程執(zhí)行所述操作時不會被其他線程搶占其cpu資源。
根據(jù)本發(fā)明的一個實施方式,其中,任一時刻有且僅有一個活動存儲對象。
根據(jù)本發(fā)明的一個實施方式,其中,活動存儲對象被寫滿后,將活動存儲對象設(shè)為只讀的存儲對象。
根據(jù)本發(fā)明的一個實施方式,還包括,活動存儲對象被寫滿后,創(chuàng)建新的活動存儲對象。
根據(jù)本發(fā)明的一個實施方式,其中,第一線程組中包括第一線程與第二線程,第一線程獲得活動存儲對象使用權(quán)后,向活動存儲對象寫入數(shù)據(jù),釋放活動存儲對象使用權(quán);第二線程獲得活動存儲對象使用權(quán)后,向活動存儲對象寫入數(shù)據(jù),釋放活動存儲對象使用權(quán)。
根據(jù)本發(fā)明的一個實施方式,其中,存儲系統(tǒng)中存在多個活動存儲對象;第一線程組中包括第一線程與第二線程,第一線程將數(shù)據(jù)集寫入一個或多個第一活動存儲對象,第二線程將數(shù)據(jù)集寫入一個或多個第二活動存儲對象。
根據(jù)本發(fā)明的一個實施方式,其中,所述一個或多個第一活動存儲對象僅由第一線程寫入數(shù)據(jù),所述一個或多個第二活動存儲對象僅由第二線程寫入數(shù)據(jù)。
根據(jù)本發(fā)明的一個實施方式,其中,寫請求同邏輯設(shè)備相關(guān)聯(lián),將訪問相同邏輯設(shè)備的多個寫請求寫入同一個的活動存儲對象,使得訪問不同的邏輯設(shè)備的兩個寫請求不會被寫入相同的活動存儲對象。
根據(jù)本發(fā)明的一個實施方式,其中,第一線程組中包括第一線程與第二線程,第一線程維護(hù)一個或多個第一活動存儲對象,第二線程維護(hù)一個或多個第二活動存儲對象;寫請求來自多個邏輯設(shè)備,第一線程將來自第一邏輯設(shè)備的數(shù)據(jù)聚合成第一數(shù)據(jù)集,并寫入第一活動存儲對象,第二線程將來自第二邏輯設(shè)備的數(shù)據(jù)聚合成第二數(shù)據(jù)集,并寫入第二活動存儲對象。
根據(jù)本發(fā)明的一個實施方式,其中,存在多個活動存儲對象,第一多個活動存儲對象用于存儲冷數(shù)據(jù),第二活動存儲對象用于存儲熱數(shù)據(jù);在接收到寫請求時,基于所寫入數(shù)據(jù)的特點,將數(shù)據(jù)寫入第一多個活動存儲對象或第二多個活動存儲對象。
根據(jù)本發(fā)明的一個實施方式,其中,將數(shù)據(jù)集寫入活動存儲對象的第一條帶,并將第一條帶設(shè)為只讀。
根據(jù)本發(fā)明的一個實施方式,進(jìn)一步包括:接收修剪請求,將修剪請求所指定的存儲對象設(shè)置為空或?qū)⑿藜粽埱笾付ǖ拇鎯ο蟮拇鎯Y源歸還到存儲池。
根據(jù)本發(fā)明的第二方面,還提供了一種數(shù)據(jù)寫入設(shè)備,所述設(shè)備包括:用于將數(shù)據(jù)寫入緩沖區(qū),向?qū)懻埱蟀l(fā)出方應(yīng)答寫入成功的裝置;用于將緩沖區(qū)中的數(shù)據(jù)聚合成指定大小的數(shù)據(jù)集的裝置;以及用于將數(shù)據(jù)集順序?qū)懭牖顒哟鎯ο蟮难b置。
根據(jù)本發(fā)明的第三方面,還提供了一種io請求處理方法,所述方法包括:接收讀請求,所述讀請求將讀取第一數(shù)據(jù),若所述第一數(shù)據(jù)尚未被分配存儲對象,從緩沖區(qū)中獲取第一數(shù)據(jù);若已經(jīng)為所述第一數(shù)據(jù)分配存儲對象,存儲對象是活動狀態(tài),但第一數(shù)據(jù)尚未完成持久化,則從緩沖區(qū)中獲取第一數(shù)據(jù);若已經(jīng)為所述第一數(shù)據(jù)分配存儲對象,存儲對象是活動狀態(tài),且已經(jīng)對第一數(shù)據(jù)完成持久化,從為第一數(shù)據(jù)分配的存儲對象中獲取第一數(shù)據(jù);若已經(jīng)為第一數(shù)據(jù)分配存儲對象,且存儲對象是只讀狀態(tài),從為第一數(shù)據(jù)分配的存儲對象中獲取第一數(shù)據(jù)。
根據(jù)本發(fā)明的第三方面的一個實施方式,進(jìn)一步包括:根據(jù)本發(fā)明第一方面所述的數(shù)據(jù)寫入方法。
根據(jù)本發(fā)明的第四方面,還提供了一種io請求處理設(shè)備,所述設(shè)備包括:用于接收讀請求,所述讀請求將讀取第一數(shù)據(jù)的裝置,若所述第一數(shù)據(jù)尚未被分配存儲對象,從緩沖區(qū)中獲取第一數(shù)據(jù);若已經(jīng)為所述第一數(shù)據(jù)分配存儲對象,存儲對象是活動狀態(tài),但第一數(shù)據(jù)尚未完成持久化,則從緩沖區(qū)中獲取第一數(shù)據(jù);若已經(jīng)為所述第一數(shù)據(jù)分配存儲對象,存儲對象是活動狀態(tài),且已經(jīng)對第一數(shù)據(jù)完成持久化,從為第一數(shù)據(jù)分配的存儲對象中獲取第一數(shù)據(jù);若已經(jīng)為第一數(shù)據(jù)分配存儲對象,且存儲對象是只讀狀態(tài),從為第一數(shù)據(jù)分配的存儲對象中獲取第一數(shù)據(jù)。
根據(jù)本發(fā)明的第五方面,還提供了一種處理讀寫請求的方法,所述方法包括:接收寫請求;將寫請求的數(shù)據(jù)寫入緩沖區(qū),向?qū)懻埱蟀l(fā)出方應(yīng)答寫請求完成;將寫請求對應(yīng)的數(shù)據(jù)寫入活動存儲對象;接收讀請求,所述讀請求要讀取第一數(shù)據(jù),判斷已經(jīng)為第一數(shù)據(jù)分配存儲對象,且存儲對象是只讀狀態(tài),則從為第一數(shù)據(jù)分配的只讀存儲對象獲取第一數(shù)據(jù)。
根據(jù)本發(fā)明的第六方面,還提供了一種處理讀寫請求的設(shè)備,所述設(shè)備包括:用于接收寫請求的裝置;用于將寫請求的數(shù)據(jù)寫入緩沖區(qū),向?qū)懻埱蟀l(fā)出方應(yīng)答寫請求完成的裝置;用于將寫請求對應(yīng)的數(shù)據(jù)寫入活動存儲對象的裝置;用于接收讀請求,所述讀請求要讀取第一數(shù)據(jù)的裝置,判斷已經(jīng)為第一數(shù)據(jù)分配存儲對象,且存儲對象是只讀狀態(tài),則從為第一數(shù)據(jù)分配的只讀存儲對象獲取第一數(shù)據(jù)。
根據(jù)本發(fā)明的第七方面,提供一種包含計算機程序代碼的計算機程序,當(dāng)被載入計算機系統(tǒng)并在計算機系統(tǒng)上執(zhí)行時,所述計算機程序代碼使所述計算機系統(tǒng)執(zhí)行根據(jù)本發(fā)明第一方面提供的數(shù)據(jù)寫入方法或者根據(jù)本發(fā)明第三方面提供的io請求處理方法或者本發(fā)明第五方面提供的處理讀寫請求的方法。
根據(jù)本發(fā)明的第八方面,提供一種包括程序代碼的程序,當(dāng)被載入存儲設(shè)備并在存儲設(shè)備上執(zhí)行時,所述計程序代碼使所述存儲設(shè)備執(zhí)行根據(jù)本發(fā)明第一方面提供的數(shù)據(jù)寫入方法或者根據(jù)本發(fā)明第三方面提供的io請求處理方法或者本發(fā)明第五方面提供的處理讀寫請求的方法。
本發(fā)明所述方法克服了現(xiàn)有l(wèi)inux塊設(shè)備文件系統(tǒng)的如下缺點:
現(xiàn)有l(wèi)inux塊設(shè)備文件系統(tǒng),會導(dǎo)致ssd單個擦除塊內(nèi)的并發(fā)寫請求產(chǎn)生多次寫前擦除,使得并發(fā)寫請求被阻塞串行化,嚴(yán)重影響寫性能,多次寫前擦除還會影響ssd設(shè)備使用壽命;
現(xiàn)有l(wèi)inux塊設(shè)備文件系統(tǒng),會導(dǎo)致ssd單個擦除塊內(nèi)的覆蓋寫請求產(chǎn)生多次寫前擦除,嚴(yán)重影響寫性能,多次寫前擦除還會影響ssd設(shè)備使用壽命;
現(xiàn)有l(wèi)inux塊設(shè)備文件系統(tǒng),會導(dǎo)致ssd單個擦除塊內(nèi)的并發(fā)讀寫請求阻塞串行化,嚴(yán)重影響讀寫并發(fā)性能。
本方面所述方法達(dá)到了如下效果:
并發(fā)寫寫數(shù)據(jù)最大合并,寫前擦除次數(shù)降低,減小寫前擦除的性能負(fù)面影響和壽命負(fù)面影響;
覆蓋寫數(shù)據(jù)流轉(zhuǎn)順序追加寫,寫前擦除次數(shù)降低,減小寫前擦除的性能負(fù)面影響和壽命負(fù)面影響;
讀寫數(shù)據(jù)流徹底分離,讀寫數(shù)據(jù)請求徹底并行化,充分發(fā)揮ssd隨機讀的高性能。
附圖說明
通過閱讀下文優(yōu)選實施方式的詳細(xì)描述,各種其他的優(yōu)點和益處對于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認(rèn)為是對本發(fā)明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。其中在附圖中,參考數(shù)字之后的字母標(biāo)記指示多個相同的部件,當(dāng)泛指這些部件時,將省略其最后的字母標(biāo)記。在附圖中:
圖1示出了現(xiàn)有技術(shù)中的數(shù)據(jù)寫入模式的示意圖;
圖2示出了根據(jù)本發(fā)明的一個實施方式的存儲資源組織的結(jié)構(gòu)示意圖;
圖3示出了根據(jù)本發(fā)明的一個實施方式的容器的狀態(tài)轉(zhuǎn)換示意圖;
圖4示出了根據(jù)本發(fā)明的一個實施方式的數(shù)據(jù)寫入方法的流程示意圖;
圖5示出了根據(jù)本發(fā)明的一個實施方式的數(shù)據(jù)寫入方法的示意圖;
圖6示出了根據(jù)本發(fā)明的另一個實施方式的數(shù)據(jù)寫入方法的示意圖;
圖7示出了根據(jù)本發(fā)明的依然另一個實施方式的數(shù)據(jù)寫入方法的示意圖;
圖8示出了根據(jù)本發(fā)明的又一個實施方式的數(shù)據(jù)寫入方法的示意圖;
圖9示出了根據(jù)本發(fā)明的依然另一個實施方式的數(shù)據(jù)寫入方法的示意圖;
圖10示出了根據(jù)本發(fā)明的一個實施方式的數(shù)據(jù)寫入設(shè)備的結(jié)構(gòu)示意圖;
圖11示出了根據(jù)本發(fā)明的一個實施方式的io請求處理方法的示意圖;
圖12示出了根據(jù)本發(fā)明的一個實施方式的io請求處理方法的流程圖;以及
圖13示出了根據(jù)本發(fā)明的另一個實施方式的處理讀寫請求的方法的流程示意圖。
在附圖中,使用相同或類似的標(biāo)號來指代相同或類似的元素。
具體實施方式
下面結(jié)合附圖和具體的實施方式對本發(fā)明作進(jìn)一步的描述。
圖2示出了根據(jù)本發(fā)明的一個實施方式的存儲資源組織的結(jié)構(gòu)示意圖。
如圖2所示,容器是對ssd存儲設(shè)備的存儲空間部分的基本抽象。一個容器是一個帶有raid功能的ssd存儲單元。容器可以包含n個raid條帶,每個raid條帶由來自不同ssd的m個數(shù)據(jù)塊構(gòu)成(參看圖2,m=4)。為了充分發(fā)揮多塊ssd的并發(fā)性能,容器一次寫入的最小單位是一個條帶。容器的讀操作沒有大小限制。在單ssd模式下,容器可以退化成只包含一個條帶,一個條帶內(nèi)一個數(shù)據(jù)塊。
raid條帶是ssd順序?qū)懭氲淖钚挝?。利用順序?qū)懭氲膯蜗蛐裕蛛x讀寫請求,隔離讀寫請求的相互影響;利用ssd對順序?qū)懭氲挠押眯?,盡可能減小ssd寫前擦除的影響,最終使得系統(tǒng)中的擦除操作次數(shù)與寫請求次數(shù)無關(guān),只與寫入數(shù)據(jù)量正相關(guān)。
圖3示出了根據(jù)本發(fā)明的一個實施方式的容器四種狀態(tài)及其轉(zhuǎn)換的示意圖。
如圖3所示,容器包括四個狀態(tài),四個狀態(tài)為空(empty)狀態(tài)、活動(active)狀態(tài)、只讀(sealed)狀態(tài)和無效(invalid)狀態(tài)。
當(dāng)容器為空(empty)狀態(tài)時,容器不包含任何數(shù)據(jù),可以投入使用。
當(dāng)容器為活動(active)狀態(tài)時,容器包含部分?jǐn)?shù)據(jù),容器可讀可寫。其中,已經(jīng)在ssd上持久化的包含數(shù)據(jù)的條帶只讀;尚未持久化的不包含數(shù)據(jù)的條帶可寫。持久化指已經(jīng)將數(shù)據(jù)寫入ssd。
當(dāng)容器為只讀(sealed)狀態(tài)時,容器所有的條帶都已經(jīng)寫滿數(shù)據(jù)、且持久化成功,容器只讀。
當(dāng)容器為無效(invalid)狀態(tài),此時容器所有的條帶的數(shù)據(jù)都無效,通過對容器進(jìn)行一次集中的修剪(trim)操作,容器中的存儲資源將被全部釋放。在可選的實施例中,無效(invalid)容器的資源直接歸還ssd存儲資源池,益處是整體過程統(tǒng)一,實現(xiàn)簡單。在另一個可選的實施例中,將無效(invalid)容器直接變成空(empty)容器,循環(huán)投入使用,在容器使用頻繁的場景中,此實施例會有比較好的性能。在又一個可選的實施例中,存儲系統(tǒng)中維持一定數(shù)量的空(empty)容器供快速使用,剩余的無效(invalid)容器被修剪(trim)后,原屬于該容器的全部條帶資源直接被歸還到ssd存儲資源池中。
當(dāng)一個容器創(chuàng)建成功后,容器進(jìn)入空(empty)狀態(tài)。當(dāng)用戶的寫數(shù)據(jù)流到達(dá)時,為數(shù)據(jù)流分配容器,數(shù)據(jù)流寫入容器,此時,容器狀態(tài)轉(zhuǎn)為活動(active)狀態(tài)。當(dāng)用戶的數(shù)據(jù)流寫滿容器的全部存儲單元時,容器狀態(tài)轉(zhuǎn)為只讀(sealed)狀態(tài)。只讀(sealed)容器只接受讀訪問,不接受寫訪問。因此,對于只讀(sealed)容器區(qū)間內(nèi)的數(shù)據(jù)讀請求訪問將全部得到并行化執(zhí)行,因而讀請求能夠獲得最大性能支持。當(dāng)只讀(sealed)容器中的無效數(shù)據(jù)量超過一定程度時,容器中剩余的有效數(shù)據(jù)將被轉(zhuǎn)移至其他活動(active)容器或者空(empty)容器中,只讀(sealed)容器轉(zhuǎn)化為無效(invalid)容器。無效(invalid)容器經(jīng)過一次修剪(trim)擦除操作,重新轉(zhuǎn)化為空(empty)狀態(tài),循環(huán)投入使用。這樣,ssd設(shè)備的可持續(xù)使用得到良好的保證。
圖4示出了根據(jù)本發(fā)明的一個實施方式的數(shù)據(jù)寫入方法的流程示意圖。圖4所示的流程圖僅僅是示意性的,其中記載的步驟可以并行執(zhí)行、省略和/或增加其他步驟。圖5示出了根據(jù)本發(fā)明的一個實施方式的數(shù)據(jù)寫入方法的示意圖。
如圖4所示,數(shù)據(jù)寫入方法包括以下步驟:
步驟s4100:將數(shù)據(jù)寫入緩沖區(qū),向?qū)懻埱蟀l(fā)出方應(yīng)答寫入成功;
步驟s4200:將緩沖區(qū)中的數(shù)據(jù)聚合成指定大小的數(shù)據(jù)集;
步驟s4300:將數(shù)據(jù)集順序?qū)懭牖顒哟鎯ο蟆?/p>
如圖5所示,寫請求的處理過程分為兩個階段,第一階段由寫請求與緩沖區(qū)之間的箭頭表示;第二階段由線程與容器之間的箭頭表示。
結(jié)合圖4和圖5所示,在步驟s4100中,響應(yīng)寫請求,將數(shù)據(jù)寫到緩沖區(qū),向?qū)懻埱蟀l(fā)出方應(yīng)答寫入成功。在將數(shù)據(jù)寫入到容器前向?qū)懻埱蟀l(fā)出方應(yīng)答,降低了寫操作的響應(yīng)時間。進(jìn)一步的,為了保證緩沖區(qū)的安全性,緩沖區(qū)可以用非易失內(nèi)存設(shè)備nvdimm實現(xiàn)??蛇x的,寫請求的數(shù)量可以為一個,也可以為多個。
結(jié)合圖4和圖5所示,利用第一線程組來執(zhí)行步驟s4200和步驟s4300,第一線程組包括多個線程。優(yōu)選地,每個線程綁定一個獨立的cpu核,使得每個線程執(zhí)行上述操作時不會被其他線程搶占其cpu資源。
在一個例子中,第一線程組在后臺執(zhí)行,定期的從緩沖區(qū)中抓取數(shù)據(jù),抓取的這些數(shù)據(jù)可以來自多個寫請求。所抓取的數(shù)據(jù)構(gòu)成數(shù)據(jù)集(dataset)。如果一個數(shù)據(jù)集的大小等于容器條帶大小時,就可以為這個數(shù)據(jù)集分配容器并寫入所分配的容器。如果一個數(shù)據(jù)集的大小小于容器條帶大小時,暫時不能將這個數(shù)據(jù)集寫入容器,而等待來自更多寫請求的數(shù)據(jù)以組成完整的數(shù)據(jù)集。如果一個數(shù)據(jù)集的大小大于容器條帶大小時,則將等于條帶大小的數(shù)據(jù)集部分寫入容器,而將數(shù)據(jù)集的剩余部分寫入其他一個或多個容器條帶。
進(jìn)一步地,響應(yīng)于接收到修剪請求,將修剪請求所指定的存儲對象設(shè)置為空或?qū)⑿藜粽埱笾付ǖ拇鎯ο蟮拇鎯Y源歸還到存儲資源池。存儲資源池中記錄了各個ssd中尚未分配容器的數(shù)據(jù)塊或數(shù)據(jù)大塊。作為舉例,數(shù)據(jù)大塊是預(yù)定大小的邏輯空間或物理空間連續(xù)的多個數(shù)據(jù)塊。
由于不同類型的數(shù)據(jù)集可以根據(jù)不同的策略分配活動(active)容器,最終獲得不同的性能收益。下面通過具體的實施例來進(jìn)行說明。
實施例a
圖6示出了根據(jù)本發(fā)明的另一個實施方式的數(shù)據(jù)寫入方法的示意圖。
如圖6所示,響應(yīng)于接收到寫請求,將數(shù)據(jù)寫到緩沖區(qū),向?qū)懻埱蟀l(fā)出方應(yīng)答寫入成功。來自多個寫請求的數(shù)據(jù)都被寫入到緩沖區(qū)中。將緩沖區(qū)中的多個數(shù)據(jù)集混合寫入同一個容器,直至容器寫滿。
在圖6的實施例中,有線程601、線程602和線程603三個線程并發(fā)執(zhí)行,這三個線程同時提取緩沖區(qū)的數(shù)據(jù),所提取的數(shù)據(jù)構(gòu)成數(shù)據(jù)集611、數(shù)據(jù)集612與數(shù)據(jù)集613,并將數(shù)據(jù)集寫入到容器620。線程601從緩沖區(qū)的提取的數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)集611,線程602從緩沖區(qū)提取的數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)集612,以及線程603從緩沖區(qū)提取的數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)集613。
在圖6的實施例中,同一時刻存在且僅存在一個活動容器620。只要容器620沒有被寫滿,那么所有的線程即線程601、線程602和線程603三個線程都要往這個容器620里面寫數(shù)據(jù),直到容器620被寫滿為止。
為了保證正確性,線程往容器620里面寫數(shù)據(jù)時,需要先給容器620加鎖,獲得容器620的獨占使用權(quán),然后再訪問容器620,最后釋放鎖。例如,線程601獲得容器620的使用權(quán),將數(shù)據(jù)集611寫入到容器620,然后釋放容器620的使用權(quán);線程602獲得容器620的使用權(quán),將數(shù)據(jù)集612寫入到容器620,然后釋放容器620的使用權(quán);線程603獲得容器620的使用權(quán),將數(shù)據(jù)集613寫入到容器620,然后釋放容器620的使用權(quán)。需要理解的是,在多個例子中,線程601、線程602和線程603使用容器620的順序是隨機的。在圖6的例子中,并發(fā)的數(shù)據(jù)寫入操作,變成了串行的訪問。圖6的實施例可以最大程度的保證每個ssd的順序?qū)懭?。因此,每個ssd設(shè)備將收獲最友好的寫入性能,但是也引入多個線程對容器的內(nèi)存鎖競爭。
進(jìn)一步地,將線程601、線程602和線程603各自綁定到一個cpu或cpu核,從而線程601、線程602和線程603在執(zhí)行過程中不會被其他線程搶占cpu資源。在其他實施例中,提供不同數(shù)量的線程來處理從緩沖區(qū)提取數(shù)據(jù)并寫入到活動容器的操作。
實施例b
圖7示出了根據(jù)本發(fā)明的另一個實施方式的數(shù)據(jù)寫入方法的示意圖。
如圖7所示,響應(yīng)于接收到寫請求,將數(shù)據(jù)寫到緩沖區(qū),向?qū)懻埱蟀l(fā)出方應(yīng)答寫入成功。來自多個寫請求的數(shù)據(jù)都被寫入到緩沖區(qū)中。
在圖7的實施例中,有線程701、線程702和線程703三個線程并發(fā)執(zhí)行,這三個線程同時提取緩沖區(qū)的數(shù)據(jù),所提取的數(shù)據(jù)構(gòu)成數(shù)據(jù)集711、數(shù)據(jù)集712與數(shù)據(jù)集713,并將數(shù)據(jù)集寫入到活動容器721、活動容器722與活動容器723。線程701從緩沖區(qū)的提取的數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)集711,線程702從緩沖區(qū)提取的數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)集712,以及線程703從緩沖區(qū)提取的數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)集713。
在圖7的實施例中,存在三個活動容器,即容器721、容器722與容器723。每個線程將數(shù)據(jù)集寫入一個相對應(yīng)的活動(active)容器,不同線程之間的并發(fā)數(shù)據(jù)集寫入不同的活動(active)容器。線程701將一個或多個數(shù)據(jù)集711寫入到容器721,線程702將一個或多個數(shù)據(jù)集712寫入到容器722,線程703將一個或多個數(shù)據(jù)集713寫入到容器723。以此方式,多個線程之間不必為爭奪活動容器的使用權(quán)而頻繁請求鎖,能夠同時發(fā)出多個活動容器訪問請求,提高了io帶寬利用率。在實施例b中,一個活動(active)容器內(nèi)部的順序?qū)懩軌虻玫奖WC。
進(jìn)一步地,將線程701、線程702和線程703各自綁定到一個cpu或cpu核,從而線程701、線程702和線程703在執(zhí)行過程中不會被其他線程搶占cpu資源。在其他實施例中,提供不同數(shù)量的線程來處理從緩沖區(qū)提取數(shù)據(jù)并寫入到活動容器的操作。
實施例c
圖8示出了根據(jù)本發(fā)明的另一個實施方式的數(shù)據(jù)寫入方法的示意圖。
在圖8的實施例中,n塊ssd組成存儲池,從存儲池劃出m個不同的邏輯設(shè)備給用戶使用。邏輯設(shè)備可以由操作系統(tǒng)中的盤符或目錄指示,可以由邏輯分區(qū)或文件系統(tǒng)指示。用戶得到一個邏輯設(shè)備后,可以在這個邏輯設(shè)備上用不同的文件系統(tǒng)(例如ext4)進(jìn)行格式化,就像使用一塊磁盤一樣。
邏輯設(shè)備上的數(shù)據(jù)散落分布在多個ssd上。優(yōu)選地,通過多塊ssd提供副本,這樣可以保證可靠性;多塊ssd間也有raid的關(guān)系,可以提高性能與可靠性。
用戶發(fā)過來的寫請求里面包含了邏輯設(shè)備的標(biāo)識符。處理寫請求時,寫請求的數(shù)據(jù)和元數(shù)據(jù)(邏輯設(shè)備編號,邏輯設(shè)備偏移,數(shù)據(jù)塊長度等)一起寫入緩沖區(qū)。
在圖8的實施例中,有線程8010、線程8020和線程8030三個線程并發(fā)執(zhí)行,這三個線程同時提取緩沖區(qū)的數(shù)據(jù),所提取的數(shù)據(jù)構(gòu)成數(shù)據(jù)集,并將數(shù)據(jù)集寫入到活動容器8211、活動容器8221與活動容器8231。線程8010從緩沖區(qū)的提取的數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)集(8110,8111,8112),線程8020從緩沖區(qū)提取的數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)集(8120,8121),以及線程8030從緩沖區(qū)提取的數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)集(8130,8131)。
在圖8的實施例中,存在三個活動容器,即容器8211、容器8221與容器8231。每個線程將來自相同邏輯設(shè)備的數(shù)據(jù)集寫入一個同該邏輯設(shè)備相對應(yīng)的活動(active)容器,而來自不同邏輯設(shè)備數(shù)據(jù)集可以寫入不同的活動(active)容器。
參看圖8,由線程8010產(chǎn)生的數(shù)據(jù)集8110與由線程8020產(chǎn)生的數(shù)據(jù)集8120都來自對相同的邏輯設(shè)備(l1)的寫請求,因而數(shù)據(jù)集8110與數(shù)據(jù)集8120被寫入到活動容器8211。由線程8010產(chǎn)生的數(shù)據(jù)集8111、由線程8020產(chǎn)生的數(shù)據(jù)集8121與由線程8030產(chǎn)生的數(shù)據(jù)集8130都來自對相同的邏輯設(shè)備(l2)的寫請求,因而數(shù)據(jù)集8111、數(shù)據(jù)集8121與數(shù)據(jù)集8130被寫入到活動容器8221。由線程8010產(chǎn)生的數(shù)據(jù)集8112與由線程8030產(chǎn)生的數(shù)據(jù)集8131都來自對相同的邏輯設(shè)備(l3)的寫請求,因而數(shù)據(jù)集8112與數(shù)據(jù)集8131被寫入到活動容器8231。
在如圖8所示的實施例c中,來自相同邏輯設(shè)備的寫請求組成的數(shù)據(jù)集寫入同一個活動(active)容器。從而可以獲得最佳的數(shù)據(jù)局部性,良好的數(shù)據(jù)局部性可以減少后續(xù)讀請求的下發(fā)次數(shù),提高讀io帶寬利用率。因此,實施例c是一種對讀應(yīng)用場景優(yōu)化的寫模式。
在另一個實施例中,線程8010、線程8020和線程8030的每一個檢測緩沖區(qū)中的邏輯地址連續(xù)的寫請求,并將邏輯地址連續(xù)的寫請求構(gòu)成的多個數(shù)據(jù)集寫入到相同的活動容器。
實施例d
圖9示出了根據(jù)本發(fā)明的另一個實施方式的數(shù)據(jù)寫入方法的示意圖。
n塊ssd組成存儲池,從存儲池劃出m個不同的邏輯設(shè)備給用戶使用。邏輯設(shè)備可以由操作系統(tǒng)中的盤符或目錄指示,可以由邏輯分區(qū)或文件系統(tǒng)指示。在實施例d中,每個線程維護(hù)一組獨立的容器,一個容器屬于一個獨立的邏輯設(shè)備。使得線程之間沒有共享的容器,消除了關(guān)于容器的并發(fā)競爭。一個容器里包含的全部數(shù)據(jù)都來自一個邏輯設(shè)備,這就保證了容器上的數(shù)據(jù)局部性。當(dāng)線程獲取到一組寫請求后,一個數(shù)據(jù)集中的數(shù)據(jù)來自對應(yīng)于同一個邏輯設(shè)備的寫請求,并將該數(shù)據(jù)集寫入邏輯設(shè)備對應(yīng)的容器中。
在圖9的實施例中,有線程9010、線程9020和線程9030三個線程并發(fā)執(zhí)行,這三個線程同時提取緩沖區(qū)的數(shù)據(jù),所提取的數(shù)據(jù)構(gòu)成數(shù)據(jù)集,并將數(shù)據(jù)集寫入到活動容器。線程9010從緩沖區(qū)的提取的數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)集(9110,9111,9112),線程9020從緩沖區(qū)提取的數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)集(9120,9121),以及線程9030從緩沖區(qū)提取的數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)集(9130,9131)。
在圖9的實施例中,存在多個活動容器,即容器9211、容器9212容器9221、容器9222、容器9223、容器9231、容器9233等。每個線程將來自相同邏輯設(shè)備的數(shù)據(jù)集寫入一個同該邏輯設(shè)備相對應(yīng)且由該線程所獨占的活動(active)容器,而來自不同邏輯設(shè)備數(shù)據(jù)集可以寫入不同的活動(active)容器。
參看圖9,線程9010獨占容器9211、容器9221與容器9231,其他線程不會向為線程9010所獨占的活動容器寫入數(shù)據(jù)。由線程9010產(chǎn)生的數(shù)據(jù)集9110、數(shù)據(jù)集9111與數(shù)據(jù)集9112分別來自對邏輯設(shè)備(l11)、邏輯設(shè)備(l12)與邏輯設(shè)備(l13)的寫請求。線程9010基于數(shù)據(jù)集9110來自對邏輯設(shè)備(l11)的寫請求,而將數(shù)據(jù)集9110寫入活動容器9211;線程9010基于數(shù)據(jù)集9111來自對邏輯設(shè)備(l12)的寫請求,而將數(shù)據(jù)集9011寫入活動容器9221;線程9010基于數(shù)據(jù)集9112來自對邏輯設(shè)備(l13)的寫請求,而將數(shù)據(jù)集9012寫入活動容器9231。
線程9020基于數(shù)據(jù)集9120來自對邏輯設(shè)備(l21)的寫請求,而將數(shù)據(jù)集9120寫入活動容器9212;線程9020基于數(shù)據(jù)集9121來自對邏輯設(shè)備(l22)的寫請求,而將數(shù)據(jù)集9121寫入活動容器9222。
線程9030基于數(shù)據(jù)集9130來自對邏輯設(shè)備(l31)的寫請求,而將數(shù)據(jù)集9130寫入活動容器9223;線程9030基于數(shù)據(jù)集9131來自對邏輯設(shè)備(l32)的寫請求,而將數(shù)據(jù)集9131寫入活動容器9233。
在另一個例子中,來自相同邏輯設(shè)備的數(shù)據(jù)被并發(fā)寫入多個活動容器中,以充分利用ssd的并發(fā)處理能力,并保證多個線程之間沒有共享的容器,以消除關(guān)于容器的并發(fā)競爭。例如,線程9010基于數(shù)據(jù)集9110來自對邏輯設(shè)備(l1)的寫請求,而將數(shù)據(jù)集9110寫入活動容器9211;線程9010基于數(shù)據(jù)集9111來自對邏輯設(shè)備(l2)的寫請求,而將數(shù)據(jù)集9111寫入活動容器9221;線程9010基于數(shù)據(jù)集9112來自對邏輯設(shè)備(l3)的寫請求,而將數(shù)據(jù)集9112寫入活動容器9231。線程9020基于數(shù)據(jù)集9120來自對邏輯設(shè)備(l1)的寫請求,而將數(shù)據(jù)集9120寫入活動容器9212;線程9020基于數(shù)據(jù)集9121來自對邏輯設(shè)備(l2)的寫請求,而將數(shù)據(jù)集9121寫入活動容器9222。線程9030基于數(shù)據(jù)集9130來自對邏輯設(shè)備(l3)的寫請求,而將數(shù)據(jù)集9130寫入活動容器9223;線程9030基于數(shù)據(jù)集9131來自對邏輯設(shè)備(l3)的寫請求,而將數(shù)據(jù)集9131寫入活動容器9233。
在另一個實施例中,線程9010、線程9020和線程9030的每一個檢測緩沖區(qū)中的來自訪問相同邏輯設(shè)備的邏輯地址連續(xù)的寫請求,并將訪問相同邏輯設(shè)備的邏輯地址連續(xù)的寫請求構(gòu)成的多個數(shù)據(jù)集寫入到相同的活動容器。
在依然另一個實施例中,基于數(shù)據(jù)的特點選擇寫入數(shù)據(jù)的數(shù)據(jù)集。數(shù)據(jù)的熱度是數(shù)據(jù)特點之一。應(yīng)用對數(shù)據(jù)的訪問頻度是不均衡的,具有訪問局部性的特征。某個熱點數(shù)據(jù)可能被頻繁訪問,有些數(shù)據(jù)可能熱度較低,只是被偶爾訪問。當(dāng)然,冷熱數(shù)據(jù)的劃分不是絕對的,也要考慮時間變化的效應(yīng)。線程9010、線程9020和線程9030的每一個檢測緩沖區(qū)中的來自訪問相同邏輯設(shè)備的數(shù)據(jù)特點,并將訪問相同邏輯設(shè)備的將被頻繁訪問的邏輯地址的寫請求構(gòu)成的多個數(shù)據(jù)集寫入到相同的活動容器,以及將訪問相同邏輯設(shè)備的將被低頻訪問的邏輯地址的寫請求構(gòu)成的多個數(shù)據(jù)集寫入到相同的活動容器。從而,對于熱點數(shù)據(jù)集,可以選擇將數(shù)據(jù)寫入熱容器中。對于冷數(shù)據(jù)集,可以選擇將數(shù)據(jù)寫入冷容器中。一旦數(shù)據(jù)的熱度發(fā)生變化,冷數(shù)據(jù)可以選擇遷移至熱容器中,熱容器也可以因為數(shù)據(jù)訪問頻度的降低降級成冷容器中。
根據(jù)本發(fā)明的另一方面,還提供了一種數(shù)據(jù)寫入設(shè)備,如圖10所示,該設(shè)備包括:用于將數(shù)據(jù)寫入緩沖區(qū),向?qū)懻埱蟀l(fā)出方應(yīng)答寫入成功的裝置1010;用于將緩沖區(qū)中的數(shù)據(jù)聚合成指定大小的數(shù)據(jù)集的裝置1020;以及用于將數(shù)據(jù)集順序?qū)懭牖顒哟鎯ο蟮难b置1030。
圖11示出了根據(jù)本發(fā)明的另一個實施方式的io請求處理方法的示意圖。圖12示出了根據(jù)本發(fā)明的另一個實施方式的io請求處理方法的流程圖。
如前所述,當(dāng)諸如應(yīng)用程序的io請求發(fā)出方首次寫某個數(shù)據(jù)塊時,將數(shù)據(jù)塊先寫入緩沖區(qū),并向io請求發(fā)出方回復(fù)寫數(shù)據(jù)成功。此過程有利于對應(yīng)用寫請求的快速響應(yīng)。而后臺寫線程從內(nèi)存緩沖區(qū)中讀出數(shù)據(jù),為數(shù)據(jù)分配空(empty)容器(如圖3所示)或者活動(active)容器(如圖3所示)。一旦數(shù)據(jù)塊大小湊滿一個容器的條帶,后臺寫線程會對容器的條帶進(jìn)行持久化操作。持久化成功后,后臺寫線程清除內(nèi)存緩沖區(qū)的數(shù)據(jù)塊。
因而,在不同時間,被寫入的數(shù)據(jù)會存儲在不同的位置。在處理讀請求時,根據(jù)數(shù)據(jù)存儲位置的不同,選擇從以不同的方式獲取數(shù)據(jù)。一般而言,由dram等存儲介質(zhì)提供緩沖區(qū),而由ssd等存儲設(shè)備提供容器,dram的響應(yīng)讀請求的速度遠(yuǎn)高于ssd,因而,參看圖11,在緩沖區(qū)中有所讀取數(shù)據(jù)的副本時,優(yōu)先從緩沖區(qū)中獲取數(shù)據(jù)。當(dāng)待讀取數(shù)據(jù)位于緩沖區(qū)時,從緩沖區(qū)中獲取待讀取數(shù)據(jù),而當(dāng)待讀取數(shù)據(jù)已經(jīng)被寫入容器時,從容器中讀取待讀取數(shù)據(jù)。
如圖12所示,在接收到讀請求時,判斷待讀取數(shù)據(jù)的存儲位置(s1210);若待讀取數(shù)據(jù)尚未被分配容器,從緩沖區(qū)中獲取待讀取數(shù)據(jù)(s1220);若已經(jīng)為待讀取數(shù)據(jù)分配容器,且容器處于活動狀態(tài),但待讀取數(shù)據(jù)尚未完成持久化,則從緩沖區(qū)中獲取待讀取數(shù)據(jù)(s1230);若已經(jīng)為待讀取數(shù)據(jù)分配容器,且容器處于活動狀態(tài),且已經(jīng)對待讀取數(shù)據(jù)完成持久化,從為待讀取數(shù)據(jù)分配的容器中獲取待讀取數(shù)據(jù)(s1240);以及若已經(jīng)為待讀取數(shù)據(jù)分配容器,且容器處于只讀狀態(tài),從為所讀取分配的容器中獲取待讀取數(shù)據(jù)(s1250)。
結(jié)合圖11和圖12所示,在步驟s1220中,對于尚未分配活動(active)容器的數(shù)據(jù)集,讀請求將直接從數(shù)據(jù)緩沖區(qū)中獲取數(shù)據(jù)。在步驟s1230中,對于已經(jīng)分配活動(active)容器,但尚未被寫入容器的數(shù)據(jù)集,讀請求將直接從緩沖區(qū)中獲取數(shù)據(jù)。在步驟s1240中,對于已經(jīng)分配活動(active)容器,且已經(jīng)被寫入容器數(shù)據(jù)集,讀請求將被直接發(fā)送至ssd。此時,待讀取數(shù)據(jù)集所在容器的條帶為只讀條帶,讀過程中不會受到ssd擦除操作的影響,因此,讀請求可以獲得ssd設(shè)備的最大性能支持。在步驟s1250中,對于屬于只讀(sealed)容器的數(shù)據(jù)集,讀請求將被直接發(fā)送至ssd。此時,數(shù)據(jù)集所在的容器為只讀容器,讀過程中不會受到數(shù)據(jù)寫入操作的影響,因此,對讀請求的處理可以使ssd發(fā)揮最大性能。
應(yīng)用發(fā)出讀請求時,應(yīng)用只能同步的等待讀請求結(jié)果。因此,在處理應(yīng)用的讀請求時,立刻處理單個讀請求,不進(jìn)行多個讀請求的聚合。ssd有很高的隨機讀性能,因此,應(yīng)用的讀請求,只要數(shù)據(jù)已經(jīng)存儲在ssd上,立刻發(fā)往ssd;若數(shù)據(jù)沒有持久化到ssd上,直接在內(nèi)存緩沖區(qū)中處理。所以,對于讀數(shù)據(jù)來說,數(shù)據(jù)要么在內(nèi)存中,要么在ssd上。在ssd上的數(shù)據(jù),要么在只讀(seald)容器上,要么在活動(active)容器里面已經(jīng)持久化的條帶中;但是不管怎樣,只要在ssd上的數(shù)據(jù),一定是在容器的只讀區(qū)域;基本不會發(fā)生讀寫碰撞的情況。所以這樣的設(shè)計,充分發(fā)揮了ssd隨機讀的高性能,又減少了讀寫碰撞。
圖13示出了根據(jù)本發(fā)明的另一個實施方式的處理讀寫請求的方法的流程示意圖。圖13所示的流程圖僅僅是示意性的,其中記載的步驟可以并行執(zhí)行、省略和/或增加其他步驟。
如圖13所示,處理讀寫請求的方法包括以下步驟:
步驟s13100:接收寫請求;
步驟s13200:將寫請求的數(shù)據(jù)寫入緩沖區(qū),向?qū)懻埱蟀l(fā)出方應(yīng)答寫請求完成;
步驟s13300:將寫請求對應(yīng)的數(shù)據(jù)寫入活動存儲對象;
步驟s13400:接收讀請求,所述讀請求要讀取第一數(shù)據(jù),
步驟s13500:判斷已經(jīng)為第一數(shù)據(jù)分配存儲對象,且存儲對象是只讀狀態(tài),則從為第一數(shù)據(jù)分配的只讀存儲對象獲取第一數(shù)據(jù)。
圖13示出的是同時接收到寫請求與讀請求的實施方式,在步驟s13500中,數(shù)據(jù)集所在的容器為只讀容器,讀過程中不會受到數(shù)據(jù)寫入操作的影響,因此,讀請求和寫請求可以獲得ssd設(shè)備的最大性能支持。
應(yīng)該理解,框圖和流程圖的每個框以及框圖和流程圖的框的組合可以分別由包括計算機程序指令的各種裝置來實施。這些計算機程序指令可以加載到通用計算機、專用計算機或其他可編程數(shù)據(jù)控制設(shè)備上以產(chǎn)生機器,從而在計算機或其他可編程數(shù)據(jù)控制設(shè)備上執(zhí)行的指令創(chuàng)建了用于實現(xiàn)一個或多個流程圖框中指定的功能的裝置。
這些計算機程序指令還可以存儲在可以引導(dǎo)計算機或其他可編程數(shù)據(jù)控制設(shè)備的計算機可讀存儲器中從而以特定方式起作用,從而能夠利用存儲在計算機可讀存儲器中的指令來制造包括用于實現(xiàn)一個或多個流程圖框中所指定功能的計算機可讀指令的制品。計算機程序指令還可以加載到計算機或其他可編程數(shù)據(jù)控制設(shè)備上以使得在計算機或其他可編程數(shù)據(jù)控制設(shè)備上執(zhí)行一系列的操作步驟,從而產(chǎn)生計算機實現(xiàn)的過程,進(jìn)而在計算機或其他可編程數(shù)據(jù)控制設(shè)備上執(zhí)行的指令提供了用于實現(xiàn)一個或多個流程圖框中所指定功能的步驟。
因而,框圖和流程圖的框支持用于執(zhí)行指定功能的裝置的組合、用于執(zhí)行指定功能的步驟的組合和用于執(zhí)行指定功能的程序指令裝置的組合。還應(yīng)該理解,框圖和流程圖的每個框以及框圖和流程圖的框的組合可以由執(zhí)行指定功能或步驟的、基于硬件的專用計算機系統(tǒng)實現(xiàn),或由專用硬件和計算機指令的組合實現(xiàn)。
上述的不同塊、操作以及技術(shù)的至少一部分可以被執(zhí)行,通過使用硬件,控制設(shè)備執(zhí)行固件指令,控制設(shè)備執(zhí)行軟件指令,或者及其任意組合。當(dāng)采用執(zhí)行固件以及軟件指令的控制設(shè)備執(zhí)行時,軟件或固件指令可以被存儲在任意計算機可讀存儲介質(zhì)中,例如磁盤,光盤或者其他存儲介質(zhì),在ram或者rom或者flash存儲器,控制設(shè)備,硬盤,光盤,磁盤等等。同樣地,軟件和固件指令可以被傳輸?shù)接脩艋蛘呦到y(tǒng),通過任意已知的或者期望的傳輸方式包括,例如,在計算機可讀盤或者其他便攜式計算機存儲機制或者通過通信媒介。通信媒介典型地具體化計算機可讀指令,數(shù)據(jù)結(jié)構(gòu),序模塊或者在已調(diào)制數(shù)據(jù)信號中的其它數(shù)據(jù)例如載波或者其他傳輸機制。通過示例,并非限制,通信介質(zhì)包括有線介質(zhì)例如有線網(wǎng)絡(luò)或者單線連接,以及無線媒介,例如聲、無線頻率,紅外以及其它無線介質(zhì)。從而,軟件和固件指令可以被傳輸給用戶或者系統(tǒng),通過通信信道,例如電話線,dsl線,電纜電視線,光纖線纜,無線信道,因特網(wǎng),等等(通過便攜式存儲介質(zhì)提供這樣的軟件,其被看作是相同的或者可互換的)。軟件或者固件指令可以包括機器可讀指令,這些可讀指令在由控制設(shè)備執(zhí)行時,導(dǎo)致控制設(shè)備執(zhí)行不同動作。
當(dāng)在硬件中執(zhí)行時,硬件可以包括一個或多個離散組件,集成電路,應(yīng)用的集成電路(asic),等等。
需要理解的是,本發(fā)明可以以純軟件、純硬件、固件以及上述的各種組合來實現(xiàn)。硬件例如可以是控制設(shè)備、專用集成電路、大規(guī)模集成電路等等。
雖然當(dāng)前發(fā)明參考的示例被描述,其只是為了解釋的目的而不是對本發(fā)明的限制,對實施方式的改變,增加和/或刪除可以被做出而不脫離本發(fā)明的范圍。
這些實施方式所涉及的、從上面描述和相關(guān)聯(lián)的附圖中呈現(xiàn)的教導(dǎo)獲益的領(lǐng)域中的技術(shù)人員將認(rèn)識到這里記載的本發(fā)明的很多修改和其他實施方式。因此,應(yīng)該理解,本發(fā)明不限于公開的具體實施方式,旨在將修改和其他實施方式包括在所附權(quán)利要求書的范圍內(nèi)。盡管在這里采用了特定的術(shù)語,但是僅在一般意義和描述意義上使用它們并且不是為了限制的目的而使用。