NFS 挂了

由于我不在现场,从 log 以及跟工程师沟通中大概推断出出现问题的场景。client 开了若干个 rsync 进程同步,而同时又在进行大量文件的 NFS 挂载,导致 1G 的网卡全被打满,然后,就 NFS 就 hang 住了,表现就是 df 没有任何的反应,卸载不掉,挂载不上去。
首先是在 kern.log 里面发现了一坨类似如下的 log:
NFS: directory /tmp contains a readdir loop.Please contact your server vendor.

g 了不少文档,没发现几个靠谱的解释,这里有个看上去比较靠谱的解释,说是 2.6. 39 的 bug,不过我的 client 是 3.2.0-29-generic 的 12.04,server 是 2.6.32-38-server 的 10.04,并且按照链接的做法也无法重现,只得暂时作罢。

后来想想要不先 umount 掉挂载的 nfs 文件吧,umount 发现 "device is busy",按照之前的做法,先通过 lsof 找到对应的进程然后直接杀了就好了,执行命令的事后才发现 lsof 以及 df 等了很久都没有结果,基本就是 hang 住了,后来想强制 umount -f,依然无效,最后发现有个 -l 参数可以使用,还有效了:
# umount -l /mnt

然后就是在重新 mount -v 的时候出现了若干的问题:
mount.nfs: access denied by server while mounting

有种说法是使用的版本不对,换:
192.168.1.10:/shared/files  /mnt/files nfs soft,intr,nfsvers=3 0 0

另外就是检查 server 上该起的进程有没有都起起来,portmapper, nlockmgr, nfs,
mountd:
# rpcinfo -p localhost

对应的 client, portmapper, nlockmgr, status:
# rpcinfo -p

然后还有说源端口小于 1024 的,需要在 exports 里面加上 insecure

这里还有一篇文档提到修 max_resvport, min_resvport。

这个解决了接下来又遇到了 hang 在下面这个 debug 信息的过程中:
mount.nfs: trying  1.1.1.1 prog xxxx vers 3 prot UDP port

又是 g 了无数,最后在 gmane 的角落找到了一个临时的不是办法的解决办法,把版本改成 vers=2。
这里有个比较综合的 troubleshoting 的文档,说的倒是蛮全的,但是没有能解决上面的问题 :-(

  • muxueqz

    NFS各种不靠谱,可以换moosefs或glusterfs嘛