【问题标题】:howto force refresh NFS cache when checking newly created file?检查新创建的文件时如何强制刷新 NFS 缓存?
【发布时间】:2016-05-03 18:40:43
【问题描述】:

在 Linux NFS 共享挂载上创建文件时,客户端是 Linux 或 mac 机器。文件的存在与否是下一步做什么的关键,但检查并不总是返回正确的结果:

例如,我在 perl 中执行此操作,但仍然无法正常工作,尤其是在 mac 机器上

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

当文件确实存在时,以下检查并不总是返回 true

问题 - 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 缓存以进行文件检查

我需要确定这是否可行以及如何实现?如果没有,为什么?

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

【问题讨论】:

  • 这是一件丑陋的事情。你实际上想要完成什么?很可能有更好的方法。为提高效率而设计的 NFS 缓存。可以完成非缓存文件系统 IO,但它比您想象的要慢得多。通常,答案是 - 尝试以不同的方式进行。
  • 我的意思是,这可能是一个 XY 问题。最好的解决方法是退后一步,看看你想要完成的事情
  • 可能能够使用sysopenO_RDWR|O_CREAT|O_EXCL 来强制刷新 NFS 缓存 - 如果调用成功则文件不存在(但不是所有 NFS实现正确处理 O_EXCL)。我在 python 中使用了这种技术(我在 perl 中为 NULL)。请参阅我对stackoverflow.com/questions/29979624/…的回复
  • 也许这值得一试:unix.stackexchange.com/a/207383。他在父目录上做了一个opendir/closedir

标签: linux perl nfs


【解决方案1】:

此方案属于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。尤其是“数据和元数据一致性”部分。

【讨论】:

  • 答案对我来说已经足够好了,我就检查一下写函数的退出代码,它是遥不可及的退出代码,我就这样离开,等待系统更新。谢谢
猜你喜欢
  • 2012-12-06
  • 2015-11-18
  • 2016-05-18
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
相关资源
最近更新 更多