我有一个 GlusterFS 2 节点 2 副本设置。我计划将其用作 OpenStack 实例存储,其中存储了 VM 磁盘映像。
根据我的测试,如果虚拟机管理程序当前安装的 GlusterFS 节点发生故障(使用默认的 GlusterFS 设置),连接超时大约需要 45 秒,然后 glusterfs 客户端将故障转移到另一个节点。在这 45 秒内,IO 操作将挂起,从 VM 的角度来看,这意味着磁盘无响应。
我知道对于 Linux,如果磁盘没有响应,过一段时间(我不确定多久)内核会将文件系统重新挂载为只读。
我还可以降低 GlusterFS 卷的值network.ping-timeout
,这将减少故障转移时间。
我的问题是,我应该将这个值设置为多少,以便大多数操作系统可以容忍虚拟磁盘的无响应时间而不会产生副作用?
更准确地说,我想知道 Windows NTFS、FreeBSD UFS/ZFS 和 Linux ext4 可以容忍的磁盘无响应时间。涉及的参数是什么?(例如,/sys/block/sda/device/timeout
在 Linux 上)
相关信息:
更新:@the-wabbit 已经回答了有关 Linux 和 Windows 的问题,我也想知道 FreeBSD 的情况
答案1
磁盘驱动程序通常会等到可配置的超时时间结束之后才会报告所请求操作的错误。
正如您所发现的,这是/sys/block/<devicename>/device/timeout
在 Linux 中,默认为60 30 秒。
Windows 将此配置存储为全局设置TimeoutValue
(REG_DWORD)HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Disk\
默认值为 60 秒。
只要上游没有报告错误,您就不会看到任何立即的操作(例如 FS 的 ro-remount),即使在超时之后,您通常也会看到更多的错误处理程序操作(记录、重置设备等)在错误传回上层之前。
但请注意,还会有其他影响影响整体可用性。
- 应用程序或系统服务可能会实现自己的超时并在到期时抛出异常
- 在请求周转率较高的服务器上,您会看到队列已满且内存耗尽,因为新客户端不断提交新请求,而旧请求仍在等待存储响应。
- 如果恰巧在故障设备上有交换空间,则所有页面输入/页面输出请求都将停止,从而有效地阻止在这些内存页面上工作的进程。
一般来说,您需要尽可能缩短故障转移时间,同时避免因偶尔的负载峰值或网络故障而导致过早故障转移。确定适合您特定用例的正确值需要经过长时间的反复试验。对于通用服务器虚拟机,如果可行且您的基础设施支持,我的目标是 10 秒左右。
答案2
FreeBSD 有 geom_mountver (https://www.freebsd.org/cgi/man.cgi?gmountver),这可用于使其容忍任何故障转移时间。如果您使用的是 ZFS,则可能需要禁用死机定时器;如果 IO 在 15 分钟内未完成,它将使盒子陷入混乱(IIRC)。