NFS 缓存:文件内容在服务器上修改后未在客户端更新

NFS 缓存:文件内容在服务器上修改后未在客户端更新

这是我的设置:一台 NFS 服务器机器(v4),几台 NFS 客户端机器。

当客户端机器将文件写入 NFS 挂载时,其他客户端会立即看到新内容:没问题。

但是,当服务器机器修改文件的内容时,直到我ls从客户端执行目录操作后,新内容才会显示在客户端上。

我对这种不一致感到非常困惑......如能得到任何帮助我将非常感激!

信息:

  • 客户端和服务器上的 nfs 1.2.3-r1
  • acregmin、acregmax、acdirmin、acdirmax、lookupcache:默认值

答案1

根据您的评论添加答案。
解决方案是添加lookupcache=none到您的 nfs 挂载选项中。

实际情况是,您的客户端第一次读取文件时,它会进行 NFS 查找以获取 NFS 文件 ID。然后,它会缓存 NFS 文件 ID,当您返回打开文件时,它会使用缓存。通常这不是问题,因为当文件更新时,其文件 ID 保持不变。但由于某种原因,旧文件被删除,并创建一个新文件(或重命名,或将其更改为非同一文件)。
现在通常这也不是问题,因为当您的客户端尝试打开不存在的文件 ID 时,它会从服务器收到错误并进行另一次查找以获取新文件 ID。但出于某种原因,NFS 服务器允许客户端打开该旧文件 ID。也许另一个客户端已打开该文件,因此它尚未被删除,我不知道。

无论如何,解决这个问题的方法是告诉客户端在打开文件之前始终使用 nfs mount 选项执行 nfslookup lookupcache=none。 缺点是,如果您频繁打开文件,则可能会很昂贵,因为它会增加 NFS 服务器的流量。

答案2

您还可以使用以下方式手动刷新 NFS 缓存

sudo mount /nfs-mount -o remount

...如果您不想添加任何降低性能的安装选项。

答案3

将安装选项更改为hard,intr。我认为您的系统中的默认值可能很软。这会有所帮助。

相关内容