参考 GitLab 的文档,在 NFS Server 上关闭 NFSv4 的 delegation 机制即可解决,操作如下:
a. 在 /etc/sysctl.conf 中加入 fs.leases-enable=0 ,然后运行 sysctl -p 应用设置
b. 重启 NFS Server
近期发现作为 NFSv4 client 的服务器,运行 I/O 操作多、运行时间长的程序后,系统会出现一个名为“[NFSServerIP-manager]”的进程(其中“NFSServerIP”是 NFS 服务器的 IP 地址),持续占用 100% CPU。出现之后,在 NFS Server 可以看到 [nfsd] 进程的 CPU 占用上升;在 NFS Client 端,本来在运行的程序会被阻塞,访问 NFSv4 的挂载点也变得极其缓慢。
此进程在 kernel 的 fs/nfs/nfs4state.c#L1211 发起。
尝试过更换内核版本,启用 NFS over RDMA,均不能解决此问题。
在此进程的出现后,通过 nfsstat -c 命令,可以看到 delegreturn 计数器在快速增加,通过 WireShark 对数据包进行分析,也能看到大量 DELERETURN 操作相关的数据包。
似乎是因为 open 过的文件,close 后内核也会继续持有其 DELEGATION,运行文件操作多的程序时间长,累积得太多,清理时影响了 NFS Client 的文件读写操作,所以导致缓慢。