Vagrant共享目录文件系统sshfs、nfs、vboxfs、native fs性能比较测试

Vagrant共享目录文件系统sshfs、nfs、vboxfs、native fs性能比较测试

工作中使用vagrant作为开发环境,一直比较懒,直接用的默认方式共享目录,但随着项目越来越大,而且我的笔记本一般又不关机,都是直接合上,导致系统越来越慢,不但在guest中慢(比如切换目录要1秒),连在host上打开目录也变得很慢。

终于有一天实在受不了,决定查查原因,网上看了很多文章,包括官网的文档,了解到大概有这样几种共享目录的方式:

NFS、RSync、SMB、sshfs、vboxfs、unionfs

其中

  • RSync和Unionfs不是我的菜,因为它们是基于同步原理,同样的文件,host和guest中都得留一份。(当然我也没配置成功,说是ssh无权限,但我用默认私钥ssh是正常的)
  • SMB也不是我的菜,因为它会留下一下匿名的共享账户,安全性很成问题(当然我也没配置成功,只要设置type为smb,vagrant启动时就会卡在启动第一步:clean port什么的)
  • nfs官方说明:NFS folders do not work on Windows hosts.不过有个插件vagrant-winnfsd安装一下就可以支持了。
  • sshfs资料很少,仅有的几篇文章中说它的性能不错。
  • vboxfs为默认的共享目录文件系统,都说性能很差,我日常应用时,如果长时间不重启系统,也会觉得有点卡。

不过一直很少有看到对这几种系统的性能作一个全面对比的评测。

所以我决定用几个简单的测试大体看看sshfs、nfs、vboxfs、native的性能到底有多大区别。

测试环境为:Vagrant 1.9.7, VirtualBox 5.1.26, 每次切换挂载的文件系统前用 df -T 查看文件系统,防止vb使用默认文件系统挂载。

其中我选择了一个我日常开发所在的项目目录 /www来挂载到virtualBox中,总大小为2.88GB, 共80079个文件, 12254个文件夹,含有多个深层目录,对它的一次遍历也是挺耗时的。两个脚本如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#! /bin/bash
###read.sh
#read file in directory recursively
function read_dir(){
    for file in `ls $1`
    do
        if [ -d $1"/"$file ]
        then
            read_dir $1"/"$file
        else
            cat $1"/"$file > /dev/null
        fi
    done
}
read_dir /www
1
2
3
4
5
6
7
#!/bin/bash
###write.sh
#large amount of small file write
for (( i = 1; i <=10000; i++ ))
do
    dd if=/dev/zero of=/www/test/${i}.dd  bs=100K count=1;sync
done

文件系统Benchmark(目录大小为2.8GB)

结果格式hⓂ️s.ms sshfs nfs vboxfs native (目录大小为3.3GB)
测试A(sync;time du -h /www
大量文件及目录的信息读取 10:14 1:15 1:35 23 s
测试B(sync;time du -h /www
(warm A) 10:12 1:28 1:35 19 s
测试C(sync;time ./read.sh
大量文件的内容读取 1:45:17.58 7:55.11 9:22.67 9:15.17
测试D(sync;time ./read.sh
(warm C) 1:46:11.21 7:53.79 9:23.76 8:36.96
测试E(sync;time bash -c "(dd if=/dev/zero of=/tmp/test.dd bs=50K count=20000;sync)
1GB连续文件的写入 1:05.9013 (15.5 MB/s) 29.5498 s (34.7 MB/s) 30.3650 s (33.7 MB/s) 4.30492 s (238 MB/s)
测试F(sync;time ./write.sh
10000个100KB文件的写入 17:12.82 2:12.43 2:16.95 2:09.65
测试G(sync;time rm /www/test -R
10000个100KB文件的删除 34.227 s 10.152 s 14.860 s 1.096 s

从数据上看nfs和vboxfs的差距并不大,但是nfs写入时会有莫名其妙的问题,有时在java中无法创建中文目录,也不报错,但是同样的代码仅仅将共享目录换成vboxfs就可以正常创建中文目录。因此我觉得还是继续用默认的vboxfs吧,我把pm2的watch和webpack的watch都关闭掉,感觉也流畅了不少,只是在目录切换时还是会停留1-2s,怀疑是git的原因。

由于时间和精力有限,没能做更多的测试,如有不对处欢迎指正。