当守护进程的二进制文件位于 NFS 上时,它们会因总线错误而死亡

当守护进程的二进制文件位于 NFS 上时,它们会因总线错误而死亡

我们有一些守护进程在多个主机上执行。

守护进程可执行映像是托管在 NFS 上的这些非常大的二进制文件。

当 NFS 服务器上的二进制文件更新时,之前运行的守护进程有时会因总线错误而停止运行。我假设发生的事情是 NFS 服务器正在以一种 NFS 客户端上的 VFS 层无法看到的方式替换二进制文件,因此它们最终会从更新的二进制文件中加载页面,这当然会导致混乱。

我们尝试将新的二进制文件移到位而不是 cp,但这似乎并不能解决问题。

我正在考虑在守护进程启动脚本中简单地对二进制文件进行 mlock(),但肯定存在我们应该滥用的神奇 NFS 选项或语义。有没有更好的方法来解决这个问题?

答案1

我们发现的最佳解决方案是始终安装名称末尾带有版本字符串的二进制文件,并维护始终指向最新版本的符号链接。

/mnt/foo/bar -> bar-20111201000000
/mnt/foo/bar-20111201000000
/mnt/foo/bar-20111115000000

当您安装新版本时,您会自动将新的符号链接移到旧版本上。

当您从 NFS 运行二进制文件时,您的进程会映射版本化的二进制文件名称,新安装不会干扰该名称。它还有一个巧妙的附加功能,您可以运行 ps 并立即查看正在运行的二进制文件的版本。

答案2

这是 NFS 的一个常见问题。当您删除文件时,现有的 NFS 连接认为其拥有的统计表是正确的,并重新加载并出现总线错误。

您要做的就是移动现有的二进制文件,将新的二进制文件放到位,在每台机器开始使用新的二进制文件后,删除旧的二进制文件。当 Apache 尝试 mmap 来自 NFS 的服务文件时,如果文件也发生了变化,它也会这样做。

相关内容