概括:
我已经设置了一个由 4 个 HDD 和两个 SSD 缓存设备组成的 RAIDZ 阵列,但在缓存提升和总体性能方面并没有获得预期的结果。而且,有些事情似乎说不通。
背景和配置:
我正在设置一个用于研究的分析工作站:Ryzen 7 1800X、64GB ECC RAM、GFX 1080Ti、Tesla K40(感谢 NVIDIA)。它被设置为通用,将有 CPU 和 GPU 计算,并且一些数据集由非常大的文件组成(50-100 个文件,每个 10-30GB)。由于并行化,有时会同时访问一些文件。是RAM 密集型工作,但并非所有工作都是如此,因此在某些情况下 ZFS 会有足够的 RAM 可用,但并非总是如此(不过,对于下面描述的 500GB l2arc,5-10GB 就足够了)。
我有 2 个 ✕ 2TB SSD(三星 850 EVO)和 4 个 8TB HDD(WD Red)。3.5TB 的 SDD 将用作 RAID0,其余 2*250GB 可用作 ZFS 的缓存。对于第一次测试,我已将它们添加为 4 个 HDD 上的 RAIDZ 的两个缓存设备。
布局如下:
#zpool 状态 -v [sudo] 管理员密码: 池:数据 状态: 在线 扫描:未请求 配置: 名称 状态 读写 CKSUM 数据在线 0 0 0 raidz1-0 在线 0 0 0 ata-WDC_WD80EFZX-68UW8N0_VJGSE7NX 在线 0 0 0 ata-WDC_WD80EFZX-68UW8N0_VJGSDP4X 在线 0 0 0 ata-WDC_WD80EFZX-68UW8N0_VJGSBYHX 在线 0 0 0 ata-WDC_WD80EFZX-68UW8N0_VJGSDDAX 在线 0 0 0 缓存 ata-Samsung_SSD_850_EVO_2TB_S2RMNX0HC00789R-part1 在线 0 0 0 ata-Samsung_SSD_850_EVO_2TB_S2RMNX0HC00792H-part1 在线 0 0 0
测量和命令输出:
我生成了一个随机文件(为了解决压缩问题),性能相当不错:
# dd if=<(openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero) of=filename bs=1M count=100000 iflag=fullblock
100000+0 records in
100000+0 records out
104857600000 bytes (105 GB, 98 GiB) copied, 199,795 s, 525 MB/s
现在,我期望如果经常访问此文件,它将进入我的缓存 (l2arc,AFAIU)。然而,这实际上并没有发生(非常有效):
for i in 1 2 3 4;do dd if=filename of=/dev/null bs=1M iflag=fullblock;done
100000+0 records in
100000+0 records out
104857600000 bytes (105 GB, 98 GiB) copied, 252,751 s, 415 MB/s
100000+0 records in
100000+0 records out
104857600000 bytes (105 GB, 98 GiB) copied, 215,769 s, 486 MB/s
100000+0 records in
100000+0 records out
104857600000 bytes (105 GB, 98 GiB) copied, 227,668 s, 461 MB/s
100000+0 records in
100000+0 records out
104857600000 bytes (105 GB, 98 GiB) copied, 224,469 s, 467 MB/s
问题:
为什么我的读取性能低于写入性能?写入不应该收敛到 3 个磁盘的速度,读取不应该收敛到 4 个磁盘的速度,就像 RAID5 一样吗?
为什么 l2arc 不起作用?经过多次读取且没有读取其他数据后,我原本希望读取性能与 SSD RAID0 的 1GB/秒类似。
为什么 zpool iostat 报告单个设备的读取带宽如此之低?我多次运行这个命令(这是上次运行的结果),结果总是差不多。硬盘驱动器的读取带宽总计约为 160MB/s,而 dd 报告的读取带宽超过 400MB/s:
# zpool iostat -v 容量操作带宽 池分配空闲读写读写 --------------------------------------------------- ----- ----- ----- ----- ----- ----- 数据 136G 28.9T 1.31K 152 167M 14.9M raidz1 136G 28.9T 1.31K 152 167M 14.9M ata-WDC_WD80EFZX-68UW8N0_VJGSE7NX - - 571 66 46.0M 5.18M ata-WDC_WD80EFZX-68UW8N0_VJGSDP4X - - 445 59 44.9M 5.18M ata-WDC_WD80EFZX-68UW8N0_VJGSBYHX - - 503 66 40.2M 5.18M ata-WDC_WD80EFZX-68UW8N0_VJGSDDAX - - 419 62 39.4M 5.18M 缓存 - - - - - - ata-三星_SSD_850_EVO_2TB_S2RMNX0HC00789R-第 1 部分 34.0G 216G 1 266 8.23K 33.1M ata-三星_SSD_850_EVO_2TB_S2RMNX0HC00792H-部分1 34.0G 216G 1 266 7.80K 33.0M --------------------------------------------------- ----- ----- ----- ----- ----- -----
这里是不是有什么根本性的错误,还是我误解了什么?我应该将部分 SSD 用于 ZIL 吗?我还可以从 OS M.2 SSD 中腾出几十 GB 用于此。至少如果我可以添加一个 LVM 设备,因为现在,它全部由 Kubuntu 安装声明。我还没有这样做,因为我知道这只会对小的、同步的写入有帮助,而我并不真正期望这一点。大多数情况下,更大的日期将被连续写回。
为什么缓存看起来像一个名为cache的池,而不是属于池数据的东西?我使用了:
zpool add data cache [devices]
所以它应该属于数据池,不是吗?
答案1
RAIDZ1 性能与传统 RAID5 相比
为什么我的读取性能低于写入性能?写入不应该收敛到 3 张光盘的速度,而读取不应该收敛到 4 张光盘的速度,就像 RAID5 一样吗?
请参阅此主题服务器故障:
具有一个奇偶校验驱动器的 RAIDZ 将为您提供单个磁盘的 IOPS 性能,但提供单个磁盘的 n-1 倍总带宽。
还有这条评论:
我在这方面有丰富的经验,并且可以向您确认,在大多数情况下,RAIDZ 的性能不会优于传统 RAID5/6 等效阵列中相同数量的磁盘。
您的磁盘可以连续维持约 145 MB/s,因此您的理论结果应为 435 MB/s。我认为这与您的结果非常接近。
用于顺序读取的 L2ARC 缓存
为什么 l2arc 不起作用?经过多次读取且没有读取其他数据后,我原本期望读取性能与 SSD RAID0 的 1GB/s 类似。
看一下此邮件列表帖子:
ARC 是否满足缓存需求?
和
Marty Scholes 发表 有些读取是连续的吗?连续读取不会进入 L2ARC。
因此,您的主要原因是:
- 您的(随机)负载已由 ARC 提供,因此不需要 L2ARC(因为您的数据始终相同,并且可以完全保留在 ARC 中)。其背后的想法是:ARC 比 L2ARC 快得多(RAM 与 SSD),因此您的读取首选始终是 ARC,您只需要 L2ARC,因为您的活动数据对于内存来说太大,但旋转磁盘上的随机磁盘访问太慢。
- 您的基准测试本质上是顺序的,因此不由 L2ARC 提供服务。其背后的想法是:顺序读取会毒害缓存,因为单个大文件读取会完全填满缓存并删除其他用户的数百万个小块(ZFS 针对许多用户的并发随机访问进行了优化),但不会影响第一次读取的速度。第二次读取时速度会加快,但通常您不会读取两次大文件。也许您可以使用 ZFS 可调参数来修改行为。
各种问题
我应该将部分 SSD 用于 ZIL 吗?
单独的 SLOG 设备只会对随机同步写入有帮助,没有其他帮助。要测试这一点非常简单 - 将基准文件系统属性设置sync
为disabled
:zfs set sync=disabled pool/fs
,然后再次进行基准测试。如果您的性能现在突然很好,您将受益。如果它没有太大变化,您就不会受益。
PS:为什么cache看上去像是一个叫cache的池子,而不是属于池子里的数据呢?
我认为之所以如此,是因为这些额外的设备(备用设备、缓存、slog 设备)也可以由多个 vdev 组成。例如,如果您有一个镜像 slog 设备,那么您将拥有与普通磁盘相同的 3 个级别(日志 - 镜像 - 磁盘 1/磁盘 2)。