【问题标题】:NFS cache-cleaning command?NFS 缓存清理命令?
【发布时间】:2012-01-08 20:22:09
【问题描述】:

我在使用 NFS 客户端属性缓存时遇到问题。 我正在使用一些服务器,一个是 NFS 服务器,另一个是 NFS 客户端服务器。

所有服务器都是 Debian(lenny, 2.6.26-2-amd64 of Linux),版本如下。

 % dpkg -l | grep nfs
ii  libnfsidmap2                        0.20-1                     An nfs idmapping library
ii  nfs-common                          1:1.1.2-6lenny1            NFS support files common to client and server
ii  nfs-kernel-server                   1:1.1.2-6lenny1            support for NFS kernel server

在 NFS 服务器中,/etc/exports 是这样写的:

/export-path   192.168.0.0/255.255.255.0(async,rw,no_subtree_check)

在 NFS 客户端中,/etc/fstab 的写法如下:

server:/export-path     /mountpoint   nfs rw,hard,intr,rsize=8192,async 0 0

如您所见,“异步”选项用于多客户端访问性能。 但是,有时这会导致错误缓存错误。

由于我维护着许多服务器(而且我没有那么强的权限来更改挂载选项),我不想修改 /etc/exports 或 /etc/fstab。 我认为如果我有一个命令行工具可以使用用户权限“清理”NFS 客户端属性缓存就足够了。

如果有这样的命令,请告诉我。

谢谢,


(附加)

我的意思是“错误缓存错误”,

 % ls -l /data/1/kabe/foo                  
ls: cannot access /data/1/kabe/foo: No such file or directory
 % ssh another-server 'touch /data/1/kabe/foo' 
 % ls -l /data/1/kabe/foo
ls: cannot access /data/1/kabe/foo: No such file or directory

有时会发生这种情况。 问题不在于文件内容,而在于文件属性(=dentries 信息),因为 NFS 表示它保证 Close-to-Open 一致性。

【问题讨论】:

  • 我在调查这个问题的可能解决方案时发现了这个问题(+1)。如果 NFS 无法提供一致性,我更喜欢没有本地缓存​​或本地缓存的到期时间非常短。千兆 LAN 不应该成为太大的障碍,所以我不认为这样做会造成太多的性能损失。一个理想的解决方案是服务器监视文件系统的更改并在需要刷新缓存时通知客户端,但我认为 NFS 不支持这一点。
  • 由于这里的带宽并不重要,但 延迟,千兆 LAN 仍然有一些性能影响。 FWIW,lookupcache=nonegit clone 的时间从 2.7 秒提高到了 20 秒。

标签: linux nfs


【解决方案1】:

根据您所说的“错误缓存错误”的含义,运行 sync 可能会满足您的需求。这将刷新所有文件系统缓冲区。

如果需要,您还可以使用/proc/sys/vm/drop_caches 清除内核中的 VM 缓存。

# To free pagecache
echo 1 > /proc/sys/vm/drop_caches

# To free dentries and inodes
echo 2 > /proc/sys/vm/drop_caches

# To free pagecache, dentries and inodes
echo 3 > /proc/sys/vm/drop_caches

【讨论】:

  • 感谢您的回复。我将“错误缓存错误”的意思附加到我的问题中。仅sync 并没有解决这个问题。我认为您的建议中的第二个命令,所以我稍后会尝试。
  • 我有同样的问题,我想在特定文件夹上同步,假设我没有 root,所以我无法运行建议的命令
【解决方案2】:

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

这是相关代码的行号(在上下文中显示使用):https://github.com/earonesty/grun/blob/master/grun#L820

这是我可以解决作业 #1 完成和作业 #2 问题的唯一方法,这需要一些输出文件,在这些文件可见的上下文中启动,

【讨论】:

  • 非常感谢您的建议
  • opendir() 肯定有效,而 sync 无效。一个简单的ls -la /data/1/kabe/ >/dev/null 就可以了。
【解决方案3】:

AFAIK,syncasync 选项不是属性缓存的来源。 Async 允许服务器延迟将数据保存到服务器文件系统,例如如果 NFS 服务器出现故障,它会影响写入持久性,但如果 NFS 服务器稳定,那么async 不会影响 NFS 客户端。

有一个lookupcache=positive NFS 挂载选项可用于防止负查找缓存,例如当文件实际存在于服务器上时,NFS 返回“没有这样的文件或目录”。请参阅man nfs 中的Directory entry caching

【讨论】:

    【解决方案4】:

    您将看到 NFS 的属性缓存的效果。查看man nfs,并查看DATA AND METADATA COHERENCE

    NFS 默认缓存属性最少 30 秒(acregminacdirmin),最多 60 秒(acregmaxacdirmax)。您可以使用actimeo 覆盖所有这些,或者使用noac 完全禁用属性缓存。使用noac 挂载选项,OP 描述的行为会消失,但会影响性能。

    lookupcache=positive 如果您只是在寻找新文件的外观很有用,但删除仍然会通过属性缓存。

    【讨论】:

    • lookupcache=positive 有点不同:如果指定了 pos 或 positive,客户端假定正条目在其父目录的缓存属性过期之前是有效的,但总是在应用程序可以使用它们之前重新验证负条目(来自文档:linux.die.net/man/5/nfs)。
    【解决方案5】:

    清除 nfs 服务器上的 /var/lib/nfs/rmtab 文件。

    以下命令用于清除内存相关问题。这也很危险。有时它会导致您在盒子上托管的应用程序崩溃

    # sync
    
    # To free pagecache
    echo 1 > /proc/sys/vm/drop_caches
    
    # To free dentries and inodes
    echo 2 > /proc/sys/vm/drop_caches
    
    # To free pagecache, dentries and inodes
    echo 3 > /proc/sys/vm/drop_caches
    

    【讨论】:

      猜你喜欢
      • 2016-02-07
      • 2015-09-27
      • 2018-05-27
      • 2017-11-09
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      相关资源
      最近更新 更多