【问题标题】:How to measure cache performance of zfs with cache drive如何使用缓存驱动器测量 zfs 的缓存性能
【发布时间】:2019-02-10 15:06:17
【问题描述】:

我正在尝试比较不同的文件系统,大多数都具有缓存/分层存储功能,但到目前为止,它似乎并没有按应有的方式工作。 (顺便说一句,我知道这可能是错误的站点,但是当我搜索 zfs 时,大多数 SE 结果都在 stackoverflow 上,所以在这里问似乎很好)

在测试 zfs 时,我创建了一个池,其中一个主驱动器/分区和另一个驱动器 (ssd) 添加为缓存。主驱动器/分区约为 200 GB,ssd 为 120 GB。这在 zpool 中正确显示。

然后我使用 iozone 或 iozone 单独运行 phoronix 测试套件。经过一些最初的不熟悉后,我选择了phoronix-test-suite run-default pts/iozone,而不是只在一个硬盘、一个ssd和一个以ssd作为缓存的硬盘分区上运行。并在两台具有 ssd 的笔记本电脑上进行比较。在使用 zfs + cache 的测试中,与仅使用硬盘几乎没有区别。这真的很慢。我确保将工作目录设置为 zpool 并验证临时文件是在那里创建的,并且还检查了 zpool iostat 以确保池正在工作。 现在,虽然我可能怀疑结果较低,但我希望速度至少应该慢一些,尤其是像这样的“简单”测试,它只运行 3 次从 8 GB 文件中读取 1 MB 记录,然后从 8 GB 文件中写入 3 次 1 MB 记录。

现在,可能是因为 zfs 缓存和类似缓存的工作方式——它们无法通过这样一个简单的测试来捕获——但是,哪一个测试可以很好地捕获缓存的好处?但是,由于测试文件很容易放在缓存ssd上,为什么不先写在那里,然后在后台传回硬盘呢?

zpool 如下所示:

pool: ztest
state: ONLINE
scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    ztest       ONLINE       0     0     0
      sdb7      ONLINE       0     0     0
    cache
      sdc       ONLINE       0     0     0

errors: No known data errors

【问题讨论】:

  • 您可以添加zpool status 的输出以便我们查看设置吗?听起来您要么没有正确配置池,要么测试没有测试您的预期,最好确保它不是前者。
  • 我添加了池描述。这是根据我找到的文档使用zpool create ztest /dev/sdb7 cache /dev/sdc 创建的。在阅读了更多内容之后,似乎缓存可能只是读取缓存(尽管这仍然不能解释糟糕的读取性能),并且对于写入缓存,还需要一个 zil。但在一些相同的页面上,也有人说 ZIL 只对大存储量或巨大的服务器/特定工作负载有意义。这似乎很奇怪,因为在其他情况下,人们将 zfs 描述为几乎可以用于所有事情。

标签: caching zfs


【解决方案1】:

以下是我对期望/现实不匹配的猜测:

对于读取基准测试(从 8 GB 文件中读取 1 MB 记录的 3 次运行)

ZFS 缓存设备(通常称为“L2ARC”)会在写入或读取块时填充。根据您的描述,我猜测基准测试将文件写入一次,然后按顺序读取 3 次。我希望 L2ARC 在第一次写入期间或至少在您第一次读取数据时复制缓存设备上的块。 (不过,请注意,L2ARC 不会在重新启动后持续存在,因为磁盘上的地图只存储在内存中——这是一种愚蠢的限制,但可能不会影响您的测试。)

您是否使用zfs set secondarycache=all 缓存所有数据块,而不是仅使用metadata 块? (只是为了消除歧义/解释命名,primarycache 属性具有类似的内存缓存设置,也就是“ARC”。)

要检查您的基准测试期间是否使用了 L2ARC,您可以查看arcstat 数据——您会感兴趣的统计数据是:

"l2hits":     [6, 1000, "L2ARC hits per second"],
"l2miss":     [6, 1000, "L2ARC misses per second"],

根据您描述的基准,我预计会看到非常高的命中率(假设您的 SSD 大于 8GB)。

对于写入基准测试(从 8 GB 文件写入 1 MB 记录的 3 次运行)

这只有在您还添加 SSD log 设备(通常称为“ZIL”,就像您在其中一个 cmets 中提到的那样)时才会有所帮助。我会将你的 SSD 分成两个分区:一个非常小的分区用作 ZIL(假设你没有调整文件系统,只需要存储足够的数据来缓存大约 10 秒的写入),另一个使用驱动器的其余部分作为一个 L2ARC。

为了解决您发现的关于除非您拥有强大的大型服务器否则不使用 ZIL 的建议,我认为没有任何理由不在小型系统上使用 ZIL。我猜它占用了一些本来可以用于读取缓存的额外 SSD,但它不使用额外的 RAM 或显着数量的额外 CPU,因此它可以有效地加快你的写入延迟/突发吞吐量,而不会产生不利影响副作用。

【讨论】:

  • 感谢您到目前为止的回答。二级缓存设置为全部,它表示这是默认设置。我从使用 phoronix-test-suite 切换到手动运行类似的基准测试,因为它可以更轻松地切换到仅运行读取并确保使用相同的文件。这使得结果更加可预测,并且它们在随后的运行中有所改进,但仍然更符合硬盘性能(读取时为 68.5 MBytes/s)。这似乎得到了以下事实的证实:arcstat -f l2hits,l2miss 在只读运行期间似乎根本不起作用,在原始写入/读取期间仅显示 1-5 并且大部分为零。
  • 对此有什么想法吗?尚未使用 ZIL 进行测试。
  • 我阅读了有关 L2ARC 的更多详细信息,显然它不像我想象的那样具有确定性。 (有关原作者的详细信息,请参阅here。)听起来您可能只需要让系统运行,阅读这些块更长的时间,才能看到好处。在那篇文章中,它还提到顺序工作负载不会从 L2ARC 中受益;不过,我通读了代码,并没有看到任何关于此的规定。也许那被撕掉了,我不确定。
  • 嗯,我可以复制一个系统,或者 iozone 也有可能在一段时间内进行随机读/写(来自同一个文件),所以这可能是一个选项。你认为从什么时候开始算作顺序的?我在 bcache 文档(与缓存相关)中读到,它们默认处理顺序(我认为这意味着大、连续)写入的方式不同,但取决于大小,这可以被禁用或没有意义,就像当我有一个 120 GB 或更多的 ssd(例如,一个 2-4TB 的硬盘),那么为什么不应该在将 8GB 文件传输到硬盘之前对其进行缓存?
  • 更多信息:这里pthree.org/2013/04/19/… ZIL 更多地被描述为备份,它只是将 ZIL 从 hdd/ram 移动到 SSD,但本质上只是一个备份,所以它是仅在系统中断且数据尚未写入硬盘时使用,否则从未使用。
猜你喜欢
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 2015-08-18
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多