为什么 Linux 上的 ZFS 不从缓存中读取?

为什么 Linux 上的 ZFS 不从缓存中读取?

我设置了一个测试 zpool,其中包含单个 USB 连接的 4TB 旋转磁盘,读取速度约为 40MB/秒。

我有四个约 300GB 快速 SATA2 内部 SSD 设置为该磁盘的缓存。我可以从这个 L2ARC 读取大约 900MB/秒。

我正在从这个池中读取一个大部分静态的 400GB 数据集。

该系统有超过 200GB 的可用内存,我认为对于我们的目的来说,它的运行速度 >1500MB/秒。

Every 1.0s: zpool iostat -y -v 1 1 ; zpool status -v                                                las2: Tue Oct 16 20:20:07 2018

                                                      capacity     operations     bandwidth
pool                                                alloc   free   read  write   read  write
--------------------------------------------------  -----  -----  -----  -----  -----  -----
storage                                              417G  3.22T    239      2  29.7M   132K
  usb-Seagate_M3_Portable_NM12QHQF-0:0-part1         417G  3.22T    239      2  29.7M   132K
cache                                                   -      -      -      -      -      -
  ata-INTEL_SSDSC2BA400G3_BTTV41450D92400HGN-part3  52.8G   291G     11      0   927K   128K
  ata-INTEL_SSDSC2BA400G3_BTTV423000XA400HGN-part3  52.9G   291G     13      0  1.48M      0
  ata-INTEL_SSDSC2BA400G3_BTTV423406FG400HGN-part3  52.7G   291G      8      0   324K      0
  ata-INTEL_SSDSC2BA400G3_BTTV423406G6400HGN-part3  52.9G   291G      5      0   336K      0
--------------------------------------------------  -----  -----  -----  -----  -----  -----
  pool: storage
 state: ONLINE
  scan: scrub repaired 0B in 1h56m with 0 errors on Sun Oct 14 02:20:56 2018
config:

        NAME                                                STATE     READ WRITE CKSUM
        storage                                             ONLINE       0     0     0
          usb-Seagate_M3_Portable_NM12QHQF-0:0-part1        ONLINE       0     0     0
        cache
          ata-INTEL_SSDSC2BA400G3_BTTV41450D92400HGN-part3  ONLINE       0     0     0
          ata-INTEL_SSDSC2BA400G3_BTTV423000XA400HGN-part3  ONLINE       0     0     0
          ata-INTEL_SSDSC2BA400G3_BTTV423406FG400HGN-part3  ONLINE       0     0     0
          ata-INTEL_SSDSC2BA400G3_BTTV423406G6400HGN-part3  ONLINE       0     0     0

errors: No known data errors

AIUI,读取被缓存到系统内存中的 ARC 中。当达到一定程度的“满”时,这些数据将被移至 L2ARC(1.1TB 快速 SSD)上。

当我从该池上几乎不变的目录之一运行时tar -c . | pv > /dev/null,我看到大约 40MB/秒 - 从底层慢速 HDD 读取的速度。

问题是,我也看到第二次了!有时它会飙升至 80-100MB/秒,但有时也会下降至 10MB/秒。我预计 99% 的读取来自内存或快速 L2ARC。

是什么赋予了?我希望看到 RAM 速度,因为这个盒子有 256GB 的系统内存,其中超过 200GB 是免费的。如果做不到这一点,仍有数百 GB 的 L2ARC 未使用。

我究竟做错了什么?为什么不能以极高的速度(>1GB/秒)从 ARC 读取这些数据?如果做不到这一点,为什么不从 L2ARC 读取它(>500MB/秒)?为什么我在大部分卸载的系统上看到 40-80MB/秒?

Ubuntu bionic 18.04.1 x86_64 system.

Linux las2 4.15.0-36-generic #39-Ubuntu SMP Mon Sep 24 16:19:09 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

zfs-auto-snapshot/now 1.2.4-1 all [installed,local]
zfs-zed/now 0.7.5-1ubuntu16.4 amd64 [installed,local]
zfsutils-linux/now 0.7.5-1ubuntu16.4 amd64 [installed,local]

答案1

这里有两个问题。

首先,您的数据集不适合内存,并且会根据 LRU(最近最少使用)被驱逐。这意味着,在运行完整个数据集后,如果您从头开始,则您要查找的内容都不会在 ARC 中。

第二个问题是 L2ARC 的填充方式并不像您想象的那样。当数据从 ARC 中逐出时,它会被填充,但填充率会受到限制。我相信默认限制是 8MB/S,这会对您的第二次读取产生很小的影响。为了解决这个问题,我相信您应该检查“l2arc_write_max”和“l2arc_write_boost”ZFS 参数。

相关内容