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

时间:2018-09-05 12:53:26

标签: caching zfs

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

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

然后,我运行了带有iozone或iozone的phoronix测试套件。经过一开始的不熟悉之后,我选择了phoronix-test-suite run-default pts/iozone,然后我只运行了一个硬盘,一个ssd和一个以ssd作为缓存的hdd分区。并在两台具有ssd进行比较的笔记本电脑上。在使用zfs +缓存的测试中,仅使用HDD几乎没有区别。真的很慢。而且我确保将工作目录设置为zpool并验证是否在其中创建了临时文件,还检查了zpool iostat以确保该池正在工作。 现在,尽管我可能会怀疑结果较低,但我希望速度至少应该稍慢一些,尤其是在进行“简易”测试时,这种测试只需进行3次从8 GB文件中读取1 MB记录的操作,然后运行3次从8 GB的文件中写入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

1 个答案:

答案 0 :(得分:1)

这是我对期望/现实的不匹配之处的猜测:

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

在写入或读取块时,将填充ZFS高速缓存设备(通常称为“ L2ARC”)。根据您的描述,我猜测基准测试将文件写入一次,然后依次读取3次。我希望L2ARC在第一次写入时或至少在第一次读取数据时会在缓存设备上复制这些块。 (不过,请注意,L2ARC在重新启动后仍无法持久存在,因为磁盘上的内容仅存储在内存中,这是一个愚蠢的限制,但可能不会影响您的测试。)

您是否使用zfs set secondarycache=all来缓存所有数据块,而不是metadata块? (只是为了消除歧义/解释其命名,primarycache属性在RAM中的高速缓存(也称为“ ARC”)中具有相似的设置。)

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

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

根据您所描述的基准,我希望看到很高的命中率(假设您的SSD大于8GB)。

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

仅当您还添加SSD log设备(如注释之一中提到的那样通常称为“ ZIL”)时,此方法才有帮助。我将您的SSD分为两个分区:一个分区很小,可以用作ZIL(假设您尚未调整文件系统,只需存储足够的数据即可缓存约10秒钟的写入操作),另一个分区则将其余驱动器用作一个L2ARC。

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