有时,NFS 客户端不会从 NFS 导出同步读取数据,例如当它由另一个 NFS 客户端写入时。
例如,NFS 客户端 A 通过“echo hello > /NFS_mountpoint/testfile”写入文件后,NFS 客户端 B 无法读取“No such file”的文件,或者可以读取但文件内容可能是旧的。
NFS 客户端缓存各种 NFS 数据。
NFSv3 规范的 RFC 1813 说:
Clients can perform caching in varied manner.
并且还说:
The NFS version 3 protocol does not define a policy for caching on the client or server. In particular, there is no support for strict cache consistency between a client and server, nor between different clients. Therefore this is designed behavior of Linux NFS client. NFS版本3协议未定义用于在客户端或者服务器上缓存的策略。 特别是,不支持客户端和服务器之间以及不同客户端之间的严格缓存一致性。 因此,这是Linux NFS客户端的设计行为。
因此,这是 Linux NFS 客户端的设计行为。
通过配置 NFS 客户端挂载选项禁用/跳过 NFS 客户端缓存,或者使用 O_DIRECT /O_SYNC 读取/写入数据。
要禁用 NFS 客户端的所有缓存,请为挂载选项添加“同步”,例如。
# mount -t nfs -o vers=3,sync NFS_Server:/NFS_Export/ /NFS_Mountpoint
注意:此选项可能会导致性能下降。
在将其应用于生产系统之前,请在测试系统上仔细测试此选项。
要禁用 NFS 客户端缓存目录条目,请为挂载选项添加“noac,lookupcache=none”,例如在以下示例中:
# mount -t nfs -o vers=3,noac,lookupcache=none NFS_Server:/NFS_Export/ /NFS_Mountpoint
注意:noac 和actimeo=0 有区别。
actimeo=0 可以缓存属性更改,但 noac 不能。
因此,noac 比actimeo=0 更安全,但它会对性能产生影响。
也可以同时设置这两个选项,以进一步限制这一点。
日期:2020-09-17 00:12:29 来源:oir作者:oir