ZVOL 之上 NTFS 的 8Kb 簇大小有什么缺点吗?

ZVOL 之上 NTFS 的 8Kb 簇大小有什么缺点吗?

我正在尝试在 ZVOL 上最大化 Windows VM 的性能。官方建议是 zvol 上的分配单元大小 (volblocksize) 应与我想要放在 ZVOL 上的分配单元大小一致。对于 Windows,这将是 4Kb volblocksize: http://open-zfs.org/wiki/Performance_tuning#Dataset_recordsize

但是,也有人说较小的 volblocksize 会损害 ZFS 性能,并且在这个帖子中人们给出了不同的建议:http://list.zfsonlinux.org/pipermail/zfs-discuss/2017-September/029227.html

我想知道是否最好将 ZFS 保留为默认的 8Kb 块大小,然后使用 8Kb 块(而不是通常的 4kb)格式化我的 Windows 安装。我意识到这意味着没有 NTFS 文件压缩,我愿意至少尝试放弃它。

我的想法是,如果 ZVOL 要处理 8kb 块,则将 NTFS 设置为 8kb 不会对净存储空间造成损失。这是正确的吗?还有其他原因导致这可能是一个糟糕的想法吗?

答案1

无论如何,几乎不可能相信轶事性能数据:单个数据点和您的设置之间可能存在太多差异。(他们是否使用了重复数据删除?他们的系统中是否有足够的 RAM?他们的某个磁盘是否即将出现故障?他们使用了哪种数据冗余配置?这是在同步写入之前还是之后速度提高了 2 倍? 这个清单还可以很长。)

您链接到的指南这里是正确的:

部分记录写入要求从 ARC(便宜)或磁盘(昂贵)读取数据。recordsize可以设置为 2 的任意幂,范围从 512 字节到 128 千字节。使用匹配的 可使以固定记录大小写入的软件(例如数据库)受益recordsize

就在下面...

Zvols 具有volblocksize与记录大小类似的属性。默认大小为 8KB,这是 SPARC 架构上的页面大小。使用较小 IO 的工作负载(例如使用 4096 字节页面的 x86 上的交换)将受益于较小的volblocksize

然而,你对此的解释有点不对——它是说你应该尝试匹配你的IO的大小数据库将发行(向上IO 堆栈),而不是底层硬件的块大小(向下IO 堆栈)。

假设您想在 ZFS 内部进行压缩(这基本上是唯一的选择,因为 ext4 和 XFS 不进行压缩) ,这个建议是正确的(如果我理解正确的话,这符合您使用 8KiB 的愿望volblocksize)。此配置不会产生任何存储开销,无论是由于读取-修改-写入还是由于消耗了额外的空间。如果您相信您链接到的邮件列表消息,也许这也会略微减少 ZFS 在写入大量 4KiB 块时遇到的任何瓶颈。

但是,由于 NTFS 可以进行压缩,如果您出于某种原因想要使用 NTFS 的压缩,则应使其volblocksize等于底层磁盘的块大小,以便为 NTFS 提供压缩内容的最小单位(在必须将压缩数据四舍五入到下一个块大小时浪费最少的空间),并使 NTFS 中的逻辑块大小与数据库所需的块大小相匹配。这也不会通过读取-修改-写入或额外空间产生任何存储开销。

相关内容