Eu gerencio uma configuração de vagrant
para nossos desenvolvedores que executam o OSX para gerenciar sistemas VirtualBox para desenvolvimento.
Para suportar inotify
dentro da máquina linux, evitamos o método usual de compartilhar diretórios com o VirtualBox: em vez disso, a máquina Virtualbox expõe um compartilhamento NFS, que é montado no OSX.
Git (e ferramentas relacionadas como sourcetree) são executados no OSX, no diretório compartilhado. O desempenho disso é extremamente ruim: geralmente leva até 5 segundos para executar git status
. Clonar um pequeno repositório na unidade NFS montada pode levar alguns minutos (5-10 segundos em uma unidade local).
Obviamente, o desempenho do NFS será pior do que escrever diretamente para um SSD local, mas o NFS está apenas executando uma interface de rede virtual privada com o Virtualbox.
Eu corri alguns benchmarks. O primeiro:
dd if=/dev/zero of=test bs=16 count=16384
Cada resultado é baseado em 100 amostras.
# 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
O segundo benchmark:
ioping -c 500
local avg: 6 microseconds
local IOPS: 65.5 k
NFS Latency avg: 703 microseconds
NFS OPS: 1.4 k
Claramente, alguma latência é inevitável, mas isso é ruim o bastante para dificultar bastante algumas tarefas simples.
O proprietário do volume está executando o Ubuntu 12.10 (Quantal), com configurações padrão. O sistema que monta o volume está executando o OSX Mavericks.
No momento, a conexão nfsd principal está sendo executada pelo UDP, o que parece ideal em uma conexão virtual. Não tenho certeza se statsd
e lockd
estão sendo executados sobre TCP e UDP.
Eu tentei montar com o sinal async
e com rwsize
aumentado, e isso fez pouca diferença.
Quais oportunidades existem para melhorar seriamente o desempenho do NFS neste ambiente?