我遇到了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
在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
如您所见,“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
有时这种情况会发生。 问题不是文件内容,而是文件属性(= dentries信息),因为NFS表示它保证了Close-to-Open一致性。
答案 0 :(得分:21)
根据“虚假缓存错误”的含义,运行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
答案 1 :(得分:6)
在给定的进程中,在文件的父目录上调用opendir和closedir会使NFS缓存无效。我在编写作业调度程序时使用了这个。非常,非常有帮助。试试吧!
答案 2 :(得分:4)
AFAIK,sync
和async
选项不是属性缓存的来源。 Async
允许服务器将数据延迟保存到服务器文件系统,例如它会影响NFS服务器故障时的写入持久性,但如果NFS服务器稳定,则async
不会影响NFS客户端。
可以使用lookupcache=positive
NFS挂载选项来防止负面查找缓存,例如当文件实际存在于服务器上时,NFS返回“无此类文件或目录”。请参阅Directory entry caching
中的man nfs
。
答案 3 :(得分:1)
在nfs服务器上清除/ var / lib / nfs / rmtab文件。
以下命令用于清除与内存相关的问题。这也很危险。 soem times它会破坏托管在盒子上的应用程序
# 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
答案 4 :(得分:1)
您正在看到NFS的属性缓存的影响。请参阅man nfs
,然后查看DATA AND METADATA COHERENCE
。
默认情况下,NFS将属性缓存至少30秒(acregmin
和acdirmin
),最多60秒(acregmax
和acdirmax
)。您可以使用actimeo
覆盖所有这些内容,或使用noac
完全禁用属性缓存。使用noac
挂载选项,OP描述的行为消失,但会达到性能。
lookupcache=positive
非常有用,但删除操作仍然会通过属性缓存。