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

我有一台CentOS 5 VMWare服务器通过NFS连接到一台OpenSolaris 2009.06机器上,该机器上装有磁盘映像。 我的虚拟机似乎被缓慢的IO绑定,所以我想尽我所能来优化连接。

我不确定测量生产系统吞吐量的最佳方法,但是使用dd bs=1024k count=400一些不科学的testing显示dd bs=1024k count=400 / s的本地(OpenSolaris)写入和远程(CentOS)写入〜50MB /秒。 我想这些都比我实际得到的低7个虚拟机当前运行的连接。

目前,这两台机器是两个网卡(MTU = 9000)上启用巨型帧的直接连接GigE。 除此之外,没有优化。 NFS挂载/导出使用默认值。

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

仅仅为了澄清一下,通过单个Gb以太网连接,你获得了50MB /秒的NFS吗?

主机服务器正在运行安装了VMware Server的CentOS,然后运行7个虚拟机? 是否有一个特别的原因,你已经结合了CentOS和VMware Server,而不是VMware ESXi,这是一个更高性能的解决scheme?

50MB /秒并不是很好,但是比单个Gbnetworking电缆要低很多 – 一旦你把上面提到的NFS调整了一下,你将会看到70- 80MB /秒。 选项沿线:

“RO,硬,INTR,重传= 2,RSIZE = 32768,WSIZE = 32768,nfsvers = 3,TCP”

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

为了达到上述目的,您需要考虑将网卡成对配对,这将使您的吞吐量增加约90%。 您可能需要支持802.3ad的交换机才能获得链路聚合的最佳性能。

有一件事我build议,尽pipeOpenSolaris盒子上的IO吞吐量听起来很高,12个磁盘不太可能支持1.6GB /秒的吞吐量,而Solaris + ZFS可能会高速caching这12个磁盘。

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

nfsvers = 3,TCP,Timeo酒店= 600,重传= 2,RSIZE = 32768,WSIZE = 32768,质硬,INTR,noatime的

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

在NFS服务器上,至less对于Linux no_wdelay来说,如果你有一个带有BBWC的磁盘控制器,那么它应该是有帮助的。 另外,如果在客户端上使用noatime标志,那么也可以在noatime上将文件系统挂载到服务器上。

而且,正如已经提到的,不要打扰UDP。 对于更高速度的networking(1GbE +),序列号环绕会造成数据损坏,但是存在一个很小但非零的概率。 此外,如果有丢包的可能性,TCP将比UDP执行得更好。

如果您不担心数据完整性,那么“asynchronous”导出选项可以是主要的性能改进(与asynchronous相关的问题是如果服务器崩溃,则可能会丢失数据)。

另外,至less对于Linux服务器,您需要确保您有足够的NFS服务器线程运行。 默认的8只是太低了。

我曾经用一个戴尔r710,1个CPU,4GB内存,6个SATA磁盘与RAID-10做了testing。 客户端是一个sun x2100,都是CentOS 5.3和上面提到的nfs参数

“RO,硬,INTR,重传= 2,RSIZE = 32768,WSIZE = 32768,nfsvers = 3,TCP”

与noatime安装在双方。

我也碰到nfsds为256,并使用noc调度器perc6 raid控制器。 我做的另一件事是将分区alignmentRAID控制器的64K条纹大小。

然后我用dd测量了nfs的性能 – 对于读取我可以填写gigEpipe道,但是对于写入,我只能得到稍微好一点的结果,因为你。 随着asynchronous启用我可以得到70至80 MB /秒,但asynchronous是我的select。

也许你不能从一个gigE链接获得更多的nfs?

试试这个:使用以下两个步骤在OpenSolaris NFS服务器上临时禁用ZFS意向日志(ZIL)

  1. echo zil_disable/W0t1 | mdb -kw
  2. 重新安装testing分区

然后再testing一次。 你可以使用zilstat来确保ZIL没有更多的IO。 如果testing运行得更快,则知道性能问题与ZIL有关。 如果它仍然运行缓慢,你知道ZIL不是罪魁祸首,使用固态硬盘ZIL也无济于事。 有关ZIL的更多信息,请参阅“ ZFS恶意调优指南” 。

另一个select是捕获networkingstream量(例如使用Wireshark),看看是否有任何问题,例如巨型帧。 validation电缆上的数据包看起来像您期望从您的configuration。 有什么不好的碎片吗? 有重发吗?

提高读取和写入有效负载大小可以提供帮助。 特别是与巨型帧相结合。

我倾向于发现32k是最佳的。

 rsize=32768,wsize=32768 

切换到UDP传输当然比TCP更快,因为它节省了传输控制的开销。 但是它只适用于可靠的networking,并且NFSv4没有被使用。

通过将SSD用于ZFS意向日志(ZIL),ZFS上的NFS性能大大提高,因为这可以减less操作延迟。 在OpenSolaris NFS和ZFS邮件列表上关于VMWare NFS关于ZFS性能的这个线程还有更多信息,包括一个基准testing工具,以查看ZIL性能是否是瓶颈。

FYI的dd命令将写入caching,并没有磁盘,这可以得到疯狂的数字,如1.6G / s,因为你正在写入RAM而不是在Solaris上的磁盘,你可以使用“-oflag = sync”来强制写入磁盘