我有一对 480 GB 的“数据中心”SSD(SAMSUNG MZ7LM480HMHQ-00005),它们将组成一个镜像配置的 ZFS 池。池的唯一内容是虚拟机的 ZFS 卷 (ZVOL)。但是,ZVOL 的大小只有 400 GB,每个 SSD 上都有 80 GB 的未使用空间。
我希望 SSD 能够充分利用其未使用的空间,从而减少闪存的磨损。实现此目标的最佳方法是什么?
只需将整个 SSD 用于池即可?
在每个 SSD 上创建一个 400 GB 的分区并将其用于池,留下 80 GB 未分区?
尝试更改 SSD 的主机保护区 (HPA),以便仅可见 400 GB 的容量,然后将“缩小的”SSD 用于池(如选项 #1 中所示)?
或者根本没有区别,SSD 会自动充分利用其所有闪存单元?
如果重要的话:我假设虚拟机将发出 TRIM 命令,并且它们到达主机的 ZFS 并最终到达 SSD 本身。
答案1
这三种方法都会产生可接受的结果。就我个人而言,我使用 1,在我的池上启用 autotrim=on,我的虚拟机由 zvols 支持,并使用能够理解 trim/discard 命令的半虚拟化 SCSI 驱动程序。我的理由是,我可能永远不会将磁盘填充到容量的 80% 以上,但如果有必要,能够这样做就更好了。
假设您从刚刚清空的(安全擦除或 blkdiscard 的 SSD)开始,选项 2 和 3 将产生类似的结果。
如果您使用 autotrim=on 并且从未将 SSD 填充到 80% 以上的容量,则上述 3 种方法之间不会有任何显著差异。
答案2
驱动器是消耗品。
我建议按预期使用它们。
对它们进行突袭。密切监测它们的健康状况。
或者根本没有区别,SSD 会自动充分利用其所有闪存单元?
这些数据中心 SSD 已超额配置;您列出的 480GB 容量可能只有 512GB。硬件已考虑到损耗均衡。
答案3
任何防止驱动器中的所有页面被使用的方法都可以实现过度配置。分区是其他文件系统用来防止所有页面被使用的一种方法,但 ZFS 有一种更简单的方法。它被称为配额。
配额传统上用于防止特定文件系统使用整个磁盘,可能是因为有多个用户,每个用户都有一个私有文件系统,并且每个文件系统都受到配额限制,因此其中一个用户不能独占驱动器上的所有空间。但配额也适用于过度配置。以下是命令示例,该命令在以1000 GB SSD 上的tank
顶级文件系统命名的池上设置 20% 的过度配置foo
。使用默认语法将单个驱动器添加到池中(基本上是几乎所有驱动器)。
zfs set quota=800G tank/foo
是的,这很简单。ZFS 的语法允许您(天哪!)使用更简单的后缀,例如,这G
意味着您不必进行分区数学运算。作为系统管理员(即使这是您的家庭 NAS、台式机、笔记本电脑等),您必须记住不要更改配额。但这与记住不要格式化原始分区或弄乱固件以便驱动器报告其大小没有太大区别。
好处是没有一个松散的原始分区来吸引每个实用程序进行配置和使用。此外,它很容易更改,因此您可以根据驱动器的使用方式进行调整。如果驱动器没有获得大量重写现有页面的写入,则过度配置只是浪费空间,因此最好根据驱动器上现有页面的更改频率来决定保留页面集的大小。这种方法也适用于镜像、简单和 raid-z 等 zfs 池类型,因为它们均匀地填充一组驱动器。