0x0 异常
挂载目录卡住,查看 /var/log/messages 有如下错误:
NFS: nfs4_reclaim_open_state: Lock reclaim failed
0x1 参数优化
先说说系统参数优化:
_netdev,vers=4.0,rw,noatime,nodiratime,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,proto=tcp
基本上挂载的时候跟直接使用这些参数即可,其中 vers=4.0 需要显示的写出来,centos7测试使用 vers=4 或者不写的情况下,使用 mount 可以观察得到版本为 4.1 ,所以为了使用 4.0 版本,一定要显示写 4.0
0x2 服务优化
如果并发较大的情况下,可以增大 nfs 的进程数,以提高并发
0x3 系统优化
linux对nfs客户端同时请求数进行了限制,可以用下面的命令查询,大部分机器默认是2,是比较小的。可以通过以下命令查询当前的数值:
cat /proc/sys/sunrpc/tcp_slot_table_entries
内核编译的默认最大是2,可以增大设置成128,需要重新挂载nfs
echo "options sunrpc tcp_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf
echo "options sunrpc tcp_max_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf
sysctl -w sunrpc.tcp_slot_table_entries=128
优化后重启机器,或者重新挂载nfs
PS.
服务器 fstab 或者命令挂载实例: /etc/fstab
192.168.xx.xx:/aaa/bbb /opt/bbb nfs _netdev,vers=4.0,rw,noatime,nodiratime,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,proto=tcp 0 0
mount
mount -t nfs -o _netdev,vers=4.0,rw,noatime,nodiratime,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,proto=tcp 192.168.xx.xx:/mnt/dev1/aaa /tmp/aaa
2023.12.07 补充更新
上面的内核参数以及挂载方法只是当时临时解决了问题,但是后来在其他机器上无法解决。所以并不是一个最终方案。试过了nfs3、nfs4.0、nfs4.1版本,更换过机器多种版本内核,仍然无法解决,可以参考抓包内容:
-
在挂载4.0版本的时候,ls文件卡住,包内容如下:
可以看到双方有非常多的设置 clientid、确认 的操作,这显然是不正常的
-
在挂载4.1版本的时候,ls文件很快,创建文件、读取文件、vi文件错误,但是创建目录可以
抓包内容(仅对vi做抓包、后续观察more是同样的问题):
可以看到有非常多的 NFS4ERR_EXPIRED 这明显也是不正常的,因为不管是链接还是会话,都不可能这么快过期,在一个 vi 或者 more 的时间过期多次
- 关于此错误代码的解释
13.1.5.3. NFS4ERR_EXPIRED (Error Code 10011)
A stateid or clientid designates locking state of any type that has
been revoked or released due to cancellation of the client's lease,
either immediately upon lease expiration, or following a later
request for a conflicting lock.
在后续的查阅资料中也基本没有相关的案例、或者没有解决办法。于是猜测是 openbds 的 nfs BUG 之类。但是业务太多,其他几个挂载点目前没问题,不好重启 nfs 服务。
基于我们场景的现状,小文件非常多,有大量web项目war包解压出来的,还有jenkins打包的代码文件,所以目前的想法是采用多个 nfs 服务来提供这些不同服务的挂载。首先是避免大量读写小文件到一个 nfs 中处理不过来,再就是出现问题的时候,其中某个nfs重启也不影响其他的。
评论