ZFS 快照真的“免费”吗?

ZFS 快照真的“免费”吗?

我曾多次听说 ZFS 快照是“免费的”,因为 ZFS 的写时复制设计快照不会占用任何磁盘空间,除非数据发生变化,而且只有在发生更改时,空间使用量才会限制在实际发生变化的块上。Stack Exchange 上的许多答案以及整个互联网上的帖子都声称这一点,或者说使用的空间“微不足道”

这些说法有多准确?ZFS 快照实际上使用了多少磁盘空间?

答案1

我做了一个测试,实际上是针对一个不相关的问题(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/快照。

因此,虽然 zfs 快照可能使用“微不足道”的空间量(“微不足道”的定义可能基于个人观点),但成本却是不是零;即使没有块发生变化,每个快照都会有少量的空间开销(以兆字节为单位)。

相关内容