是否有一个命令可以强制 Linux 刷新 NFS 共享上一个文件的缓存?

是否有一个命令可以强制 Linux 刷新 NFS 共享上一个文件的缓存?

相关StackOverflow 上的这个问题,我想知道是否有办法刷新 NFS 缓存/强制 Linux 查看 NFS 共享上文件的最新副本。

我遇到过这样的情况:四台 Apache 服务器通过 NFS 挂载同一目录,当一台服务器对文件进行更改时,其他服务器大约需要 5 - 10 秒才能看到该更改。如果在此窗口中对该文件进行第二次更改,则可能会覆盖第一次更改。

fstab文件系统的条目是:

172.16.1.15:/home               /media/home     nfs     vers=3,defaults,noauto,sync,acregmin=1          0       0

是否有一个命令可以强制 Linux 刷新 NFS 共享上一个文件的缓存?

답변1

检查这些项目,看看是否对您有用:

  1. 在客户端,如果您尚未使用该cto选项选项在您的 NFS 文件系统行的列/etc/fstab中添加它。 cto告诉 nfs 客户端通过 close-to-open 打开文件,这使得它们每次打开文件时都会刷新文件。

  2. 在服务器上,确保您的文件系统是使用该sync选项导出的,而不是async.通过同步写入,客户端将在文件关闭时刷新到磁盘。 (或使用 nfs V3,每当进行 commit() 时)。这样可能会影响性能,但如果您要写入 NFS 文件系统,那么您肯定需要sync设置。

  3. 紧随该 stackoverflow 帖子之后,仅当内核是使用 CONFIG_NFS_DIRECTIO 编译时,使用 O_DIRECT 打开文件才有效。

  4. 另外,请确保您的 httpd.conf 文件中有以下设置:

    • EnableMMAP off
    • EnableSendfile off

    来自apache性能调优文档:

    • 如果您对位于 NFS 安装的文件系统上的文件进行内存映射,并且另一台 NFS 客户端计算机上的进程删除或截断了该文件,则您的进程在下次尝试访问映射的文件内容时可能会出现总线错误。
    • 关闭 EnableSendfile 对 NFS 的同步/异步行为没有特别帮助,但如果您将 apache 与 NFS 一起使用,则需要将其关闭。

답변2

在给定进程中,对文件的父目录调用 opendir 和 closedir 会使 NFS 缓存失效。我在编写作业调度程序时使用了它。非常非常有帮助。尝试一下!

답변3

如果您在非缓存程序(如 vim 或 emacs)中打开给定文件然后关闭,它将更新/清除该文件的缓存

관련 정보