当他们的二进制文件在NFS上时,守护进程会因为总线错误而死

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

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

在NFS服务器上更新二进制文件时,以前运行的守护进程有时会因总线错误而死机。 我假设发生了什么事是NFS服务器以NFS客户端上的VFS层不可见的方式replace二进制文件,所以他们最终从更新的二进制文件加载页面,这当然会导致疯狂。

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

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

我们发现的最好的解决scheme是始终在名称末尾安装一个版本string,并保持一个指向最新版本的符号链接。

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

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

当您从NFS运行二进制文件时,您的进程会映射版本化的二进制文件名称,新的安装将不会打扰。 它还具有这个整齐的奖金function,您可以运行ps并立即看到哪个版本的二进制文件正在运行。

这是NFS的常见问题。 当你删除这个文件时,现有的NFS连接认为它所拥有的stat表是正确的,重新加载并得到一个总线错误。

你想要做的是移动现有的二进制文件,把新的二进制文件,在每台机器开始使用新的二进制文件后,删除旧的。 Apache在尝试从NFS映射服务器的文件时也会这样做。