为什么当“正常”文件系统完全缓存此工作负载时,zfs 却无法缓存它?

为什么当“正常”文件系统完全缓存此工作负载时,zfs 却无法缓存它?

更新:由于 recordsize 默认为 128k,测试程序读取的数据量比 8GB 系统上的 ARC 大得多,但仍然比 16GB 系统上的 ARC 略大。减小 recordsize 可以读取更少的数据,因此它适合 ARC。我低估了读取的数据的大小以及 recordsize 对此的影响,因此得出了一些错误的结论。到目前为止,在这种情况下禁用预取似乎没有太大区别,尽管我将尝试启用和不启用预取的所有 recordsize 选项。

此负载类似于 IMAP/Maildir 场景,其中包含许多目录、许多文件,并且可能仅从每个文件读取少量数据。

我已经使用 FreeBSD 10 和 Fedora 19 以及 zfsonlinux 进行了测试。我已经测试了各种 Linux 原生文件系统,如 extX/xfs/jfs 甚至 btrfs。在 FreeBSD 上,我也使用原生 ufs 文件系统进行了测试。我的工作量只是使用 amarok/winamp/etc 扫描一个较大的音乐集合。我的测试程序是 amarok_collectionscanner,因为它可以轻松地从命令行运行。模式始终相同。集合扫描器的初始运行大约需要 10 分钟,具体取决于文件系统,但 ZFS 的性能与非 ZFS 文件系统类似

使用非 zfs 文件系统,后续扫描运行速度非常快,通常大约需要 30 秒。ZFS 在后续运行中只取得了微小的改进。从观察 iostat 也可以明显看出,在非 ZFS 文件系统上初次运行后,操作系统不会触碰磁盘。一切都在文件系统缓存中。

使用 ZFS 的 SSD 缓存可以缩短时间,但永远不会接近 30 秒。

为什么 ZFS 不缓存此负载?我探索的一种可能性是 ARC 的大小被限制为小于非 ZFS 文件系统允许用于缓存的大小。我在一台机器上再次进行了测试,该机器的 ARC 可用内存比第一个测试系统上的全部可用内存还多,数字保持不变。

我希望找到/创建一个可以重复这种负载的 fio 配方。基本上,它需要创建数千个较小的文件,扫描所有目录以查找文件,打开每个文件并从每个文件中读取少量数据。它就像世界上最糟糕的数据库!我接下来可能会测试 OpenIndiana,但我希望结果是一样的。

数据集为 353GB,包含 49,000 个文件。测试系统有 8GB-16GB 的 RAM。zpool 配置几乎没有什么区别,但我关心的测试始终只是一整块磁盘。我使用了 ST3500630AS 和 WDC WD20EZRX-00D8PB0 以及其他驱动器。驱动器几乎没有区别。RAM 数量或 CPU 速度几乎没有区别。只有使用的文件系统会明显改变结果,而且正如我上面提到的,这些差异相当大。我实际上拥有大量关于我尝试过的各种文件系统参数的数据点,这些是我检查的一些变量:mdadm raid 配置(0 和 1)zpool 配置、镜像和条带 zfs recordsize mdadm 块大小文件系统块大小

在单个 ST3500630AS 驱动器上,我获得了以下文件系统的默认文件系统选项的这些数字。这是在 Fedora 19、8GB RAM、3.11.10-200 内核、ZFS 0.6.2-1 上进行的。这些值以秒为单位。后续扫描在未尝试清除缓存的情况下运行。

ZFS: 900, 804, 748, 745, 743, 752, 741
btrfs: 545, 33, 31, 30, 31, 31
ext2: 1091, 30, 30, 30, 30, 30...
ext3: 1014, 30, 30, 30, 30, 30...
ext4: 554, 31, 31, 32, 32, 31, 31...
jfs: 454, 31, 31,31,31...
xfs: 480, 32, 32, 32, 32 ,31 ,32, etc.

在 FreeBSD 10 上,单驱动器 WD20EZRX-00D8PB0,更快的机器,16GB 内存,ARC 允许增长到 12GB:

ufs: 500, 18, 18...
zfs: 733, 659, 673, 786, 805, 657

尽管上述变量有时会对数据的初始冷缓存扫描产生影响,但后续运行看起来都一样。标准文件系统会缓存所有内容,因此只要没有其他东西破坏缓存,其性能就会飞快。ZFS 不会表现出这种行为。

答案1

atime如果尚未完成,请先禁用。

您可能还会调查设置primarycache=metadata影响。

答案2

在 FreeBSD 上,安装 sysutils/zfs-stats

该软件包中的“zfs-mon”工具将为您提供有关 ZFS 中每种不同类型的缓存(ARC、ARC 元数据、ZFETCH、预取等)的缓存命中/未命中率的详细信息。

此外,扫描时使用“zpool iostat 1”可能会有帮助

默认情况下,“元数据”缓存限制为 ARC 的 1/4,您可以使用 vfs.zfs.arc_meta_limit loader.conf 可调参数调整此值

在 FreeBSD 10 中,ARC 统计信息包含在“top”中,观察扫描时这些值如何变化可能会提供一些见解

相关内容