如何使用缓存驱动器测量 zfs 的缓存性能

How to measure cache performance of zfs with cache drive

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

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

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

现在,可能是因为 zfs 缓存和类似缓存的工作方式 - 它们无法通过如此简单的测试捕获 - 但是,哪种测试是捕获缓存优势的好测试?但是,由于测试文件很容易放在缓存ssd上,为什么不先写入那里,然后运行在后台转回hdd?

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

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

对于读取基准(从 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",就像您在其中一条评论中提到的那样),这只会有所帮助。我将您的 SSD 分成两个分区:一个非常小用作 ZIL(假设您没有调整文件系统,只需存储足够的数据来缓存约 10 秒的写入),另一个使用驱动器的其余部分作为L2ARC.

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