我在NFS客户端属性缓存方面遇到了麻烦.我正在使用一些服务器,一个是NFS服务器,其他服务器是NFS客户端服务器.
所有服务器都是Debian(lenny,Linux的2.6.26-2-amd64),版本如下.
% 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
Run Code Online (Sandbox Code Playgroud)
在NFS服务器中,/ etc/exports编写如下:
/export-path 192.168.0.0/255.255.255.0(async,rw,no_subtree_check)
Run Code Online (Sandbox Code Playgroud)
在NFS客户端中,/ etc/fstab编写如下:
server:/export-path /mountpoint nfs rw,hard,intr,rsize=8192,async 0 0
Run Code Online (Sandbox Code Playgroud)
如您所见,"async"选项用于多客户端访问性能.但是,有时这会导致错误缓存错误.
由于我维护了很多服务器(并且我没有很强的权限来更改挂载选项),我不想修改/ 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
Run Code Online (Sandbox Code Playgroud)
有时这种情况会发生.问题不是文件内容,而是文件属性(= dentries信息),因为NFS说它保证了Close-to-Open一致性.
Jim*_*imB 21
根据"虚假缓存错误"的含义,运行sync
可能会为您提供所需的信息.这将刷新所有文件系统缓冲区.
如果需要,您还可以使用清除内核中的VM缓存/proc/sys/vm/drop_caches
.
# 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
Run Code Online (Sandbox Code Playgroud)
在给定的进程中,在文件的父目录上调用opendir和closedir会使NFS缓存无效.我在编写作业调度程序时使用了这个.非常,非常有帮助.试试吧!
AFAIK,sync
和async
选项不是属性缓存的来源。Async
允许服务器延迟将数据保存到服务器文件系统,例如,它会在 NFS 服务器故障的情况下影响写入持久性,但如果 NFS 服务器稳定,则async
不会影响 NFS 客户端。
有一个lookupcache=positive
NFS 挂载选项可用于防止负查找缓存,例如,当文件实际存在于服务器上时,NFS 返回“没有这样的文件或目录”。见Directory entry caching
在man nfs
。