如何为 git 等工作负载获得良好的 NFS 性能?

如何为 git 等工作负载获得良好的 NFS 性能?

vagrant为我们的开发人员管理一个运行 OSX 的设置,以管理用于开发的 VirtualBox 系统。

为了inotify在 Linux 机器内部提供支持,我们避开了与 VirtualBox 共享目录的通常方法:相反,Virtualbox 机器公开一个 NFS 共享,该共享安装在 OSX 中。

Git(以及 sourcetree 等相关工具)在 OSX 的共享目录中运行。其性能极差:运行通常需要长达 5 秒钟git status。将小型存储库克隆到已安装的 NFS 驱动器可能需要几分钟(在本地驱动器上需要 5-10 秒)。

显然,NFS 性能会比直接写入本地 SSD 更差,但 NFS 只是通过 Virtualbox 的虚拟专用网络接口运行。

我运行了几个基准测试。第一个:

dd if=/dev/zero of=test bs=16 count=16384

每个结果基于 100 个样本。

# local drive
Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
0.990   1.000   1.020   1.021   1.030   1.130

# on the shared NFS drive
Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
6.000   6.278   6.390   6.482   6.570   7.630

# inside the VirtualBox instance
Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
0.3600  0.4800  0.5150  0.5552  0.5400  1.4500

第二个基准:

ioping -c 500

local avg: 6 microseconds
local IOPS: 65.5 k

NFS Latency avg: 703 microseconds
NFS OPS: 1.4 k

显然,一定的延迟是不可避免的,但这已经够糟糕了,以至于让一些简单的任务变得相当痛苦。

该卷的所有者正在运行 Ubuntu 12.10 (Quantal),使用默认设置。安装该卷的系统正在运行 OSX Mavericks。

目前,主 nfsd 连接通过 UDP 运行,这似乎是虚拟连接的理想选择。我不确定是否statsd通过lockdTCP 和 UDP 运行。

我尝试过使用async旗帜和rwsize助推器进行安装,但没有什么区别。

在这种环境下,有哪些机会可以显著提高 NFS 的性能?

答案1

更新:core.preloadindex现在默认启用,因此这个答案没有什么区别。

尝试使用此 Git 设置,这会对 NFS 共享产生巨大的性能差异:

git config core.preloadindex true

引自以下文档:https://git-scm.com/docs/git-config#git-config-corepreloadIndex

这可以加快 git diff 和 git status 等操作的速度,尤其是在 NFS 等具有弱缓存语义且因此具有相对较高 IO 延迟的文件系统上。启用后,Git 将并行对文件系统数据进行索引比较,从而允许重叠 IO。默认为 true。

答案2

本文包含一些调整 NFS 性能的有用技巧。

特别是用来nfsstat -rc检查发生了多少次“重传重试”。如果重试次数过多,则意味着nfsd守护进程用尽了线程来处理客户端的请求,您需要增加可用线程的数量。

此外,请确保您的 VirtualBox 实例不是精简配置的;VirtualBox 上的精简配置存储是重要的写入时性能会受到影响。

答案3

另一个答案已经提到检查 NFS 统计数据。

可能值得尝试针对 VirtualBox vm 的不同(虚拟)nic 配置 - 不同的虚拟芯片组和模式(桥接模式而不是 nat)。

此外,如果使用了 NFSv4,可能值得尝试 NFSv3。这两个版本有很大不同,这可能会对性能产生很大影响。

相关内容