题 NFS写入性能差


我有两台机器连接10Gbit以太网。让其中一个成为NFS服务器,另一个成为NFs客户端。

用TCP测试网络速度 iperf 显示两个方向的~9.8 Gbit / s吞吐量,因此网络正常。

测试NFS服务器的磁盘性能:

dd if=/dev/zero of=/mnt/test/rnd2 count=1000000

结果是~150 MBytes / s,因此磁盘可以正常写入。

服务器的 /etc/exports 是:

/mnt/test 192.168.1.0/24(rw,no_root_squash,insecure,sync,no_subtree_check)

客户端将此共享安装到本地 /mnt/test 有以下选项:

node02:~ # mount | grep nfs
192.168.1.101:/mnt/test on /mnt/test type nfs4 (rw,relatime,sync,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.102,local_lock=none,addr=192.168.1.101)

如果我尝试从NFS共享下载客户端计算机上的大文件(~5Gb),我得到~130-140 MBytes / s的性能,这接近服务器的本地磁盘性能,所以它是令人满意的。

但是当我尝试将大文件上传到NFS共享时,上传以~1.5 Mbytes / s开始,慢慢增加到18-20 Mbytes / s并停​​止增加。 有时,在上传实际开始之前,共享“挂起”几分钟,即主机之间的流量接近于零,如果我执行 ls /mnt/test,它不会在一两分钟内返回。然后 ls 命令返回并以最初的1.5Mbit / s速度开始上传。

当上传速度达到最大值(18-20 Mbytes / s)时,我会跑 iptraf-ng 它在网络接口上显示~190 Mbit / s的流量,因此网络不是瓶颈,也是服务器的硬盘。

我尝试了什么:

1。 在仅与100Mbit以太网NIC连接的第三台主机上设置NFS服务器。结果类似:DL表现出良好的性能和接近100Mbit的网络利用率,上传速度不超过每秒数百千字节,使网络利用率非常低(2.5 Mbit / s,根据 iptraf-ng)。

2。 我试着调整一些NFS参数:

  • sync 要么 async

  • noatime

  • 没有 hard

  • rsize 和 wsize 在我的例子中是最大的,所以我试着 将它们分几步减少到8192

3。 我试图切换客户端和服务器机器(在以前的客户端上设置NFS服务器,反之亦然)。此外,还有六台服务器具有相同的配置,因此我尝试以不同的方式将它们相互安装。结果相同。

4。 MTU = 9000,MTU = 9000和802.3ad链路聚合,链路聚合,MTU = 1500。

5。 sysctl调优:

node01:~ # cat /etc/sysctl.conf 
net.core.wmem_max=16777216
net.core.rmem_max=16777216
net.ipv4.tcp_rmem= 10240 873800 16777216
net.ipv4.tcp_wmem= 10240 873800 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.core.netdev_max_backlog = 5000

结果相同。

6。 从localhost挂载:

node01:~ # cat /etc/exports
/mnt/test *(rw,no_root_squash,insecure,sync,no_subtree_check)
node01:~ # mount -t nfs -o sync localhost:/mnt/test /mnt/testmount/

在这里我得到相同的结果:从下载 /mnt/testmount/ 很快,上传到 /mnt/testmount/ 非常慢,不快于22 MBytes / s并且在传输实际开始之前有一个小延迟。这是否意味着网络堆栈完美无缺,问题出在NFS中?

所有这些都没有帮助,结果与默认配置没有显着差异。 echo 3 > /proc/sys/vm/drop_caches 在所有测试之前执行。

所有3台主机的所有NICS的MTU为1500,未执行非标准网络调整。以太网交换机是Dell MXL 10 / 40Gbe。

操作系统是CentOS 7。

node01:/mnt/test # uname -a
Linux node01 3.10.0-123.20.1.el7.x86_64 #1 SMP Thu Jan 29 18:05:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

我缺少什么设置?如何使NFS快速写入而不挂起?


18
2018-04-11 09:53




你有一个非常全面的测试用例,但我会尝试在服务器上安装并从那里写入,这样你就可以弄清楚NFS堆栈或网络堆栈是否有问题。此外,尝试切换服务器和客户端(从客户端导出,在服务器上安装)以及使用不同的客户端。支持服务器/客户端进程没有透露任何内容? - Dalibor Karlović
@DaliborKarlović我尝试了除strace之外的所有内容并在问题中添加了信息。从localhost挂载工作很慢,因此网络堆栈和交换机似乎没有错。我使用内核空间NFS并获取 Operation not permitted尝试将strace附加到NFS进程。 - Sergey
我认为这意味着你可以完全排除网络堆栈(但你需要附加strace以确保)。您应该能够以root用户的身份划分任何进程 如果没有遇到某个bug。 - Dalibor Karlović
@DaliborKarlović当然,我试着以root身份进行比赛。我能够附加到任何用户空间进程,但不能附加到内核空间进程。但是我可以从它的输出中得到什么信息?我想如果我将它附加到NFS并开始上传,它将产生数十万行输出。我应该注意非零返回值吗? - Sergey
你是对的,我没想到它是一个非用户空间的过程。我希望看到它在传输开始时“挂起”时它正在做什么,它可能是一些微不足道的事情,比如错误配置的反向DNS查找。 - Dalibor Karlović


答案:


它可能是与数据包大小和延迟相关的问题。请尝试以下方法:

该报告支持您的结果。


2
2018-04-11 10:54



我尝试了MTU = 9000的巨型帧,但结果是一样的。我也尝试了与802.3ad的链接聚合,再次没有变化。因此,我将所有这些设置恢复为尽可能接近默认状态。我还试着调整一下 net.core.* 和 net.ipv4.* sysctls,但也许我做的实验太少了。好的,我会做一些更多的测试并报告。 - Sergey
我再次尝试在服务器和客户端上调整sysctls,但这没有用。 - Sergey
您是否尝试使用UDP作为传输协议? - shodanshok
我已经尝试过UDP(安装选项中的proto = udp),但它甚至比TCP慢1-2 MBytes / s。结果与localhost和远程主机的安装相同。 - Sergey


您在导出语句中使用sync-option。这意味着服务器仅在实际写入磁盘后确认写入操作。鉴于您有旋转磁盘(即没有SSD),这平均需要每次写入操作至少1/2转磁盘,这是导致速度减慢的原因。

使用异步设置,服务器在处理但尚未写入磁盘时立即确认对客户端的写操作。这有点不可靠,例如,在电源故障的情况下,当客户端接收到未发生的操作的确认时。但是,它可以大大提高写入性能。

(编辑)我刚刚看到你已经测试了async vs sync选项。但是,我几乎可以肯定这是导致性能下降问题的原因 - 我曾经使用idencitcal设置得到完全相同的指示。也许你再试一次。您是否同时在服务器的export语句和客户端的mount操作中提供了async选项?


2
2017-08-17 09:27



+1最可能的解释是未正确禁用同步。 - David Schwartz


http://veerapen.blogspot.com/2011/09/tuning-redhat-enterprise-linux-rhel-54.html

在具有硬件RAID的系统上配置Linux调度程序并将默认值从[cfq]更改为[noop]可以改进I / O.

使用nfsstat命令计算读/写的百分比。设置RAID控制器缓存比例以匹配。

对于繁重的工作负载,您需要增加NFS服务器线程的数量。

使用no_delay选项将nfs线程配置为无延迟地写入磁盘。

告诉Linux内核尽快刷新,以便尽可能减少写入。在Linux内核中,脏页写回频率可以由两个参数控制。

要加快磁盘写入速度,请使用filesystem data = journal选项并防止更新文件访问时间,这样会导致将额外的数据写入磁盘。当数据需要在超出所有其他模式的同时读取和写入磁盘时,此模式最快


1
2018-04-19 03:47