封鎖 ReFS 上的複製

適用於:Windows Server 2022、Windows Server 2019、Windows Server 2016

封鎖複製會指示檔案系統代表應用程式複製一系列檔案位元組,其中目的地檔案可能與來源檔案相同或不同。 不幸的是,複製作業很昂貴,因為它們會觸發對基礎實體資料的昂貴讀取和寫入。

不過,在 ReFS 中封鎖複製會以低成本的中繼資料作業執行複製,而不是讀取和寫入檔案資料。 由於 ReFS 可讓多個檔案共用相同的邏輯叢集(磁片區上的實體位置),複製作業只需要將檔案的區域重新對應至個別的實體位置,將昂貴的實體作業轉換為快速、邏輯的實體位置。 這可讓複本更快完成,並產生較少的 I/O 到基礎儲存體。 這項改善也有利於虛擬化工作負載,因為使用區塊複製作業時,.vhdx 檢查點合併作業會大幅加速。 此外,由於多個檔案可以共用相同的邏輯叢集,因此不會多次實際儲存相同的資料,因此可改善儲存容量。

運作方式

ReFS 上的封鎖複製會將檔案資料作業轉換成中繼資料作業。 為了進行此優化,ReFS 會將參考計數引入其複製區域的中繼資料。 此參考計數會記錄參考相同實體區域的相異檔案區域數目。 這可讓多個檔案共用相同的實體資料:

Show reference count updates when multiple files reference same region

藉由保留每個邏輯叢集的參考計數,ReFS 不會中斷檔案之間的隔離:對共用區域的寫入會觸發配置寫入機制,其中 ReFS 會為傳入寫入配置新的區域。 此機制會保留共用邏輯叢集的完整性。

範例

假設有兩個檔案 X 和 Y,其中每個檔案是由三個區域所組成,而每個區域都會對應至個別的邏輯叢集。

Two files each with three distinct regions which all map to regions that have ref count 1

現在假設應用程式會針對區域 A 和 B 在區域 E 的位移複製,從檔案 X 到檔案 Y 發出區塊複製作業。下列檔案系統狀態會產生:

Reference count shows 2 for blocked clone region

此檔案系統狀態會顯示區塊複製區域的成功重複。 由於 ReFS 只會將 VCN 更新為 LCN 對應來執行此複製作業,因此不會讀取任何實體資料,也不會覆寫 File Y 中的實體資料。 檔案 X 和 Y 現在會共用邏輯叢集,由資料表中的參考計數反映。 由於沒有實際複製任何資料,因此 ReFS 可減少磁片區上的容量耗用量。

現在假設應用程式嘗試覆寫檔案 X 中的區域 A。ReFS 會複製共用區域、適當地更新參考計數,以及執行新重複區域的傳入寫入。 這可確保會保留檔案之間的隔離。

Isolation preserved by writing to a new region G and updating ref counts

修改寫入之後,兩個檔案仍會共用區域 B。 請注意,如果區域 A 大於叢集,則只有修改過的叢集會重複,其餘部分會維持共用。

功能限制和備註

  • 來源和目的地區域必須在叢集界限開始和結束。
  • 複製的區域長度必須小於 4GB。
  • 可以對應至相同實體區域的檔案區域數目上限為 8175。
  • 目的地區域不得延伸超過檔案結尾。 如果應用程式想要使用複製的資料擴充目的地,它必須先呼叫 SetEndOfFile
  • 如果來源和目的地區域位於相同的檔案中,則它們不得重迭。 (應用程式可以繼續將區塊複製作業分割成多個不再重迭的區塊複製品)。
  • 來源和目的地檔案必須位於相同的 ReFS 磁片區上。
  • 來源和目的地檔案必須有相同的 完整性資料流程 設定。
  • 如果來源檔案是疏鬆的,目的地檔案也必須是疏鬆。
  • 區塊複製作業將會中斷共用機會鎖定(也稱為 層級 2 機會鎖定 )。
  • ReFS 磁片區必須使用 Windows Server 2016 格式化,而且如果容錯移轉叢集正在使用中,叢集功能等級必須在格式時間是 Windows Server 2016 或更新版本。

其他參考