我正在使用原生 ZFS,并从 PPA 安装“Linux 上的 ZFS”这里。设置没有问题,我正在使用两个 WD 4TB Red HDD 的镜像配置。不幸的是,我遇到了性能问题,当写作到磁盘阵列。当读取性能正常时。
我遇到的问题是,在对阵列进行大量写入时,复制过程每 5 秒就会停滞到约 5-10MB/s,rsync 报告如此。停滞之间的速度约为 75MB/s,这与其他文件系统一致,也是我对系统的期望(我尝试了 btrfs,速度约为 85MB/s)。查看后iotop
我发现复制停滞与txg_sync
执行/占用 I/O 的过程相吻合。这个问题似乎是“突发”I/O 的问题,这似乎是 ZFS 的常见问题(请参阅这里和这里)。我已应用第一个链接中的选项
options zfs zfs_prefetch_disable=1
这在一定程度上缓解了性能问题,但并没有彻底解决这些问题。5 秒间隔txg_sync
似乎是 vfs.zfs.txg.timeout="5"(例如 5 秒)的间隔,这是 Linux 上 ZFS 的默认设置。
这是正常现象吗?还是我可以尝试其他设置?如果是,有什么建议吗?请注意,我在两个链接中都找不到很多选项...
编辑2:再补充一点:我使用的系统是 HP ProLiant Microserver N36L,我将其升级到 8GB ECC RAM。我用于创建 ZFS 卷的命令在此处给出。请注意,我使用-o ashift=12
我发现的命令(在 zfsonlinux FAQ 上找到)应该可以让 ZFS 与 4096Byte 高级格式磁盘块很好地配合使用。
$ zpool create -o ashift=12 -m /zpools/tank tank mirror ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0871252 ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E3PKP1R0
$ zfs set relatime=on tank
$ zfs set compression=lz4 tank
$ zfs create -o casesensitivity=mixed tank/data
添加了使更改永久生效zfs_prefetch_disable
的选项:/etc/modprob.d/zfs.conf
options zfs zfs_prefetch_disable=1
以便:
$ cat /sys/module/zfs/parameters/zfs_prefetch_disable
1
编辑1:根据要求,我添加了zpool get all
输出。请注意,我忘了提及我在池上启用了压缩...
$ zpool get all
NAME PROPERTY VALUE SOURCE
tank size 3.62T -
tank capacity 39% -
tank altroot - default
tank health ONLINE -
tank guid 12372923926654962277 default
tank version - default
tank bootfs - default
tank delegation on default
tank autoreplace off default
tank cachefile - default
tank failmode wait default
tank listsnapshots off default
tank autoexpand off default
tank dedupditto 0 default
tank dedupratio 1.00x -
tank free 2.21T -
tank allocated 1.42T -
tank readonly off -
tank ashift 12 local
tank comment - default
tank expandsize 0 -
tank freeing 0 default
tank feature@async_destroy enabled local
tank feature@empty_bpobj active local
tank feature@lz4_compress active local
答案1
Pacoman,似乎因为您在镜像中有两个 WD-RED 驱动器,将 ZIL 一致性组写入磁盘的 IO 会导致高 IO。总是有一个 ZIL(写入缓存)。如果您没有任何 LOG 设备,则日志设备位于池本身上,并且可以大到最大写入速度 * 5 秒。您可能从 ZIL 读取,并每 5 秒将数据提交到永久存储。问题:
- 您有 SLOG 设备吗?理想情况下是 DRAM 驱动器(HGST ZeusRAM 等...)。
- 您有缓存设备可供读取吗?理想情况下,一堆闪存,例如 480GB PCIe 卡。
我的建议是在池之外的某个地方创建 SLOG(即使是启动设备也比没有好,假设它没有闪烁)。这样您就不必每 5 秒密集地读取和写入镜像。