我有两台通过 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,因此网络在这里不是瓶颈,服务器的 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. 系统控制调整:
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
您在导出语句中使用了 sync-option。这意味着服务器仅在写入操作实际写入磁盘后才确认写入操作。假设您有一个旋转磁盘(即没有 SSD),这平均需要每次写入操作至少旋转 1/2 圈,这就是导致速度变慢的原因。
使用异步设置,当写操作已处理但尚未写入磁盘时,服务器会立即向客户端确认该操作。这有点不可靠,例如,在发生电源故障时,客户端会收到未发生的操作的确认。但是,它可以大大提高写入性能。
(编辑)我刚刚看到您已经测试了 async 与 sync 选项。但是,我几乎可以肯定这是导致性能下降问题的原因——我曾经在相同的设置下遇到过完全相同的指示。也许您再测试一下。您是否同时在服务器的导出语句和客户端的挂载操作中给出了 async 选项?
答案2
答案3
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 选项并阻止更新文件访问时间,这本身会导致将更多数据写入磁盘。当需要同时从磁盘读取和写入数据时,此模式是最快的,它优于所有其他模式
答案4
有点难以发现为什么转账这么慢。这个话题已经很老了,但即使在今天,快速找到正确的解决方案仍然相对困难。
顺便说一句:就我而言,尝试从 TCP 切换到 UDP 只会使速度变慢。
使用这一句话解决了这个问题立即(更改网络以192.168.1.0/24
满足/mount_target
您的需求):
sudo exportfs -o rw,async,no_subtree_check 192.168.1.0/24:/mount_target
如果希望保留这些更改,请将其添加到文件中,/etc/exports
如下所示:
/mount_target 192.168.1.0/24(rw,async,no_subtree_check)
请记住,在此示例中,/24
授予整个本地网络的访问权限。192.168.1.0
一个好的做法是检查并验证这些导出选项的含义到您的系统。
使用上述设置,我能够将网络连接(测试了 1Gb 和 10Gb)饱和到至少 95%。当然,您可以进一步优化它以挤出更多的吞吐量字节,但这绝对足以满足我的使用需求。希望对您有所帮助。
注意:已测试NFSv3转账自Windows 和 Linux。