3

我不知道我是否在问这个问题,这是问题的一部分。我们在我们的 linux 机器上使用 NFS。我们已经挂载到文件服务器上的目录。我们使用 1 小时属性超时和 1 小时数据超时。我们必须要编写文件的模型。1)我们添加到文件的末尾。添加到文件末尾时,我们保持相同的文件名。2) 更改先前写入的数据。更改文件时,我们更改其文件名。这个想法是,这将与缓存一起工作,因为写入文件的数据永远不会改变。我还需要一件事来完成这项工作。使用当前设置,当我使用 mmap 访问文件的新添加部分时,当文件的该部分在属性被缓存时不存在时,我会收到“总线错误”。这一切都是有道理的,也是意料之中的。我想做的是强制 NFS 刷新文件属性,这样它就知道文件现在更大了。在一个完美的世界里,只有当我遇到总线错误时我才会这样做。那么......有没有我可以从c或shell执行的命令可以做到这一点?

编辑 我被否决了,所以我想我的问题很愚蠢。也许更多信息会有所帮助。当我使用具有长属性和数据刷新的挂载时,我获得了所需的微秒级性能。当我使用具有短属性刷新的坐骑时,它会慢 1000 倍。只有当我得到总线错误时,我才需要刷新属性。这是 linux,因此很有可能存在一种强制刷新的方法。我们的数据每 20 分钟仅更改一次,因此我想探索按需刷新场景。

4

1 回答 1

1

NFS 使用“Close-to-open 缓存一致性”。根据手册(man nfs),“当应用程序打开存储在 NFS 服务器上的文件时,NFS 客户端会检查它是否仍然存在于服务器上,并通过发送 GETATTR 或 ACCESS 请求来允许打开者使用”。

根据常见问题解答的 A8 ,“Linux 通过将文件关闭后执行的 GETATTR 操作的结果与下次打开文件时执行的 GETATTR 操作的结果进行比较来实现 close-to-open 缓存一致性。如果结果相同,客户端将假定其数据缓存仍然有效;否则,缓存将被清除。”

我认为当您收到“总线错误”时,您应该关闭并重新打开(然后重新映射)文件。

PS 好问题,顺便说一句。

于 2013-09-15T08:55:45.850 回答