调整 NFS 客户端/服务器堆栈

调整 NFS 客户端/服务器堆栈

我有一台 CentOS 5 VMWare 服务器,通过 NFS 连接到一台 OpenSolaris 2009.06 机器,该机器保存着磁盘映像。我的虚拟机似乎受到缓慢 IO 的困扰,所以我想尽一切办法优化连接。

我不确定在生产系统上测量吞吐量的最佳方法,但一些不科学的测试显示dd bs=1024k count=400本地(OpenSolaris)写入速度约为 1.6GB/s,远程(CentOS)写入速度约为 50MB/s。我想这些结果低于我实际得到的结果,因为目前有 7 个虚拟机正在连接上运行。

目前,两台机器是直接连接的千兆以太网,两个网卡上都启用了巨型帧(MTU=9000)。除此之外,没有进行任何优化。NFS 挂载/导出使用默认值。

我应该从哪里开始转动旋钮来提高性能?

答案1

只需澄清一下,您通过单个 Gb 以太网连接使用 NFS 可以获得 50MB/秒的速度吗?

主机服务器运行的是安装了 VMware Server 的 CentOS,而后者又运行着 7 台虚拟机?您选择 CentOS 和 VMware Server 的组合,而不是性能更高的 VMware ESXi,有什么特别的原因吗?

50MB/秒的速度不算太好,但与单 Gb 网线的预期速度相比也不算太低 - 一旦你采用了上面提到的 NFS 调整,你会看到大概 70-80MB/秒的速度。选项如下:

“ro,硬,intr,重新传输=2,rsize=32768,wsize=32768,nfsvers=3,tcp”

对于系统的两端来说可能都是合理的。

为了达到更高的速度,您需要考虑将网卡组合成对,这样可以提高吞吐量约 90%。您可能需要一个支持 802.3ad 的交换机才能获得最佳性能链路聚合

不过,我要建议的一件事是,OpenSolaris 盒子上的 IO 吞吐量听起来高得可疑,12 个磁盘不太可能支持 1.6GB/秒的吞吐量,而且可能被 Solaris + ZFS 大量缓存。

答案2

对于我们的 RHEL/CentOS 5 机器,我们使用以下挂载标志

nfsvers=3,tcp,timeo=600,retrans=2,rsize=32768,wsize=32768,hard,intr,noatime

较新的 Linux 内核版本支持更大的 rsize/wsize 参数,但 EL5 中的 2.6.18 内核的最大值为 32k。

在 NFS 服务器上,至少对于 Linux,如果您有带 BBWC 的磁盘控制器,no_wdelay 应该会有所帮助。此外,如果您在客户端上使用 noatime 标志,那么在服务器上使用 noatime 安装文件系统可能也是有意义的。

而且,正如前面提到的,不要使用 UDP。在高速网络(1GbE+)中,序列号回绕导致数据损坏的可能性很小,但并非为零。此外,如果存在数据包丢失的可能性,TCP 的性能将优于 UDP。

如果您不太担心数据完整性,“异步”导出选项可以大大提高性能(异步的问题是如果服务器崩溃,您可能会丢失数据)。

此外,至少对于 Linux 服务器,您需要确保有足够的 NFS 服务器线程在运行。默认的 8 个线程太低了。

答案3

我曾经用一台戴尔 r710、1 个 CPU、4 GB RAM、6 个 SATA 磁盘和 RAID-10 做过测试。客户端是一台 Sun x2100,两者都装有 CentOS 5.3 和上述 nfs 参数

“ro,硬,intr,重新传输=2,rsize=32768,wsize=32768,nfsvers=3,tcp”

用noatime安装在两侧。

我还将 nfsds 增加到 256,并使用了 perc6 raid 控制器的 noop 调度程序。我做的另一件事是将分区与 raid 控制器的 64K 条带大小对齐。

然后我用 dd 测量了 nfs 性能 - 对于读取,我可以填充千兆以太网管道,但对于写入,我只能获得比你略好的结果。启用异步后,我可以获得 70 到 80 MB/s,但异步对我来说不是选项。

也许你无法通过千兆以太网链接通过 nfs 获得更多?

答案4

提高读取和写入有效负载大小可能会有所帮助。尤其是与巨型帧结合使用时。

我倾向于认为 32k 是最佳的。

rsize=32768,wsize=32768

切换到 UDP 传输当然比 TCP 更快,因为它节省了传输控制的开销。但它只适用于可靠的网络和未使用 NFSv4 的地方。

相关内容