我们有一个由两个 OpenSolaris 2009.06 NFS 服务器管理的光纤通道。
几个月前安装了缓慢的 50TB 服务器并且运行良好。用户填满 2TB。我做了一个小实验(创建了 1000 个文件系统,每个文件系统有 24 个快照)。一切都包括创建、使用快照访问文件系统以及 NFS 挂载其中的一些。
当我尝试销毁 1000 个文件系统时,第一个 fs 花费了几分钟,然后未能报告 fs 正在使用中。我发出了系统关闭的命令,但用了 10 多分钟。我没有再等下去,关掉了电源。
现在,在引导时,OpenSolaris 挂起。32 个驱动器上的指示灯快速闪烁。我离开了它 24 小时 - 仍然闪烁,但没有任何进展。
在创建 zpool 并尝试导入 zpool 之前,我启动了一个系统快照。
pfexec zpool import bigdata
Run Code Online (Sandbox Code Playgroud)
相同的情况:LED 闪烁,导入永远挂起。
跟踪“zpool import”进程只显示ioctl系统调用:
dtrace -n syscall:::entry'/pid == 31337/{ @syscalls[probefunc] = count(); }'
ioctl 2499
Run Code Online (Sandbox Code Playgroud)
有没有办法来解决这个问题?编辑:是的。将 OpenSolaris 升级到 svn_134b 就成功了:
pkg publisher # shows opensolaris.org
beadm create opensolaris-updated-on-2010-12-17
beadm mount opensolaris-updated-on-2010-12-17 /mnt
pkg -R /mnt image-update
beadm unmount opensolaris-updated-on-2010-12-17
beadm activate opensolaris-updated-on-2010-12-17
init 6
Run Code Online (Sandbox Code Playgroud)
现在我有了 zfs 版本 3。Bigdata zpool 保持在版本 14。它又重新投入生产!
但是超过 24 小时(在软件升级之前)的大量 I/O 访问在做什么?
使用 ZFS,您真的希望让它直接操作磁盘,因为它提高了并发性。你给它的单个 50TB 磁盘是一个瓶颈。
该 DTrace 脚本仅跟踪系统调用。真正的动作发生在内核内部,如果您想查看消耗大部分 CPU 的内容,请使用 DTrace Toolkit 中的“hotkernel”脚本。
导入池时,ZFS 从磁盘读取配置并对其进行验证。导入池后,它将开始挂载您创建的所有 1000 多个文件系统和快照。这可能需要一段时间。如果您启用了重复数据删除(自从您使用 snv_111 以来您没有启用),则需要更多时间,因为它必须加载重复数据删除表 (DDT)。
关闭系统从来都不是一个好的选择,特别是在 OpenSolaris snv_111 上。您尚未发布池配置(zpool 状态),但是,如果您有 slog 设备并且它们出现故障,则您将无法导入池(最近在 Solaris 11 Express snv_151a 中已解决此问题)。
我的建议是您单独导出 32 个磁盘中的每一个并创建多个 raidz2 vdev,这样您就有更多的读/写磁头。不要用超过 8 个磁盘创建巨大的 vdev,因为性能会很糟糕。
如果您无法承受系统停机这么长时间(大多数人不会),请仔细研究 ZFS 快照以及如何使用 zfs 发送/接收将它们复制到远程服务器。这将允许您快速启动故障转移服务器。