我有一个服务器系统运行Ubuntu 12.10连接12个磁盘。 我正在使用NFSv4在我的10千兆networking上共享所有这些磁盘。 但是,与我能够在本地获得的性能相比,我的NFS性能普遍较差。 我在研究糟糕的NFS性能时遇到的一般解决scheme是在服务器的exports文件中使用async选项,而不是使用sync。 但是,这根本不是我的目的。 我知道这会引起一场表演,但我不会期望我能看到。
我发现我在NFS客户端上主动使用的磁盘越多,每个磁盘的吞吐量就越差。 例如,如果我只使用1个磁盘,则可以以60MB / s的速度写入数据。 但是,如果我主动使用全部12个磁盘,则每个磁盘只能以12MB / s的速度写入。 等价的本地testing可以产生每个磁盘200MB / s没有问题。 是否有可能做一些调整来优化多个磁盘的NFS性能? 在服务器正在被使用的时候,CPU和内存似乎都没有被使用。
看起来像同步写入是这里的罪魁祸首,不幸的是,当同步写入是系统的需求时,你可以做的不多。
问题是因为正在写入数据的远程系统必须等待整个文件系统块被写入才能写入下一个文件系统块。 正如你所看到的那样,如果块尺寸很小,这对性能是不利的。
这个问题没有很好的解决办法,但是这里有一些可能的select来缓解瓶颈:
增加块大小,以便能够在每个操作中写入更多的数据。
获取单独的快速SSD或NVRAM设备进行写入caching/日记。 这将显着提高所有工作负载的吞吐量。 这可以通过在Ubuntu上使用tune2fs(8)命令的ext4来完成,并添加一个带有-J参数的外部日志设备。
将NFS共享分成一个专用于同步写入和另一个asynchronous写入。 这样,您可以将任何非关键数据放在asynchronous共享上,以独立地提高该工作负载的吞吐量。
尝试一个不同的文件系统,可以让你稳定地写本地caching。 我在我的SAN上的FreeBSD上使用了ZFS ,并使用了SSD支持的意向日志(相当于ext4上的日志)。 我从来没有尝试过Linux上的ZFS,但现在看起来是一个比较成熟的项目。 添加SSD之后,我的读写吞吐量都大大提高了。 我不确定你对ZFS的熟悉程度,但是如果你不知道,ZIL(ZFS意图日志)的目的是在快速,稳定的存储上提供一个写入caching,比如SSD。 日志将定期提交到事务组中的磁盘,以确保数据不会丢失,并且在发生停电时,可以从日志中重播写入以恢复文件系统的完整性。
过去我遇到过这个问题,真的找不到完全消除问题的好方法。 如果您发现任何其他方法来缓解这个问题,请让我知道!