Gluster + ZFS,基准测试期间死锁:zfs_iput_taskq 100%cpu

Gluster + ZFS,基准测试期间死锁:zfs_iput_taskq 100%cpu

首先介绍一下背景:我在一家运行 PHP Web 应用程序的公司工作。我们在多个 Web 服务器上通过 NFS 安装了存储后端。今天我们遇到了一个问题,如果一个 Web 服务器通过 NFS 写入文件,有时该文件几分钟后才会出现在其他已安装的客户端上。它也不是冗余的,所以我们无法执行任何“隐形”维护。

我一直在考虑迁移到 GlusterFS 解决方案(两个或三个复制的砖块/机器以实现冗余)。现在,使用 XFS 作为 Gluster“后面”的存储文件系统效果很好,性能也很好。Gluster 似乎也没有上面提到的同步问题。

但是,我想使用 ZFS 作为后端文件系统,原因是;

  • 廉价压缩(目前存储 1.5TB 未压缩数据)
  • 非常容易“实时”扩展存储卷(一个命令,相比 LVM 混乱)
  • 快照、位腐烂保护和所有其他 ZFS 优点。

在我的解决方案演示设置中,我有三台带有复制 Gluster 的服务器,每台服务器的单独磁盘上都有一个 ZFS 后端池。我使用的是 CentOS 6.5,Linux 上的 ZFS(0.6.2)+ GlusterFS 3.4。我也尝试过使用 Ubuntu 13.10。一切都在 VMware ESX 中。

为了测试此设置,我已经通过 Gluster 安装了卷,然后运行 ​​BlogBench(http://www.pureftpd.org/project/blogbench) 来模拟负载。我遇到的问题是,在测试结束时,ZFS 存储似乎陷入了死锁。所有三台机器的“zfs_iput_taskq”都以 90-100% 的 CPU 运行,测试冻结。如果我中止测试,死锁不会消失,唯一的选择似乎是硬重启。

我努力了:

  • 禁用时间
  • 禁用调度程序(noop)
  • 不同的压缩/无压缩
  • ZFS 上直接运行的 Blogbench 很好
  • Gluster + XFS 上的 Blogbench 作为后端运行良好

有什么想法吗?我是否应该放弃 ZFS 并使用其他方案?替代方案?

问候奥斯卡

答案1

Linux 上的 ZFS 需要进行一些基本调整才能在负载下正常运行。ZFS ARC 和 Linux 虚拟内存子系统之间存在一些矛盾。

对于您的 CentOS 系统,请尝试以下操作:

创建/etc/modprobe.d/zfs.conf配置文件。该文件在模块加载/启动期间读取。

添加如下内容:

options zfs zfs_arc_max=40000000000
options zfs zfs_vdev_max_pending=24

其中 zfs_arc_max 大约占 RAM 的 40%(以字节为单位)(编辑:尝试 zfs_arc_max=1200000000)。zfs_vdev_max_pending 的编译默认值为 8 或 10,具体取决于版本。对于 SSD 或低延迟驱动器,该值应较高(48)。对于 SAS,可能为 12-24。否则,保留默认值。

你还需要设置一些底线值/etc/sysctl.conf

vm.swappiness = 10
vm.min_free_kbytes = 512000

最后,使用 CentOS,您可能想要安装tuned并将tuned-utils您的配置文件设置为虚拟访客tuned-adm profile virtual-guest

尝试这些并查看问题是否仍然存在。

编辑:

跑步zfs set xattr=sa storage原因如下。您可能需要擦除卷并重新开始(我绝对建议这样做)。

相关内容