该池由两块硬盘(WD Red 3 TB,5200 RPM?,最大传输速率 147 MB/s 和 Verbatim(东芝)3 TB,7200 RPM)组成raidz1-0
。它有 2.25 TB 的数据,复制到两个磁盘上,因此总量为 4.5 TB。创建池时我没有指定值ashift
。
zpool status
显示“扫描:scrub 于 2021 年 1 月 3 日(星期日)13:58:54 在 32 小时 43 分钟内修复了 0 个错误,共计 0 个”。这意味着扫描速度仅为4.5e6 / (32.717 * 60 * 60) = 38.2 MB / s
。我预计至少 2 x 100 或高达 2 x 200 MB/s,尽管 WD 磁盘比其他磁盘慢一些。
磁盘的 SMART 数据显示一切正常。它们的通电时间为 6.5 - 7 年,但启停次数只有约 200 次。
所以主要问题:什么原因可能导致读取性能不佳?
奇怪的是zdb
,显示池使用路径/dev/disk/by-id/ata-WDC_WD30EFRX-xyz-part1
而不是/dev/disk/by-id/ata-WDC_WD30EFRX-xyz
。fdisk -l /dev/disk/by-id/ata-WDC_WD30EFRX-xyz
提到“分区 1 不是从物理扇区边界开始的”,但我读到它只会损害写入性能。我可能会尝试通过移除设备并使用正确的全磁盘路径将其添加回来来解决此问题,因为数据是重复的(并备份)。
该池有 710 万个文件。我sha1sum
通过 清除缓存后测试运行了一个 14276 MB 的文件/proc/sys/vm/drop_caches
,耗时 2 分 41 秒,读取速度为 88.5 MB/s。
dd bs=1M count=4096 if=/dev/disk/by-id/ata-WDC_WD30EFRX-xyz of=/dev/null
报告速度为 144 MB/s,使用时ata-WDC_WD30EFRX-xyz-part1
报告速度为 134 MB/s,ata-TOSHIBA_DT01ACA300_xyz
报告速度为 195 MB/s。
我的 NAS 运行的是相当旧的软件版本:
$ modinfo zfs
filename: /lib/modules/3.11.0-26-generic/updates/dkms/zfs.ko
version: 0.6.5.4-1~precise
license: CDDL
author: OpenZFS on Linux
description: ZFS
srcversion: 5FC0B558D497732F17F4202
depends: spl,znvpair,zcommon,zunicode,zavl
vermagic: 3.11.0-26-generic SMP mod_unload modversions
它有 24 GB 的 RAM,其中 8 GB 为 JVM 保留,其余的可以免费使用。虽然看起来似乎没有那么多是免费的:
$ free -m
total used free shared buffers cached
Mem: 23799 21817 1982 0 273 1159
-/+ buffers/cache: 20384 3415
Swap: 7874 57 7817
编辑1:
我使用 进行了一些测试bonnie++
,在 RAIDZ 上使用单个 4 GB 文件:写入 75.9 MB/s,重写 42.2 MB/s,读取 199.0 MB/s。我假设我从“千字符/秒”进行了正确的转换。
啊,刚才我意识到并行清理所花的时间与最慢的 5400 RPM 磁盘一样长,7200 RMP 的清理速度(可能)更快并不重要。
编辑2:
我将池中的文件数量从 710 万减少到 450 万(-36.6%),清理时间从 32.72 小时减少到 16.40 小时(-49.9%)。由于我只是将这些小文件放入低压缩的 ZIP 中,因此数据量相同。
我还将recordsize
从 128k 增加到了 512k,不知道在这种情况下这是否会有所不同。其他预先存在的数据没有受到影响,因此它们保留了原始数据recordsize
。哦,并/sys/module/zfs/parameters/zfs_scan_idle
设置为2
。
答案1
您正在使用哪个版本的 ZFS?
0.8.x 之前的版本通过遍历所有元数据和数据(因为它们在磁盘上排列)来执行清理。这会导致多次寻道,从而降低机械磁盘的性能。如果与包含数百万个小文件的低性能 5K RPM 磁盘一起使用,则意味着清理/重新镀银时间非常长。使用这些较旧的 ZFS 版本,您可以调整一些 ZFS 可调参数;例如:
echo 0 > /sys/module/zfs/parameters/zfs_resilver_delay
echo 0 > /sys/module/zfs/parameters/zfs_scan_idle
请注意,增加清理优先级会导致应用程序性能下降。
0.8.x 使用批量清理方法,即以较大的批次收集元数据,然后才扫描相关数据。这样清理速度会更快(即时间缩短一半),无需调整任何内容(上述旋钮甚至不再存在)。
因此,提高清理/重新镀银速度的更有效方法可能是更新您的 ZFS 版本。