NFS写性能差

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

使用iperftestingTCP上的networking速度在两个方向上显示iperf Gbit / s吞吐量,因此networking正常。

testingNFS服务器的磁盘性能

 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兆字节/秒的性能,这接近服务器的本地磁盘性能,所以它是令人满意的。

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

当上传速度达到最大值(18-20 Mbytes / s)时,我运行iptraf-ng ,在networking接口上显示iptraf-ng Mbit / s的stream量,所以networking不是这里的瓶颈,也是服务器的硬盘。

我试过的:

1.在仅连接100Mb以太网NIC的第三台主机上设置NFS服务器。 结果是类比的:DLperformance出良好的性能和几乎完整的100Mbitnetworking利用率,上传速度不超过每秒几百千字节,使networking利用率非常低(根据iptraf-ng为2.5 Mbit / s)。

2.我试图调整一些NFS参数:

  • syncasync

  • noatime

  • hard

  • rsizewsize在我的例子中是最大的,所以我试图减less他们在几个步骤下降到8192

3.我试图切换客户机和服务器机器(在以前的客户机上build立NFS服务器,反之亦然)。 此外,还有六台服务器的configuration相同,所以我试图以不同的方式安装它们。 同样的结果。

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,传输实际开始之前有一个小的延迟。 这是否意味着networking堆栈工作正常,问题出在NFS上?

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

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

OS是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 

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

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

  • 在两台机器上启用巨型帧 (MTU> = 9000字节)
  • 使用UDP或者手动增加两台机器上的TCP窗口大小

报告返回您的结果。

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

在具有硬件RAID的系统上configurationLinux调度程序并将缺省值从[cfq]更改为[noop],可以改进I / O。

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

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

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

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

对于更快的磁盘写入,请使用文件系统数据=日志选项,并防止更新文件访问时间,这本身会导致额外的数据写入磁盘。 这种模式是最快速的,当数据需要从超出所有其他模式的同时读取和写入磁盘

您在导出语句中使用同步选项。 这意味着服务器只有在实际写入磁盘后才确认写入操作。 鉴于你有一个旋转磁盘(即没有固态硬盘),每次写入操作平均需要至less1/2的磁盘旋转,这是放缓的原因。

使用asynchronous设置,服务器在处理完成但尚未写入磁盘时立即确认对客户端的写入操作。 这是一个更不可靠的,例如,如果客户端收到一个没有发生的操作的电源故障的情况下。 但是,它的写入性能却有了巨大的提升。

(编辑)我刚才看到你已经testing了asynchronous与同步的选项。 但是,我几乎可以肯定,这是你的性能下降问题的原因 – 我曾经有一个idencitcal设置完全相同的迹象。 也许你再试一次。 您是否在服务器的导出语句中同时select了asynchronous选项,并同时在客户端执行了装载操作?