【发布时间】: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=none将git clone的时间从 2.7 秒提高到了 20 秒。