NFS写入性能较差


20

我有两台连接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 MBs / s,然后停止增加。有时,共享实际上在开始上传之前“挂起”了几分钟,即主机之间的流量接近于零,如果执行ls /mnt/test,则在一两分钟之内它不会返回。然后ls命令返回并以1.5Mbit / s的初始速度开始上传。

当上传速度达到最高速度(18-20 MB / s)时,我运行iptraf-ng,它在网络接口上显示〜190 Mbit / s的流量,因此网络和服务器的HDD都不是瓶颈。

我试过的

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. 从本地主机挂载:

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快速写入而不会挂起?


1
您有一个相当全面的测试用例,但我尝试安装在服务器本身上并从那里进行写入,这样您就可以确定NFS堆栈或网络堆栈是否有故障。另外,请尝试切换服务器和客户端(从客户端导出,安装在服务器上),以及同时使用其他客户端。跟踪服务器/客户端进程没有发现任何内容?
达利博尔Karlović2015年

@DaliborKarlović我尝试了除strace之外的所有方法,并在问题中添加了信息。从localhost挂载的速度很慢,因此网络堆栈和交换机似乎没有错。我使用内核空间NFS并Operation not permitted尝试将strace附加到NFS进程。
谢尔盖2015年

我认为这意味着您可以完全排除网络堆栈(但是您需要在其上附加strace以确保)。如果没有某个错误,您应该能够以root用户身份跟踪任何进程。
DaliborKarlović2015年

@DaliborKarlović当然,我尝试将strace作为根。我可以附加到任何用户空间进程,但不能附加到内核空间进程。但是我可以从输出中获得什么信息?我想如果将它附加到NFS并开始上传,它将产生数十万行输出。我应该注意非零返回值吗?
谢尔盖2015年

您是对的,我不是想这是一个非用户的过程。我希望看到它在传输开始时“挂起”时正在做什么,这可能有点琐碎,例如配置错误的反向DNS查找。
达利波·卡洛维奇

Answers:


3

您可以在导出语句中使用sync-option。这意味着服务器仅在将写入操作实际写入磁盘后才确认写入操作。如果您有旋转的磁盘(即没有SSD),则平均每个写入操作至少需要旋转磁盘1/2圈,这是导致速度降低的原因。

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

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


+1最可能的解释是未正确禁用同步。
大卫·史瓦兹

2

这可能是与数据包大小和延迟有关的问题。请尝试以下操作:

该报告将返回您的结果。


我尝试使用MTU = 9000的巨型帧,但结果是相同的。我也尝试使用802.3ad进行链接聚合,再次没有任何更改。因此,我还原了所有这些设置,以使其尽可能接近默认状态。我也试图调整它net.core.*net.ipv4.*系统,但是也许我做的实验太少了。好的,我再做一些测试,然后报告。
Sergey 2015年

我再次尝试调整服务器和客户端上的sysctls,但这没有帮助。
谢尔盖(Sergey)2015年

您是否尝试使用UDP作为传输协议?
shodanshok

我尝试了UDP(安装选项中的proto = udp),但它的工作速度甚至比TCP慢1-2 MB / s。结果是从本地主机和远程主机进行相同的安装。
Sergey 2015年

2

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选项,并防止更新文件访问时间,这本身会导致将其他数据写入磁盘。当需要同时从磁盘读取数据和将数据写入磁盘时,此模式是最快的,它要胜过所有其他模式

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.