今天去用户现场,遇到一个与NFS有关的怪异问题。
现象是这样的:
一个服务器配置成NFS服务器,假设导出目录是/mnt/datas,使用的参数是rw,sync,anonuid=501,anongid=501
另外一个客户端在/etc/fstab中配置一条nfs挂载信息,参数是:
hard,rw
在/mnt/datas目录下面创建3个目录,A,B,C。A,B中各有一些文件,但是保证两个目录中的文件名唯一。
在C目录中写了两个perl脚本,一个是将A目录中的文件先打开一下(使用fopen函数),然后将该文件移动到B目录,而另外一个perl脚本完成的任务则相反。两个脚本处于死循环状态。同时执行这两个脚本,运行都正常,没有任何报错。
但是一旦你在A目录下连续的执行ls命令,会发现移动A目录文件的perl脚本退出,报告没有那个文件或者目录。
而去A目录看文件存在,使用ls -l 后,会报下面的错误:
#ls -l xorg.conf.12248
ls -l xorg.conf.12248: Invalid arguments
-rw-r--r-- 1 root root 4384 2006-07-27 19:19 xorg.conf.12248
但是大约10秒中后,再执行ls命令,错误信息不见了。
也对perl脚本做过一些修改,但是还是有这样的错误发生。甚至写了类似这种功能的shell脚本和python脚本,也得到同样的错误。
于是在NFS服务器端,修改/etc/exports文件,加入了async参数,还是没有什么效果。
修改客户端,加入tcp参数,没有效果。
加入sync参数,没有出问题,但是文件拷贝速度太慢了,大约2MB/s,用户根本就不能接受。
也加入了dirsync参数也不管用。
最后pczou找到了一个参数,在客户端加入了noac参数。测试脚本通过。
回来查了一些noac,原来是禁止attribute cache功能,在 man nfs中是这样说明的:
noac Disable all forms of attribute caching entirely. This extracts a significant performance penalty but it allows two different NFS clients to get reasonable results when both clients are actively writing to a common export on the server.
网上也有一些连接说到了这个参数:
http://lists.freebsd.org/pipermail/freebsd-bugs/2005-September/014747.html
http://study.chyangwa.com/IT/AIX/aixcmds3/mount.htm
http://blog.gmane.org/gmane.linux.nfs/month=20030201
http://lists.scratchbox.org/pipermail/scratchbox-users/2005-November/000335.html
http://www.linuxmine.com/1711.html