nfs:server is not responding,still trying问题

2019-07-12 23:36发布


分类: 嵌入式Linux 2010-11-08 15:44 700人阅读 评论(0) 收藏 举报 server嵌入式tcp服务器networkoutput nfs开启后,mount显示正常。进一步进行文件操作时出错,如下图: nfs: server 192.168.13.27 not responding,still trying   nfs: server 192.168.13.27 not responding,still trying 进而系统进入死循环,各种操作反应。   网上找了相关资料得出结论: 原来不是nfs的原因,而是由于传送的数据太大,出现数据包丢失现象。
   NFS 的默认传输协议是 UDP,而PC机与嵌入式系统通过UPD交互时就会出现严重的网卡丢包现象。可用的解决方案是:在客户端改用TCP协议,使用下面的命令,

mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.168.0.121:/主机nfs目录 /挂载路径
  解决思路(转): 在nfs faq找到:   kernel: nfs: server server.domain.name not responding, still trying
kernel: nfs: task 10754 can't get a request slot
kernel: nfs: server server.domain.name OK

A. The "can't get a request slot" message means that the client-sideRPC code has detected a lot of timeouts (perhaps due to networkcongestion, perhaps due to an overloaded server), and is throttlingback the number of concurrent outstanding requests in an attempt tolighten the load. Some possible causes:

* Network congestion
* Overloaded server
* Packets (input or output) dropped by a bad NIC or driver....
  根据上述观点,造成NFS没有回应的原因有3个,分别为网络拥塞、服务器过载和网卡丢包。 在我们的实验系统中,嵌入式系统和宿主机是直连的,而且服务器的基本处于空载的情形,所以不应该是前面两种情况,所以很可能是嵌入式系统网卡丢包严重引起的。   在目标机器中,用ifconfig看了一下,确实丢包比较严重。很可能就是这个问题了。   另一个意外的发现是,在查询丢包是,用tcpdump观察到nfs使用的是UDP协议。于是猜想,用TCP会不会有所改善?        接着就是另一个问题,如何在nfs作为根文件系统时,指定nfs挂载的参数? 带着问题,跟踪了fs/nfs/nfsroot.c的代码,发现在nfs作为根文件系统时,参数可以直接写在“nfsroot=”后面,每个参数用逗号隔开,如:   mount -t nfs 192.168.10.1:/work/nfs /mnt/nfs -o nolock,proto=tcp,nfsvers=3
这样就可以指定nfs使用tcp协议。   重启后发现,竟然不再出现not responding的错误,一切感觉较为正常。 不过,丢包现象依然存在。所以,使用tcp只是一个可行的解决办法,但最终还得解决网卡的丢包问题。