我有一台 Debian NFS4 服务器,它导出两个卷和数十个使用这些共享的 Debian 客户端 - 已安装 rw。最近我注意到其中一些客户端进入了一种奇怪的状态:
当用户尝试将文件复制到客户端上的共享时,只有前 4kb、32kb 或 128kb 被写入服务器上的文件。然后客户端将永远等待。NIC 上没有流量,系统没有高负载,从本地 ssd 读取没有问题。任何日志中都没有任何内容,dmesg 中也没有任何内容。似乎这个问题是客户端特有的,因为大多数客户端都可以毫无问题地写入完整的文件。
一旦客户端发生这种情况,就很难调试正在发生的事情。rpcdebug 挂起,dd of=/path/to/the/share 也会挂起,任何取消/重新/安装共享的尝试也会挂起。
出现此问题之前似乎有一个常见特征,即客户端需要将 32 个文件(每个文件几百 MB)从本地驱动器复制到 nfs 共享。但是,并非所有执行此任务的客户端都会发生这种情况。
nfs 服务器似乎既不繁忙也不出问题。目前我无法轻松重新启动它,不过似乎没有问题。
以下是更多信息:
- 客户端内核:4.9.130
- 服务器内核:6.1.38
/etc/exports
服务器:
/exports 192.168.2.0/24(rw,fsid=0,no_subtree_check,async,no_root_squash)
/exports/data/tc 192.168.2.0/24(rw,no_subtree_check,no_root_squash)
/exports/data/cc 192.168.2.0/24(rw,no_subtree_check,no_root_squash)
/etc/fstab
客户:
192.168.2.22:/data/tc /data/tc nfs nfsvers=4,async,sec=sys,noacl,nocto,noatime 0 0
192.168.2.22:/data/cc /data/cc nfs nfsvers=4,async,sec=sys,noacl,nocto,noatime 0 0
客户端上mount命令的输出:
192.168.2.22:/data/tc on /data/tc type nfs4 (rw,noatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,nocto,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.2.125,local_lock=none,addr=192.168.2.22)
/proc/net/rpc/nfsd
服务器:
rc 0 129357384 4967412522
fh 1758 0 0 0 0
io 28313066211861 128215888716859
th 64 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
ra 0 0 0 0 0 0 0 0 0 0 0 0
net 801757532 0 801786350 360
rpc 801716819 0 0 0 0
proc2 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
proc3 22 2 38643 0 1 23508 8 11693 0 0 0 0 0 0 0 0 0 0 1256 0 2 1 0
proc4 2 196 801713647
proc4ops 76 0 0 0 376804896 326418685 3744246955 991057 0 15175351 1176408590 99816225 336 270 0 270 128401154 0 0 349464595 0 443684 69904 5085654887 0 538 38596966 38506066 276542 7867733 723402 2399852 336 743994 0 22047360 157 157 0 224528399 12 0 61 148 170 158 132 0 0 0 0 0 0 1 2584546568 0 24 0 142 130 0 20256 0 0 0 0 0 0 0 0 20311 0 0 0 0 0 0
在连接所涉及的所有设备上设置巨型数据包(包括网卡和介于两者之间的受控交换机 - 1Gbps 以太网)。不涉及防火墙。
如果您能提供任何猜测或者提示如何调试此问题,我将不胜感激。
我尝试了各种方法来创建文件并通过 nfs 复制它。
答案1
如果您对底层基础设施有信心,那么对 Linux 处理 NFS 的方式进行一些调整可能会对您的情况有所帮助。这里有很多东西……但让我们慢慢开始。
您可能遇到了系统缓冲区限制。您可以使用 nfsstat 和 nfsiostat 很好地观察到这一点。在某种程度上,您可以使用 vmstat 和 iostat 看到这一点,但实际上您只会看到没有 I/O 发生时的繁忙和等待。这真是令人沮丧!
从好的方面来看,你可能可以做点什么?
在开始讨论可能有帮助的事情之前...拜托?为了所有可爱和令人想拥抱的东西,请仔细检查,并特别确保您没有发生任何速度/双工不匹配问题。如果您有托管交换机,请检查交换机上的接口是否以您期望的速度运行。速度和/或双工不匹配会破坏网络性能,而且经常被完全忽视!
从这个开始 -https://nfs.sourceforge.net/nfs-howto/ar01s05.html
来自 Debian 论坛 -https://forums.debian.net/viewtopic.php?t=68393
与第一个相同的一些内容,但来源/位置不同 -https://tldp.org/HOWTO/NFS-HOWTO/performance.html
内核调整缓冲区以提高 NFS 性能 -https://www.cyberciti.biz/faq/linux-tcp-tuning/
更多有用的 Linux NFS 调优知识 -https://www.cyberciti.biz/faq/linux-unix-tuning-nfs-server-client-performance/
不要忽视网络接口上的 MTU!它可能卡在 1500 字节,这在千兆以太网上太小了!特别是如果您使用巨型帧。