Zfs

將相同的數據寫入 ZFS 下的文件塊會佔用快照中的空間嗎?

  • March 2, 2018

我有一個 16M 的文件。

我拍攝了包含它的 ZFS 文件系統的快照。

如果我用相同的數據覆蓋文件,ZFS 是否需要儲存文件所有塊的兩個副本?

是的,如果從文件集中獲取快照,ZFS 將為同一文件分配額外空間。

首先讓我們創建一個空文件集並準備一個要從中複製的文件。為簡單起見,關閉了壓縮,並在沒有任何**raidzmirror的單個磁碟上創建了池。

[root@localhost ~]# dd if=/dev/urandom of=/tmp/testfile bs=16M count=1
1+0 records in
1+0 records out
16777216 bytes (17 MB) copied, 0.113345 s, 148 MB/s    


[root@localhost ~]# zpool create tank sdd
[root@localhost ~]# zfs create tank/test

可以使用 來查看磁碟上使用的空間zpool list

[root@localhost]# zpool list tank
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank    9.94G   182K  9.94G         -     0%     0%  1.00x  ONLINE  -

現在將文件複製到 ZFS 文件集,創建快照並查看使用的空間。

[root@localhost ~]# /bin/cp /tmp/testfile /tank/test/

[root@localhost ~]# zfs list -t all -r tank/test
NAME        USED  AVAIL  REFER  MOUNTPOINT
tank/test  16.0M  9.61G  16.0M  /tank/test

[root@localhost ~]# zfs snapshot tank/test@1
[root@localhost ~]# zfs list -t all -r tank/test
NAME          USED  AVAIL  REFER  MOUNTPOINT
tank/test    16.0M  9.61G  16.0M  /tank/test
tank/test@1     0B      -  16.0M  -

好的,再次將相同的文件複製到 ZFS 文件集中的相同位置,並再次查看使用的空間。

[root@localhost ~]# /bin/cp -f /tmp/testfile /tank/test/
[root@localhost ~]# zfs list -t all -r tank/test
NAME          USED  AVAIL  REFER  MOUNTPOINT
tank/test    32.0M  9.60G  16.0M  /tank/test
tank/test@1  16.0M      -  16.0M  -

池中使用的磁碟空間也增長到 32MB。

[root@localhost tank]# zpool list tank
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank    9.94G  32.2M  9.91G         -     0%     0%  1.00x  ONLINE  -

如您所見,tank/test文件集現在總共佔 32MB,分為文件集中的 16MBtank/testtank/test@1快照中的 16MB。的輸出還zpool list顯示了磁碟上的 32MB 分配。

如果您重複複製並拍攝快照,則tank/testUSED 總量會進一步增長。

更新

感謝@Andrew Henle 的提問。必須更新我上面的答案,並將繼續下面的重複數據刪除內容。

讓我們使用啟用了重複數據刪除的文件集再次執行此操作。

[root@localhost]# zfs destroy -r tank/test
[root@localhost]# zfs create tank/test-dedup
[root@localhost]# zfs set dedup=on tank/test-dedup

我將跳過這裡的單個步驟,只添加已用空間概述的輸出。

[root@localhost ~]# zfs list -t all -r tank/test-dedup
NAME                  USED  AVAIL  REFER  MOUNTPOINT
tank                 32.3M  9.61G    24K  /tank
tank/test-dedup      32.1M  9.61G  16.0M  /tank/test-dedup
tank/test-dedup@1    16.0M      -  16.0M  -
[root@localhost ~]# zpool list tank
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank    9.94G  16.3M  9.92G         -     0%     0%  2.00x  ONLINE  -

啟用重複數據刪除後,仍報告快照使用額外大小,但正如您所見,zpool list重複數據刪除節省了磁碟空間並提供了 2 的重複數據刪除率。

IIRC 通常不建議使用重複數據刪除,因為記憶體使用量很大並且會影響性能。我認為正在改進 ZFS 中的重複數據刪除功能。

引用自:https://unix.stackexchange.com/questions/427215