通常建议不要将 ZFS 卷的容量填满超过 70-80%,以防止出现碎片。然而,我发现我过去已经超出了这一范围(“我只需要多一点,我稍后会清除它”综合症)。我很快会将我的一些卷迁移到新的卷上,这样它们就会再次“干净”,并且我想对所述卷实施限制。本质上是一个全用户配额,以防止我跨越这个障碍。
那么,是否只需设置以下内容就这么简单(假设在这种情况下是 3TB 的磁盘)?
zfs set quota=2000G storage/data
如果是这样,这里可以用百分比来代替吗?
最后,考虑到更大的容量,建议仍然是 70-80%,还是应该通过将要存储/复制的最大文件数量乘以 x 数量来计算更合理的数量(就像人们不会设置监控来对 10EB 卷的 90% 发出严重警报,但会计算平均数据增长并设置更现实的值)?
我想我可以通过谷歌搜索发现前两个问题,但最后一个问题是针对专家的。
答案1
我不知道为什么,但我的第一反应是使用预留,而不是配额。我(错误地)认为超级用户也许能够规避配额,但快速测试表明我的直觉是错误的。
但是,仅仅为了启发,请考虑使用预留而不是配额:
zfs create \
-o reservation=500G \
-o canmount=off \
-o mountpoint=none storage/unusable
请注意,配额和预留使用互补数字。在您的示例中,2000GB 的大小数字是可用的您想要的空间。在上面的预订示例中,500GB 是无法使用将从池的总空间中保留的空间。根据喜好进行调整。
差异很小,因此我建议这只是一种替代解决方案,而不是“更好的方法”。但是,有一个小小的优势,可能要到未来的某一天才会显现出来。
有了配额,您永远无法使用该保留空间,即使是超级用户也不行。但是有了保留,超级用户就可以访问该空间:
zfs set canmount=noauto,mountpoint=/root/temporary storage/unusable
zfs mount /root/temporary
并可以紧急访问池中原本无法使用的部分。使用配额,我不知道即使是超级用户也有什么办法可以超越存储限制。
编辑:
为了帮助说明预留对池的作用,这里有一个带有 1G 预留的微型 4G 虚拟磁盘池:
# zfs list -o name,used,avail,reservation,refer,mountpoint -r mypool
NAME USED AVAIL RESERV REFER MOUNTPOINT
mypool 1.00G 2.62G none 88K /mypool
mypool/unusable 88K 3.62G 1G 88K none
mypool/usable 88K 2.62G none 88K /mypool/usable
# zpool list mypool
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
mypool 3.75G 744K 3.75G - - 0% 0% 1.00x ONLINE -