我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
通过lockd
TCP 和 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。这两个版本有很大不同,这可能会对性能产生很大影响。