为什么 RAM 缓存的 NFS 文件内容被损坏?

为什么 RAM 缓存的 NFS 文件内容被损坏?

我们有一个 NFS 服务器和几个客户端(Ubuntu 18.04)。有时(很少)客户端在另一个客户端更改文件后会看到损坏的数据。服务器和所有其他客户端都能正确看到该文件。

上下文是一个简单的日常开发人员工作流程情况:我在客户端计算机上的 IDE (PyCharm) 中编辑某个程序的 Python 源代码,然后在终端窗口中通过 SSH 连接到另一台(性能更高)计算机来执行该程序。症状:在文件末尾读取空字节,或者文件被截断(在执行 Python 代码时会导致语法错误。)

我怀疑这是由于缓存中的错误造成的。具体来说,受影响的文件内容仍然被错误地视为旧版本,但是所有元数据都能正确显示作为新版本。

因此,如果其他客户端将文件变小,我们的故障客户端就会将其视为具有旧内容,但突然停止在新大小。如果其他客户端将其变大,则有故障的客户端会看到旧内容,但会在末尾附加一些垃圾内容,大部分是零字节。

我已阅读有关缓存一致性的 NFS 手册页,但问题不在于属性缓存,并且手册页中关于内容缓存的内容不多,可能是因为它不是由 NFS 处理,而是由通用文件系统缓存层处理。

属性(索引节点号、大小、修改时间)都可以正确看到,但内容却不能。

请注意,这不仅仅是关于可配置属性缓存时间限制。错误的文件内容会无限期地保留在那里,并且客户端永远不会注意到有任何问题。我再说一遍,客户端会陷入不良内容(例如包含虚假空字节)(以及更多)除非手动删除缓存。

可能是什么原因?有解决方法吗?我知道它可以通过删除缓存来临时修复,但这是一种手动干预,如果大小恰好保持不变,只是在另一个客户端上更改了一些字节,则故障甚至可能是无声的。

几年过去了,问题仍然存在,而且似乎没有任何解决方案(我读过常见问题解答、有关 NFS 的书籍章节、深入研究了邮件列表、阅读了邮政关于 GitLab 如何在两周的调试等中找到一些缓存错误,但这些都没有真正解决我的问题。)

网络上最相关的信息来自此邮件列表讨论来自 2015 年但最终开发人员声称根本没有问题,这让我感到困惑。如果是这种情况,那么如何在 HPC 集群设置中使用 NFS(在登录节点上编辑代码并将其提交到计算节点上执行)?您经常会遇到计算节点看到源代码损坏版本的问题。更重要的是,无论 NFS 人员可能提出的 WONTFIX/NOBUG 声明背后的理念如何,在我的场景中可行的修复是什么?

相关内容