我有一个已经运行了一段时间的 ZFS 文件系统,最近我终于有机会将它升级到最新的 ZFS 版本。我们的数据不需要重复数据删除,但根据小型测试,我坚信,通过利用它,我们可以免费获得 5-10% 的空间。我已经在文件系统上启用了重复数据删除,新文件正在慢慢被重复数据删除,但我们的大部分数据(95% 以上)已经存在于文件系统上。
除了将数据移出池然后重新复制回来之外,还有其他方法可以触发对现有数据的重复数据删除扫描吗?它不必是异步的或实时的。
(仅供参考,池中没有足够的空间来将整个文件系统复制到另一个文件系统,然后切换挂载。)
答案1
不,您无法在不复制现有数据的情况下对其进行重复数据删除。请记住,只有当整个 Dedup-Table 适合 RAM/L2ARC 时,您才会从重复数据删除中受益。
你可以使用 zds -S poolname 来评估重复数据删除的好处,甚至无需打开重复数据删除:
pfexec zdb -S rpool 模拟的DDT直方图:
bucket allocated referenced
______ ______________________________ ______________________________
refcnt blocks LSIZE PSIZE DSIZE blocks LSIZE PSIZE DSIZE
------ ------ ----- ----- ----- ------ ----- ----- -----
1 313K 13.4G 13.4G 13.4G 313K 13.4G 13.4G 13.4G
2 111K 5.27G 5.27G 5.27G 233K 10.7G 10.7G 10.7G
4 5.15K 96.2M 96.2M 96.2M 22.4K 403M 403M 403M
8 1.03K 12.2M 12.2M 12.2M 10.3K 111M 111M 111M
16 384 16.3M 16.3M 16.3M 8.10K 350M 350M 350M
32 157 6.17M 6.17M 6.17M 6.47K 250M 250M 250M
64 83 6.52M 6.52M 6.52M 6.37K 511M 511M 511M
128 17 395K 395K 395K 2.61K 62.5M 62.5M 62.5M
256 2 5K 5K 5K 802 2.24M 2.24M 2.24M
2K 1 512 512 512 2.66K 1.33M 1.33M 1.33M
8K 1 128K 128K 128K 8.21K 1.03G 1.03G 1.03G
Total 431K 18.8G 18.8G 18.8G 613K 26.8G 26.8G 26.8G
dedup = 1.43, compress = 1.00, copies = 1.00, dedup * compress / copies = 1.43
答案2
请注意,当前的重复数据删除实现(版本 134)对 RAM 要求较高,删除大量数据时存在突出问题,或多或少会在相当长的一段时间内占用你的 ZFS 池。 http://bugs.opensolaris.org/bugdatabase/view_bug.do;jsessionid=a24a5761748eedbb50cd39d3530e?bug_id=6924390
关于对现有数据进行重复数据删除,在同一个池中逐个复制/移动文件应该可以解决问题。
答案3
blasafer 的回答很好,我只想补充一点块指针重写是一项计划中的功能,它将允许重新压缩已存储的数据,也许它也可以用于重新进行重复数据删除。但这还得等到将来,我只是猜测而已。
答案4
等待重复数据删除出现在 FreeNAS 的 ZFS 上...当这种情况发生时,RAM 要求可能会变得更合理。希望它也能解决或缓解仍然存在的 ZFS ARC 3 年以上的错误!
http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6522017
(这个很讨厌,因为它也会超出虚拟机管理程序的虚拟机限制!)