ZFS 是否真的会在每个 vdev 上进行条带化,即使在非常大的 zpools 中也是如此?

ZFS 是否真的会在每个 vdev 上进行条带化,即使在非常大的 zpools 中也是如此?

我读到过,ZFS 会将 zpool 中的数据条带化到所有顶层 vdev,假设所有 vdev 都是在池的生命周期开始时添加的。我读到的所有内容似乎都认为这是一件好事。但是,在我看来,对于具有许多磁盘的部署,这不会在多用户(甚至只是多进程)环境中导致所有这些磁盘的整体性能良好。

例如,假设我有 96 个磁盘,我用它们创建 12 个 vdev,每个 vdev 有 8 个磁盘,然后将它们全部添加到我的 zpool 中。然后我将其分配给用户,用户会用各种疯狂的方式填满它。有些文件有几十 GB,其他是小型用户应用程序配置文件等。

后来,用户 A 想要复制一些几 GB 的文件。她启动了 rsync 或类似程序,并从 12 个条带化 vdev 的底层顺序读取中体验到了惊人的性能。但随后用户 B 启动了另一个应用程序,该应用程序也一次请求相当大的数据块。现在驱动器磁头不断从用户 A 的 rsync 中被拉出来以处理用户 B,尽管每个应用程序都是相对连续的,但 96 个磁盘都参与了两个用户的请求,并且看到寻道模式和性能与随机 I/O 更加一致。

在这个 12 个 vdev 和 8 个磁盘的配置中,每个 vdev 仍然具有 8 个磁盘的性能,因此我预计即使没有跨其他 vdev 进行额外的条带化,顺序 I/O 也会非常好。ZFS 先将许多 GB 放在一个 vdev 上,然后再转移到另一个 vdev,这样不是更好吗?(在我的实验中,我得到的条带约为 500k。)这样,用户 A 的读取只有 1/12 的机会使用与用户 B 相同的磁盘,并且它们在大多数情况下都会获得与顺序 I/O 一致的性能。

有没有办法在这个配置/工作负载下从 ZFS 获得良好的性能?

答案1

ZFS 始终对所有虚拟设备,但这取决于文件需要多少个块 - 小文件通常适合单个块,因此会落在单个 vdev 上,除非它们属于配置了副本=2或者副本=3

不,如果不建立单独的池,您就无法更改这一点或进行拆分。

为了提高此类条带化设置的性能,ZFS 在 ZIO 组件中包含了自己的 IO 调度程序(这就是为什么在 Linux 上最后期限或者无操作建议使用调度程序)。

改善此类工作负载的另一层是其中包括预取缓存。您可以在单独的快速设备上使用 L2ARC 来加速 ARC,同步写入的等效设备是 SLOG(专用 ZIL 设备)。

相关内容