我正在使用 Linux(内核为 2.6.32 的 Debian Squeeze)计算机网络,使用 NFS(v3)共享文件。场景是,在客户端 A 上运行的进程将通过文件服务器 Z 上的 NFS 创建一个文件。然后,在 A 上运行完该进程(刷新其输出并关闭文件)后,客户端 B 将尝试访问该文件。99.9% 的时间里,这种方法都没有问题。
问题是,客户端 B 在尝试读取时极少会抛出错误,指出文件不存在。问题是,当对包含目录执行“ls”或 readdir 时,B 始终会显示该文件。但是,当尝试打开,甚至对文件调用“stat”时,会抛出不存在错误。
一些补充要点:
- 这些文件仅在单个客户端上写入一次,但可以由许多不同的客户端读取多次(WORM)。在此过程中,这些文件也永远不会被删除。
- 当错误出现时,它们似乎只会影响部分客户端(随机)。其他客户端可以打开并读取文件,而不会出现问题。此外,当问题发生时,它往往会反复发生。重新启动文件服务器并重新安装客户端似乎可以消除问题
- 经过足够长的时间后,文件才可以被读取。时间可能从几秒到十分钟不等。有时,文件会在包含目录上执行 readdir 后立即消失,有时则不会。
- 我最初怀疑这是 NFS 属性缓存一致性问题。所以我重新挂载并启用了 noac 选项。问题继续出现(而且速度非常慢)。
- 仅当 NFS 流量很大且正在创建、写入和读取大量大文件时,才会出现此问题。
- 客户端或服务器端的任何 syslog 或 dmesg 中均未出现任何表明存在问题的信息。
我强烈怀疑这是某种类型的 NFS 缓存一致性问题。但我无法确定确切的原因或可能的解决方案。除非我误解了 NFS 手册,否则这种行为应该可以通过接近打开的缓存一致性来排除。有没有其他人遇到过这种 NFS 文件存在于“readdir”系统调用中,但不存在于“stat”系统调用中的问题?任何见解都将不胜感激。谢谢。