我设置了一个测试 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 参数。