我们在不使用 noac 的情况下进行挂载。我有一个文件,我每 20 分钟附加一次。然后它将每分钟使用 mmap 读取约 5,000 次。我们每次读取只 mmap 几个块。不用说,noac 只会降低访问性能,所以我们不使用它。
我使用带有 noac 的挂载将数据添加到文件末尾,然后从不带 noac 的挂载中读取数据。读取的挂载看不到新数据。
我想知道是否有一个函数可以从 c 调用来刷新路径及其所有文件的属性。
编辑:我应该补充一下,我们无法挂载和卸载,因为每个系统上运行着 16 个服务器,它们不断访问文件。好吧...如果每个服务器都使用自己的挂载,也许我们可以挂载和卸载。如果可能的话,我想避免这种情况。
谢谢!
答案1
嗯.....尝试使用“同步”选项挂载 NFS 文件系统。
查看手册页的摘录:(man 5 nfs)
同步挂载选项。
NFS 客户端处理同步挂载选项的方式与其他一些文件系统不同(有关通用同步和异步挂载选项的说明,请参阅 mount(8)。如果未指定同步或异步(或者指定了异步选项),则 NFS 客户端会延迟将应用程序写入发送到服务器,直到发生以下任何事件:
Memory pressure forces reclamation of system memory resources.
An application flushes file data explicitly with sync(2), msync(2), or fsync(3).
An application closes a file with close(2).
The file is locked/unlocked via fcntl(2).
换句话说,在正常情况下,应用程序写入的数据可能不会立即出现在托管文件的服务器上。
如果在挂载点上指定了同步选项,则任何将数据写入该挂载点上的文件的系统调用都会导致在系统调用将控制权返回给用户空间之前将数据刷新到服务器。这在客户端之间提供了更高的数据缓存一致性,但性能成本很高。
应用程序可以使用 O_SYNC 打开标志强制应用程序对单个文件的写入立即转到服务器,而无需使用同步挂载选项。