使用多个磁盘时 NFS 性能不佳

使用多个磁盘时 NFS 性能不佳

我有一个运行 Ubuntu 12.10 的服务器系统,上面连接了 12 个磁盘。我使用 NFSv4 在 10 千兆网络上共享所有这些磁盘。但是,与本地性能相比,我在 NFS 上获得的性能通常较差。在针对 NFS 性能不佳的研究中,我遇到的一般解决方案是在服务器的导出文件中使用异步选项,而不是同步。但是,这根本不适合我的目的。我知道这会导致性能下降,但我不希望达到我看到的程度。

我发现,我在 NFS 客户端上主动使用的磁盘越多,每个磁盘的吞吐量就越差。例如,如果我只主动使用 1 个磁盘,我能够以 60MB/s 的速度写入。但是,如果我主动使用所有 12 个磁盘,我只能以每个磁盘 12MB/s 的速度写入。等效本地测试可以毫无问题地产生每个磁盘 200MB/s。是否可以进行一些调整以优化多磁盘 NFS 性能?在服务器被主动使用时,CPU 或内存似乎都没有得到充分利用。

答案1

看起来同步写入是这里的罪魁祸首,不幸的是,当系统需要同步写入时,你对此无能为力。

问题在于,正在写入数据的远程系统必须等待整个文件系统块写入完毕后才能写入下一个块。如您所见,如果块大小较小,这将损害性能。

这个问题没有好的解决方案,但是这里有一些可以缓解瓶颈的可能的选择:

  • 增加块大小,以便每次操作可以写入更多数据。

  • 获取单独的快速 SSD 或 NVRAM 设备用于写入缓存/日志记录。这将显著提高所有工作负载的吞吐量。这可以通过 ext4 使用tune2fs(8)命令,并使用参数添加外部日志设备-J

  • 将 NFS 共享拆分为一个专用于同步写入的共享和一个专用于异步写入的共享。这样,您可以将任何非关键数据放在异步共享上,以独立提高该工作负载的吞吐量。

  • 尝试使用其他文件系统,这样你就可以本地执行稳定的写入缓存。我使用虚拟文件系统FreeBSD在我的 SAN 上使用 SSD 支持的意图日志(相当于 ext4 上的日志)。我从未尝试过Linux 上的 ZFS但现在它似乎是一个相当成熟的项目。添加 SSD 后,我的 iSCSI 读写吞吐量都显著提高。我不确定您是否熟悉 ZFS,但如果您不知道,ZIL(ZFS 意图日志)的目的是在快速、稳定的存储(如 SSD)上提供写入缓存。日志将定期以事务组的形式提交到磁盘,以确保数据不会丢失,并且在断电时,可以从日志中重放写入以恢复文件系统完整性。

我以前也遇到过这个问题,但确实没有找到彻底消除该问题的好方法。如果您发现任何其他缓解该问题的方法,请告诉我!

相关内容