我需要找到一种方法来刷新客户端的 NFS 属性缓存。stat() 调用从属性缓存中读取 ctime 而不是实际值,实际值最多需要 3 秒才能反映在缓存中。安装时使用“noac”选项,但从长远来看会影响性能。
我遇到了解决方案,例如对文件的同一所有者执行 chown 等,但是在执行 stat() 之前是否有适当的方法来刷新属性缓存?这个问题只发生在 Redhat Linux 而不是 FreeBSD 上。谁能解释一下?
这并不特定于 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.
来自官方文档(http://www.citi.umich.edu/projects/nfs-perf/results/cel/dnlc.html):
请注意,只有 open 和 fopen 需要保证它们获得对特定文件的一致句柄以进行读取和写入。stat 和朋友不需要检索新鲜的属性,...
具有讽刺意味的是,JavasFileInputStream
使用的是 open,但不会触发属性刷新,但尝试写入却可以解决问题:new FileOutputStream(file).close()
Python:os.access(path, os.W_OK)