Ubuntu 14.04 上 ZFS 0.6.3 的 txg_sync 导致性能缓慢

Ubuntu 14.04 上 ZFS 0.6.3 的 txg_sync 导致性能缓慢

我正在使用原生 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 秒将数据提交到永久存储。问题:

  1. 您有 SLOG 设备吗?理想情况下是 DRAM 驱动器(HGST ZeusRAM 等...)。
  2. 您有缓存设备可供读取吗?理想情况下,一堆闪存,例如 480GB PCIe 卡。

我的建议是在池之外的某个地方创建 SLOG(即使是启动设备也比没有好,假设它没有闪烁)。这样您就不必每 5 秒密集地读取和写入镜像。

相关内容