为什么我的 ZFS 池花费 97% 的时间读取目标,而只有大约 3% 的时间用于写入操作?

为什么我的 ZFS 池花费 97% 的时间读取目标,而只有大约 3% 的时间用于写入操作?

这让我很困惑,我不知道如何深入了解 ZFS 实际上在做什么。

我使用全新安装的 FreeNAS 11.1,带有快速 ZFS 池(在快速 7200 上导入镜像)以及单独的 UFS SSD 进行测试。配置几乎是“开箱即用”。

SSD 包含 4 个大小为 16 -120 GB 的文件,使用控制台复制到池中。池已进行重复数据删除(值得:节省 4 倍,磁盘大小为 12TB),系统拥有充足的 RAM(128GB ECC)和快速的 Xeon。内存足够 -zdb显示池总共有 121M 个块(每个块在磁盘上 544 字节,每个块在 RAM 中 175 字节),因此整个 DDT 仅约 20.3 GB(每 TB 数据约 1.7 GB)。

但是,当我将文件复制到池中时,我看到以下内容zpool iostat在此处输入图片描述

它执行长达一分钟的低级读取和短暂的写入周期。读取部分如图所示。该任务的整体写入速度也不是很好 - 池中有 45%/10TB 是空的,本机写入速度约为 300 - 500 MB/s。

在不知道如何检查的情况下,我怀疑低级读取来自读取 DDT 和其他元数据,因为它们没有预加载到 ARC 中(或者被写入的文件数据不断从 ARC 中推出)。也许吧。

也许它发现了重复数据删除命中,所以没有太多写入,只是我不记得这些文件有任何重复版本,而且据我所知,它从 /dev/random 执行了相同的操作(我会检查这一点并尽快更新)。也许吧。没有真正的想法。

我可以做些什么来更准确地了解正在发生的事情,以期对其进行优化?

RAM 和重复数据删除的更新:

我已经更新了 Q 以显示初始评论后的 DDT 大小。重复数据删除 RAM 通常引用为每 TB 5GB x 4,但这是基于一个实际上不太适合重复数据删除的示例。您必须计算块数乘以每个条目的字节数。经常引用的“x 4”只是一个“软”默认限制(默认情况下,ZFS 将元数据限制为 ARC 的 25%,除非被告知使用更多 - 此系统针对重复数据删除进行了配置,我添加了 64GB,这是全部可用于加速元数据缓存)。

因此,在这个池中zdb确认整个 DDT 每 TB 只需要 1.7 GB,而不是每 TB 5GB(总共 20G),并且我很乐意为元数据提供 ARC 的 70% 而不是 25%(123G 中的 80G)。

这么大的尺寸,应该不需要弹出任何事物除了来自 ARC 的“死”文件内容之外。因此,我希望实际探测 ZFS 以了解它认为正在发生的事情,这样我就可以看到我所做的任何更改的效果,因为我对其巨大的“低级读取”量感到非常惊讶,并且正在寻找一种方法来探测和确认它认为正在做的事情的真实性。

相关内容