检查新创建的文件时如何强制刷新NFS缓存?

时间:2016-01-27 00:37:47

标签: linux perl nfs

在Linux NFS共享安装上创建文件时,客户端是Linux或Mac机器。文件的存在与否是下一步操作的关键,但检查并不总是返回正确的结果:

例如我在perl中这样做,这仍然不能正常工作,尤其是使用mac机器

write_key_file();  # write a file that must be checked before proceeding

当文件存在时,以下检查不能始终返回

问题 - perl中的这个命令在NFS系统中没有返回正确的状态:

if( -e $file){}

无法解决的无法解决的问题:

 sleep(5);   # wait 5 seconds
 system("ls -ltr"); # force to cache?
 if(-e $file){}

我不打算检查这样的每个文件,但是有一些关键的地方需要获得正确的文件状态。

我们是否有更好的方法在特定目录上的特定文件上强制刷新nfs缓存?感谢。

我不确定这是一个XY问题,但有一些最薄弱的问题都可以解决。

  

A - NFS客户端设置

如果现阶段有解决方案,那就太棒了!

  

B - exit_code或写入函数的返回代码

$exit_code = write_key_file();

它的问题,不是所有的写作都在代码块的范围内。这只能解决部分问题。

  

C - 禁用特定文件或目录的NFS缓存以进行文件检查

我需要确定这是可能的以及如何?如果没有,为什么?

我对所有可能的解决方案,没有解决方案或其他可能性持开放态度。

1 个答案:

答案 0 :(得分:11)

<子> 此解决方案属于 B类:exit_code或写入函数的返回代码

  

...只有open()fopen()需要保证他们获得一个特定文件的一致句柄以进行读写。 stat和朋友不需要检索新属性。因此,为了接近开放的缓存一致性,只有open()fopen()被视为“开放事件”,其中需要立即从中获取新的属性。服务器 [1]

<子> 以下解决方案属于类别A:NFS客户端设置
即。如果您不希望将缓存的文件/目录条目提供给客户端,请禁用缓存。

设置共享缓存

  

如果NFS挂载中的文件(正在检查其存在)是由同一客户端上的另一个应用程序创建的(可能使用另一个挂载到同一个NFS导出),请考虑在客户端上使用单个共享NFS缓存。

使用sharecache选项在客户端上设置NFS挂载。

此选项确定在同时挂载同一个导出时如何共享客户端的数据缓存和属性缓存。 使用相同的缓存可减少客户端上的内存需求,并在通过不同的挂载点访问同一远程文件时向应用程序显示相同的文件内容。

设置不挂载的NFS挂载

  

禁用属性缓存。

使用noac选项在客户端上挂载NFS共享。

  

或者,禁用缓存的目录属性。

使用acdirmin=0,acdirmax=0将缓存超时设置为0(有效禁用缓存)。

设置NFS安装以忽略查找缓存

  

使用lookupcache=positivelookupcache=none

(可用选项:allpositivenone

尝试通过NFS挂载访问目录条目时,
如果服务器上存在请求的目录条目,则结果称为positive 如果服务器上不存在请求的目录条目,则结果称为negative

如果未指定lookupcache选项,或者指定了all,则客户端假定两种类型的目录缓存条目都有效,直到其父目录的缓存属性到期为止。

如果指定了pospositive,则客户端假定肯定条目在其父目录的缓存属性到期之前有效,但在应用程序可以使用之前始终重新验证否定条目。

如果指定了none,则客户端会在应用程序可以使用它们之前重新验证这两种类型的目录缓存条目。这样可以快速检测由其他客户端创建或删除的文件,但可能会影响应用程序和服务器性能。

<子> 参考文献:
1. Close-To-Open Cache Consistency in the Linux NFS Client
2. NFS - Detecting remotely created files programmatically?
3. NFS cache : file content not updated on client when modified on server
4. NFS man page。特别是“数据和元数据一致性”部分