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