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