Zfs

ZFS 快照真的“免費”嗎?

  • March 14, 2021

我多次聽說 ZFS 快照是“免費的”,因為 ZFS 的寫時複製設計快照不佔用任何磁碟空間,除非數據發生更改,然後才將空間使用限制在實際的塊改變了。Stack Exchange 上的許多答案以及整個網際網路上的文章都提出了這種說法或說使用的空間“可以忽略不計”

這些陳述的準確性如何?ZFS 快照實際使用了多少磁碟空間?

我做了一個測試,實際上是針對一個不相關的問題(zfs send無法發送具有超過 42,000 個快照的文件系統),令我驚訝的是,我發現zfs 快照實際上消耗了幾兆字節。在我的測試中,這大約是 4 MiB/快照。

為了測試這一點,我創建了一個帶有單個文件系統的空 zpool,根本沒有文件、目錄或其他數據。然後我嘗試創建 100,000 個快照,令我驚訝的是,這在僅創建 50,698 個快照後失敗了:

root@test:~# zpool create tank nvme-nvme.15ad-564d57617265204e564d455f30303030-564d77617265205669727475616c204e564d65204469736b-00000002
root@test:~# zpool list
NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
tank   199G   116K   199G        -         -     0%     0%  1.00x    ONLINE  -
root@test:~# zfs create tank/test
root@test:~# zfs list
NAME        USED  AVAIL     REFER  MOUNTPOINT
tank        118K   193G       24K  /tank
tank/test    24K   193G       24K  /tank/test
root@test:~# ls -lR /tank/
/tank/:
total 1
drwxr-xr-x 2 root root 2 Mar 14 15:16 test

/tank/test:
total 0
root@test:~# find /tank
/tank
/tank/test
root@test:~# for i in {0..100000}; do zfs snapshot tank/test@snap$i; done
cannot create snapshots : out of space
cannot create snapshots : out of space
...
cannot create snapshots : out of space
cannot create snapshots : out of space
root@proxmoxtest:~# zfs list -t snapshot | wc -l
50698
root@proxmoxtest:~# zpool list
NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
tank   200G   193G  6.23G        -         -    84%    96%  1.00x    ONLINE  -

根據這個測試,ZFS 似乎需要大約 3.9 MiB 的空間來儲存 200GiB zpool 上每個快照的元數據。這似乎因池大小而異;當我使用 20GiB zpool 進行測試時,結果約為 1.8 MiB/snapshot。

因此,雖然 zfs 快照可能使用“可忽略”的空間量(“可忽略”的定義可能基於意見),但成本為零;即使沒有塊,每個快照都有少量空間成本(以兆字節為單位)改變。

引用自:https://serverfault.com/questions/1057059