首先介绍一下背景:我在一家运行 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
。原因如下。您可能需要擦除卷并重新开始(我绝对建议这样做)。