我有一个“家庭实验室”系统(i3-9300 上的 Ubuntu 22.04,配备 32G ecc-ram,其中 10G 专用于大页面),目前拥有 2 个 zfs raidz1 池,一个池配备 3x2TB WD-RED 和 nvme 作为日志和缓存设备,第二个池配备 3x1TB HDD(计划将其扩展到 3x12TB),目前仅用作备份
bartoszek@home-lab:~$ zpool list -v
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
storage-pool 2.72T 585G 2.15T - - 2% 21% 1.00x ONLINE -
raidz1-0 2.72T 585G 2.15T - - 2% 21.0% - ONLINE
sdb - - - - - - - - ONLINE
ata-WDC_WD10EFRX-68FYTN0_WD-WCC4J7LNUNJS - - - - - - - - ONLINE
ata-WDC_WD10EZEX-00RKKA0_WD-WMC1S5929034 - - - - - - - - ONLINE
system-pool 5.45T 3.46T 1.99T - - 3% 63% 1.00x ONLINE -
raidz1-0 5.45T 3.46T 1.99T - - 3% 63.5% - ONLINE
ata-WDC_WD20EFRX-68EUZN0_WD-WMC4M1371094 - - - - - - - - ONLINE
ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M6HSDJXY - - - - - - - - ONLINE
ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M1628970 - - - - - - - - ONLINE
logs - - - - - - - - -
nvme0n1p2 15.5G 1.42M 15.5G - - 0% 0.00% - ONLINE
cache - - - - - - - - -
nvme0n1p3 64.0G 54.6G 9.44G - - 0% 85.2% - ONLINE
整个系统主要用于 Nextcloud、Plex、zoneminder 和一些虚拟化(GPU 直通到 Windows10 vm,还有一些其他东西),所以没什么特别的(请注意没有 torrent)
由于我的某些用例需要大量 RAM 才能工作(VM/Zoneminder),因此我的 ZFS 缓存资源有限(目前没有扩展 RAM 的计划),因此我想从我目前拥有的硬件中榨取尽可能多的性能。我的工作量基本上可以分为两大类,写入大量数据/几乎不读取任何数据或读取一次(zoneminder/plex/备份)和写入一次/读取多次(VM/nextcloud 上的游戏),我决定禁用第一组的缓存并启用其余缓存。所以总结一下
- Nextcloud -> 主缓存=全部 次缓存=全部
- VM -> 主缓存=全部 次缓存=全部
- 其余内容-> primarycache=none secondarycache=metadata
但后来我意识到,第二类可以进一步分为“我需要尽可能快”(Nextcloud)和“只是不要太慢”(偶尔在我的虚拟机上玩游戏)。为了清楚起见,nextcloud 的使用频率并不高,我只是想优先使用 ARC,以便尽可能多地在 RAM 中保存 Nextcloud 数据,同时在 NVME 上缓存游戏数据,因为对我来说更烦人的是 nextcluod 速度慢,然后是一些游戏的加载时间稍长。然后开始通过创建临时数据集进行一些测试
sudo zfs create -o recordsize=1M -o primarycache=none -o secondarycache=all -o mountpoint=/srv/tmp_1M_noprimarycache system-pool/ENC/tmp_1M_noprimarycache
然后为了给它施加一些只读压力,我尝试了
sudo fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test --bs=1024k --iodepth=2 --size=4G --readwrite=randread --loops=10
并且注意到我的缓存设备是较新的(zpool iostat 显示 NVME 驱动器上没有 IO)我猜想这是因为 L2ARC 由主 ARC 的“drops”提供,但为什么这种配置有效?以及如何配置 ZFS 以在没有主 ARC 的情况下使用 L2ARC?
答案1
快速回答我的问题,L2ARC 充满了从 ARC 中删除的数据,因此没有 ARC 就不可能有 L2ARC