事情本身不复杂,线索都在日志里。IDC 内网两台 CentOS 7.9,客户端用 mount -t nfs4 挂上共享目录,ls 一个空目录要三秒,strace 看到每个 stat 都卡在一秒左右,tcpdump 抓包发现先发了一串反向解析请求。
第一反应是「nfsvers 协商落到了 4.0,没有 4.1 的会话机制,每条请求单独建连」,验证下来不成立。
这类报错背后常见的原因有几处,逐个排除就行。客户端没加 noacl 也没起 rpc.statd,每次 stat 都去问服务端锁状态。还有一种是DNS 反解超时,mount 选项里的 proto 组合让每次访问重新协商。
少数情况下是服务端 export 里没写 anonuid 和 all_squash,客户端每次操作先做身份映射查询。
第一件事是抓一次访问的包看卡在哪一步
tcpdump -i eth0 -nn port 2049 -c 50
然后改成 NFSv4.1 并打开多通道
mount -t nfs4 -o vers=4.1,nconnect=4 10.0.0.9:/data /mnt/nfs
接着确认客户端的 rpc 相关服务状态
systemctl status rpc-statd && rpcinfo -p 10.0.0.9
末了对比修改前后的单次 stat 耗时
time stat /mnt/nfs/testfile
改完先别撤,确认这几项。ls 一个两千文件的目录在 200ms 内返回,strace 里不再出现秒级停顿,业务读取恢复正常。
容易忽略的是,NFS 的挂载选项要写进 fstab,手工 mount 的参数重启就丢;改完先在测试机验证再批量下发。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
