如何刷新nfs属性缓存?

时间:2012-12-19 06:39:55

标签: linux caching nfs stat nfsclient

我需要找到一种方法来刷新客户端的NFS属性缓存。 stat()调用从属性缓存中读取ctime而不是实际值,实际值最多需要3秒才能在缓存中反映出来。在安装工作时使用'noac'选项,但从长远来看会影响性能。

我遇到的解决方案就像在文件的同一所有者上做了一个chown但是在执行stat()之前是否有正确的方法来刷新属性缓存?这个问题只发生在Redhat Linux而不是FreeBSD上。谁能解释一下?

2 个答案:

答案 0 :(得分:3)

这不是特定于NFS,但您可以拥有内核删除缓存。这通常在IO基准测试时完成,但也适用于NFS。

https://www.kernel.org/doc/Documentation/sysctl/vm.txt

Writing to this will cause the kernel to drop clean caches, dentries and
inodes from memory, causing that memory to become free.

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

As this is a non-destructive operation and dirty objects are not freeable, the
user should run `sync' first.

答案 1 :(得分:0)

来自官方文档 (http://www.citi.umich.edu/projects/nfs-perf/results/cel/dnlc.html):

<块引用>

请注意,只有 open 和 fopen 需要保证它们获得对特定文件的一致句柄以进行读写。 stat 和朋友不需要检索新属性,...

具有讽刺意味的是,Javas FileInputStream 正在使用 open,但不会触发属性刷新,但尝试写入却可以解决问题:new FileOutputStream(file).close()

Python:os.access(path, os.W_OK)