我的 ZFS 阵列出现了性能问题,我认为是碎片整理造成的。我有一个由 20 个设备组成的条带阵列,每个设备有 2 个镜像驱动器。我最近向这个条带阵列添加了一些比原始设备大 (2 倍) 的设备。
使用 zpool iostats 显示,即使一些旧设备已满 90%,而新设备仅满 50%,写入仍然均匀分布在所有设备之间,与每个驱动器的可用百分比或空间无关。
ZFS 是否期望条带阵列的所有设备大小相同?这是磁盘使用方式不同的原因吗?还是完全无关紧要?
答案1
我使用zdb -ddddd
[see]进行了测试http://www.cuddletech.com/blog/pivot/entry.php?id=980]
我创建了两个文件,分别命名为磁盘1和磁盘2那是400米,然后磁盘3和磁盘4在 650M,我使用它们创建了一个 zpool“坦克”:
zpool create tank mirror disk1 disk2
zpool add mirror disk3 disk4
(我假设您曾经将zpool add mirror
磁盘包含在池中,但没有将zpool attach
磁盘添加到现有的镜像 vdev;后者是一个普遍的坏主意,而且无论如何都不会增加容量,只会添加另一个镜像设备)
当我用 100M 的容量一次填满游泳池时mk文件,我检查了zdb -ddddd tank <inode#>
哪些 vdev 被写入,并且 zfs 确实平衡了每个 vdev 之间的负载;在 400 个块地址中,平均大约有 300-350 个被写入较小的“磁盘”,450-500 个被写入较大的磁盘,即使在最后一个填满池的文件中也是如此。
这意味着 ZFS将要平衡每个块之间写入的块虚拟设备在池中。(在本例中,在您的 11 个镜像之间)。另一方面,如果您要使用以下方法将更大的驱动器添加到现有镜像中zpool 附加, 零文件文件系统不会能够利用额外的空间,因为它将相同的块写入镜像中的每个磁盘。
通常建议在池中使用相同的磁盘,但这显然不是必需的。不过,不要费心为具有较慢磁盘的池添加较快的驱动器;在池中,最慢的磁盘是瓶颈(尽管为 ZIL 添加 SSD 日志可能会缓解该问题)。
另外,我不会担心 ZFS 中的碎片整理,这是它的本质——因为 ZFS 是一个写时复制文件系统,这是不可避免的。(意思是,它不是用新数据覆盖一个块,而是将新数据写入新块,然后更新元数据指针和校验和以使用新块。)我不希望这会降低性能。
90% 的占用率(干扰写时复制)会降低性能。建议将利用率保持在 80% 或以下,以获得最佳性能。
这让我想到了其他的事情——您的池已经存在,然后您添加了两个新磁盘——现有数据将不会分布在这些磁盘上,直到重新写入为止,所以我预计在一段时间内新磁盘上的总数据量会减少。