我多次听说 ZFS 快照是“免费的”,因为 ZFS 的写时复制设计快照不占用任何磁盘空间,除非数据发生更改,然后才将空间使用限制在实际的块改变了。Stack Exchange 上的许多答案以及整个互联网上的帖子都提出了这种说法或说使用的空间“可以忽略不计”
这些陈述的准确性如何?ZFS 快照实际使用了多少磁盘空间?
我多次听说 ZFS 快照是“免费的”,因为 ZFS 的写时复制设计快照不占用任何磁盘空间,除非数据发生更改,然后才将空间使用限制在实际的块改变了。Stack Exchange 上的许多答案以及整个互联网上的帖子都提出了这种说法或说使用的空间“可以忽略不计”
这些陈述的准确性如何?ZFS 快照实际使用了多少磁盘空间?
我做了一个测试,实际上是针对一个不相关的问题(
zfs send
无法发送具有超过 42,000 个快照的文件系统),令我惊讶的是,我发现zfs 快照实际上消耗了几兆字节。在我的测试中,这大约是 4 MiB/快照。为了测试这一点,我创建了一个带有单个文件系统的空 zpool,根本没有文件、目录或其他数据。然后我尝试创建 100,000 个快照,令我惊讶的是,这在仅创建 50,698 个快照后失败了:
根据这个测试,ZFS 似乎需要大约 3.9 MiB 的空间来存储 200GiB zpool 上每个快照的元数据。这似乎因池大小而异;当我使用 20GiB zpool 进行测试时,结果约为 1.8 MiB/snapshot。
因此,虽然 zfs 快照可能使用“可忽略”的空间量(“可忽略”的定义可能基于意见),但成本不为零;即使没有块,每个快照都有少量空间开销(以兆字节为单位)改变。