向緩存寫(xiě)入數(shù)據(jù)的方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明實(shí)施例涉及數(shù)據(jù)存儲(chǔ)領(lǐng)域,尤其涉及一種向緩存中寫(xiě)入數(shù)據(jù)的方法及裝 置。
【背景技術(shù)】
[0002] 在業(yè)界現(xiàn)有的讀寫(xiě)緩存(Cache)中,一般采用的存儲(chǔ)介質(zhì)都是基于非易失性記憶 體(A Non-Volatile Dual In-line Memory Module,NVDIMM)或者非易失性隨機(jī)訪問(wèn)存儲(chǔ) 器(Non-Volatile Random Access Memory,NVRAM),然而基于上述設(shè)備,寫(xiě) Cache 的容量通 常比較小,難以應(yīng)對(duì)大量隨機(jī)寫(xiě)壓力的場(chǎng)景。
[0003] 現(xiàn)有技術(shù)中,采用閃存(Flash)設(shè)備作為Cache。由于要保證數(shù)據(jù)的安全性,每一 次寫(xiě)請(qǐng)求都需要2次的10, 一次是寫(xiě)數(shù)據(jù)10,另一次是寫(xiě)元數(shù)據(jù)10。而Flash的壽命跟寫(xiě) 的次數(shù)直接相關(guān),例如,多層單元閃存(Multi-Level Cell,MLC)通常只有5000-10000次左 右。而元數(shù)據(jù)的大小一般是30B-64B之間,如果每個(gè)元數(shù)據(jù)按照元數(shù)據(jù)的大小直接10,則 不能充分發(fā)揮Flash的性能,如果元數(shù)據(jù)按照4K對(duì)齊的大小下10,則可能存在寫(xiě)放大的問(wèn) 題,對(duì)整個(gè)Flash的壽命會(huì)大大的影響。
【發(fā)明內(nèi)容】
[0004] 本發(fā)明實(shí)施例提供了一種向緩存中寫(xiě)入數(shù)據(jù)的方法及裝置,可以解決頻繁向 Flash中寫(xiě)入元數(shù)據(jù),而影響Flash的壽命的問(wèn)題。
[0005] 第一方面,本發(fā)明實(shí)施例提供了一種向緩存Cache中寫(xiě)入數(shù)據(jù)的方法,所述Cache 的閃存Flash的存儲(chǔ)區(qū)域包括多個(gè)存儲(chǔ)塊chunk,一個(gè)所述chunk包括一個(gè)chunk元數(shù)據(jù) 區(qū)和一個(gè)chunk數(shù)據(jù)區(qū),所述一個(gè)chunk元數(shù)據(jù)區(qū)包括至少一個(gè)元數(shù)據(jù)塊,所述一個(gè)chunk 數(shù)據(jù)區(qū)包括與所述至少一個(gè)元數(shù)據(jù)塊對(duì)應(yīng)的至少一個(gè)數(shù)據(jù)區(qū),所述元數(shù)據(jù)塊包括多個(gè)元數(shù) 據(jù),所述數(shù)據(jù)區(qū)包括多個(gè)數(shù)據(jù)塊,所述元數(shù)據(jù)塊與所述數(shù)據(jù)區(qū)一一對(duì)應(yīng),所述元數(shù)據(jù)與所述 數(shù)據(jù)塊一一對(duì)應(yīng),所述方法包括:
[0006] 接收寫(xiě)入10請(qǐng)求命令,所述寫(xiě)入10請(qǐng)求命令包括待寫(xiě)入數(shù)據(jù)的元數(shù)據(jù);
[0007] 在全局的伙伴隊(duì)列中獲取當(dāng)前正在處理的伙伴組為第一伙伴組,每個(gè)伙伴組包含 內(nèi)存中的多個(gè)緩存塊,每個(gè)伙伴組屬于一個(gè)元數(shù)據(jù)組,一個(gè)所述元數(shù)據(jù)組對(duì)應(yīng)一個(gè)所述元 數(shù)據(jù)塊;
[0008] 判斷所述第一伙伴組中是否有剩余緩存塊且剩余緩存塊能夠?qū)懭胨龃龑?xiě)入數(shù) 據(jù)的全部元數(shù)據(jù);
[0009] 當(dāng)所述第一伙伴組中有剩余緩存塊且剩余緩存塊能夠?qū)懭胨龃龑?xiě)入數(shù)據(jù)的全 部元數(shù)據(jù)時(shí),向所述第一伙伴組的剩余緩存塊中寫(xiě)入所述待寫(xiě)入數(shù)據(jù)的全部元數(shù)據(jù),并向 與所述第一伙伴組所屬的元數(shù)據(jù)組對(duì)應(yīng)的元數(shù)據(jù)塊中寫(xiě)入所述待寫(xiě)入數(shù)據(jù)的全部元數(shù)據(jù)。
[0010] 結(jié)合第一方面,在第一方面的第一種實(shí)施方式中,當(dāng)所述第一伙伴組中沒(méi)有剩余 緩存塊或剩余緩存塊不能夠?qū)懭胨龃龑?xiě)入數(shù)據(jù)的全部元數(shù)據(jù)時(shí),則判斷所述第一伙伴組 所屬的元數(shù)據(jù)組的伙伴隊(duì)列中是否有剩余緩存塊能夠?qū)懭胨龃龑?xiě)入數(shù)據(jù)的全部元數(shù)據(jù) 的第二伙伴組,若有,則在所述第一伙伴組所屬的元數(shù)據(jù)組的伙伴隊(duì)列中獲取所述第二伙 伴組,向所述第二伙伴組的剩余緩存塊中寫(xiě)入所述待寫(xiě)入數(shù)據(jù)的全部元數(shù)據(jù),并向與所述 第二伙伴組所屬的元數(shù)據(jù)組對(duì)應(yīng)的元數(shù)據(jù)塊中寫(xiě)入所述待寫(xiě)入數(shù)據(jù)的全部元數(shù)據(jù),所述全 局的伙伴隊(duì)列中包括所有元數(shù)據(jù)組的伙伴隊(duì)列中包括的伙伴組。
[0011] 結(jié)合第一方面的第一種實(shí)施方式,在第一方面的第二種實(shí)施方式中,當(dāng)所述第一 伙伴組所屬的元數(shù)據(jù)組的伙伴隊(duì)列中沒(méi)有剩余緩存塊能夠?qū)懭胨龃龑?xiě)入數(shù)據(jù)的全部元 數(shù)據(jù)的第二伙伴組時(shí),則判斷所述全局的伙伴隊(duì)列中是否有剩余緩存塊能夠?qū)懭胨龃龑?xiě) 入數(shù)據(jù)的全部元數(shù)據(jù)的第三伙伴組,若有,則在所述全局的伙伴隊(duì)列中獲取所述第三伙伴 組,向所述第三伙伴組的剩余緩存塊中寫(xiě)入所述待寫(xiě)入數(shù)據(jù)的全部元數(shù)據(jù),并向與所述第 三伙伴組所屬的元數(shù)據(jù)組對(duì)應(yīng)的元數(shù)據(jù)塊中寫(xiě)入所述待寫(xiě)入數(shù)據(jù)的全部元數(shù)據(jù)。
[0012] 結(jié)合第一方面的第二種實(shí)施方式,在第一方面的第三種實(shí)施方式中,當(dāng)所述全局 的伙伴隊(duì)列中沒(méi)有剩余緩存塊能夠?qū)懭胨龃龑?xiě)入數(shù)據(jù)的全部元數(shù)據(jù)的第三伙伴組時(shí),則 判斷全局的單緩存隊(duì)列中是否有足夠數(shù)量的剩余緩存塊能夠?qū)懭胨龃龑?xiě)入數(shù)據(jù)的全部 元數(shù)據(jù),若有,則在所述全局的單緩存隊(duì)列中獲取能夠?qū)懭胨龃龑?xiě)入數(shù)據(jù)的全部元數(shù)據(jù) 的剩余緩存塊,向所獲取的所述全局的單緩存隊(duì)列中的剩余緩存塊中寫(xiě)入所述待寫(xiě)入數(shù)據(jù) 的全部元數(shù)據(jù),并將所述待寫(xiě)入數(shù)據(jù)的全部元數(shù)據(jù)對(duì)應(yīng)寫(xiě)入與所述全局的單緩存隊(duì)列中的 剩余緩存塊所屬的元數(shù)據(jù)組對(duì)應(yīng)的元數(shù)據(jù)塊中,所述全局的單緩存隊(duì)列中包含所有元數(shù)據(jù) 組的單緩存隊(duì)列中中包含的不能與其他緩存塊組成伙伴組的單個(gè)緩存塊。
[0013] 結(jié)合第一方面,在第一方面的第四種實(shí)施方式中,每個(gè)伙伴組中包含的緩存塊是 按地址連續(xù)排列的。
[0014] 結(jié)合第一方面,在第一方面的第五種實(shí)施方式中,每個(gè)伙伴組中包含的剩余緩存 塊的個(gè)數(shù)被同時(shí)記錄在所述全局的伙伴隊(duì)列及所述元數(shù)據(jù)組的伙伴隊(duì)列中,所述全局的伙 伴隊(duì)列及所述元數(shù)據(jù)組的伙伴隊(duì)列中各隊(duì)列記錄的伙伴組包含的剩余緩存塊的個(gè)數(shù)是不 同的。
[0015] 結(jié)合第一方面,或第一方面的第一種、或第二種、或第三種、或第四種、或第五種實(shí) 施方式,在第一方面的第六種實(shí)施方式中,在所述接收寫(xiě)入IO請(qǐng)求命令之后,在所述全局 的伙伴隊(duì)列中獲取當(dāng)前正在處理的伙伴組為第一伙伴組之前,所述方法還包括:
[0016] 根據(jù)所述數(shù)據(jù)塊的大小,判斷是否需要對(duì)所述寫(xiě)入IO請(qǐng)求命令進(jìn)行拆分;
[0017] 若需要進(jìn)行拆分,則根據(jù)所述數(shù)據(jù)塊的大小,對(duì)所述寫(xiě)入IO請(qǐng)求命令進(jìn)行拆分, 得到多個(gè)第一寫(xiě)入IO請(qǐng)求命令;
[0018] 對(duì)所述多個(gè)第一寫(xiě)入IO請(qǐng)求命令,分別判斷各個(gè)第一寫(xiě)入IO請(qǐng)求命令中包括的 待寫(xiě)入數(shù)據(jù)的元數(shù)據(jù)是否已緩存在所述內(nèi)存中,如果是,則直接進(jìn)行寫(xiě)操作,如果否,則執(zhí) 行在所述全局的伙伴隊(duì)列中獲取當(dāng)前正在處理的伙伴組為第一伙伴組的步驟。
[0019] 結(jié)合第一方面,在第一方面的第七種實(shí)施方式中,當(dāng)所述全局的伙伴隊(duì)列中任一 隊(duì)列記錄多個(gè)伙伴組時(shí),則根據(jù)每個(gè)伙伴組中包含的剩余緩存塊的個(gè)數(shù),對(duì)所述多個(gè)伙伴 組進(jìn)行排列;和/或當(dāng)所述元數(shù)據(jù)組的伙伴隊(duì)列中任一隊(duì)列記錄多個(gè)伙伴組時(shí),則根據(jù)每 個(gè)伙伴組中包含的剩余緩存塊的個(gè)數(shù),對(duì)所述多個(gè)伙伴組進(jìn)行排列。
[0020] 結(jié)合第一方面,在第一方面的第八種實(shí)施方式中,所述方法還包括:
[0021] 接收回收元數(shù)據(jù)指令,所述回收元數(shù)據(jù)指令包括待回收元數(shù)據(jù)所屬的緩存塊的索 引;
[0022] 根據(jù)所述緩存塊的索引,獲取所述緩存塊的前一緩存塊及后一緩存塊;
[0023] 將所述緩存塊與所述前一緩存塊和所述后一緩存塊中狀態(tài)為空閑的緩存塊組成 一個(gè)新的伙伴組;
[0024] 根據(jù)所述新的伙伴組中包含的緩存塊的數(shù)量將所述新的伙伴組加入到所述全局 的伙伴隊(duì)列及所述元數(shù)據(jù)組的伙伴隊(duì)列。
[0025] 結(jié)合第一方面的第八種實(shí)施方式,在第一方面的第九種實(shí)施方式中,若所述前一 緩存塊和所述后一緩存塊中狀態(tài)為空閑的緩存塊已屬于一個(gè)伙伴組,則所述新的伙伴組中 包括包括所述緩存塊,以及所述前一緩存塊和所述后一緩存塊中狀態(tài)為空閑的緩存塊所屬 的伙伴組中包含的緩存塊。
[0026] 結(jié)合第一方面的第八種實(shí)施方式,在第一方面的第十種實(shí)施方式中,若所述前一 緩存塊和所述后一緩存塊的狀態(tài)均不為空閑狀態(tài),則將所述緩存塊加入到全局的單緩存隊(duì) 列及元數(shù)據(jù)組的單緩存隊(duì)列。
[0027] 第二方面,本發(fā)明實(shí)施例提供了一種向緩存Cache中寫(xiě)入數(shù)據(jù)的裝置,所述裝置 的閃存Flash的存儲(chǔ)區(qū)域包括多個(gè)存儲(chǔ)塊chunk,一個(gè)所述chunk包括一個(gè)chunk元數(shù)據(jù) 區(qū)和一個(gè)chunk數(shù)據(jù)區(qū),所述一個(gè)chunk元數(shù)據(jù)區(qū)包括至少一個(gè)元數(shù)據(jù)塊,所述一個(gè)chunk 數(shù)據(jù)區(qū)包括與所述至少一個(gè)元數(shù)據(jù)塊對(duì)應(yīng)的至少一個(gè)數(shù)據(jù)區(qū),所述元數(shù)據(jù)塊包括多個(gè)元數(shù) 據(jù),所述數(shù)據(jù)區(qū)包括多個(gè)數(shù)據(jù)塊,所述元數(shù)據(jù)塊與所述數(shù)據(jù)區(qū)一一對(duì)應(yīng),所述元數(shù)據(jù)與所述 數(shù)據(jù)塊一一對(duì)應(yīng),所述裝置包括:
[0028] 接收單元,用于接收寫(xiě)入IO請(qǐng)求命令,所述寫(xiě)入IO請(qǐng)求命令包括待寫(xiě)入數(shù)據(jù)的元 數(shù)據(jù);
[0029] 第一獲取單元,用于在全局的伙伴隊(duì)列中獲取當(dāng)前正在處理的伙伴組為第一伙伴 組,每個(gè)伙伴組包含內(nèi)存中的多個(gè)緩存塊,每個(gè)伙伴組屬于一個(gè)元數(shù)據(jù)組,一個(gè)所述元數(shù)據(jù) 組對(duì)應(yīng)一個(gè)所述元數(shù)據(jù)塊;
[0030] 判斷單元,用于判斷所述第一伙伴組中是否有剩余緩存塊且剩余緩存塊能夠?qū)懭?所述待寫(xiě)入數(shù)據(jù)的全部元數(shù)據(jù);
[0031] 第一寫(xiě)入單元,用于當(dāng)所述第一伙伴組中有剩余緩存塊且剩余緩存塊能夠?qū)懭胨?述待寫(xiě)入數(shù)據(jù)的全部元數(shù)據(jù)時(shí),向所述第一伙伴組的剩余緩存塊中寫(xiě)入所述待寫(xiě)入數(shù)據(jù)的 全部元數(shù)據(jù),并向與所述第一伙伴組所屬的元數(shù)據(jù)組對(duì)應(yīng)的元數(shù)據(jù)塊中寫(xiě)入所述待寫(xiě)入數(shù) 據(jù)的全部元數(shù)據(jù)。
[0032] 結(jié)合第二方面,在第二方面的第一種實(shí)施方式中,所述裝置還包括:
[0033] 第二獲取單元,用于當(dāng)所述判斷單元判斷所述第一伙伴組中沒(méi)有剩余緩存塊或剩 余緩存塊不能夠?qū)懭胨龃龑?xiě)入數(shù)據(jù)的全部元數(shù)據(jù)時(shí),則判斷所述第一伙伴組所屬的元數(shù) 據(jù)組的伙伴隊(duì)列中是否有剩余緩存塊能夠?qū)懭胨龃龑?xiě)入數(shù)據(jù)的全部元數(shù)據(jù)的第二伙伴 組,若有,則在所述第一伙伴組所屬的元數(shù)據(jù)組的伙伴隊(duì)列中獲取所述第二伙伴組;
[0034] 第二寫(xiě)入單元,用于向所述第二伙伴組的剩余緩存塊中寫(xiě)入所述待寫(xiě)入數(shù)據(jù)的全 部元數(shù)據(jù),并向與所述第二伙伴組所屬的元數(shù)據(jù)組對(duì)應(yīng)的元數(shù)據(jù)塊中寫(xiě)入所述待寫(xiě)入數(shù)據(jù) 的全部元數(shù)據(jù),所述全局的伙伴隊(duì)列中包括所有元數(shù)據(jù)組的伙伴隊(duì)列中包括的伙伴組。
[0035] 結(jié)合第二方面的第一種實(shí)施方式,在第二方面的第二種實(shí)施方式中,所述裝置還 包括:
[0036] 第三獲取單元,用于當(dāng)所述判斷單元判斷所述第一伙伴組所屬的元數(shù)據(jù)組的伙伴 隊(duì)列中沒(méi)有剩余緩存塊能夠?qū)懭胨龃龑?xiě)入數(shù)據(jù)的全部元數(shù)據(jù)的第二伙伴組時(shí),則判斷所 述全局的伙伴隊(duì)列中是否有剩余緩存塊能夠?qū)懭胨龃龑?xiě)入數(shù)據(jù)的全部元數(shù)據(jù)的第三伙 伴組,若有,則在所述全局的伙伴隊(duì)列中獲取所述第三伙伴組;
[0037] 第三寫(xiě)入單元,用于向所述第三伙伴組的剩余緩存塊中寫(xiě)入所述待寫(xiě)入數(shù)據(jù)的全 部元數(shù)據(jù),并向與所述第三伙伴組所屬的元數(shù)據(jù)組對(duì)應(yīng)的元數(shù)據(jù)塊中寫(xiě)入所述待寫(xiě)入數(shù)據(jù) 的全部元數(shù)據(jù)。
[0038] 結(jié)合第二方面的第二種實(shí)施方式,在