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使用默认文件系统挂载。


测试A:大量文件及目录的信息读取                         (命令:sync;time du -h /www

测试B:大量文件及目录的信息读取(warm)         (命令:sync;time du -h /www

测试C:大量文件的内容读取                                   (命令:sync;time ./read.sh

测试D:大量文件的内容读取(warm)                   (命令:sync;time ./read.sh

测试E:1GB连续文件的写入                                   (命令:sync;time bash -c "(dd if=/dev/zero of=/tmp/test.dd  bs=50K count=20000;sync)"

测试F:10000个100KB文件的写入                         (命令:sync;time ./write.sh

测试G:10000个100KB文件的删除                         (命令:sync;time rm /www/test -R


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

#! /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

#!/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
结果格式
h:m:s.ms
sshfs
(目录大小为2.8GB)
nfs
(目录大小为2.8GB)
vboxfs
(目录大小为2.8GB)
native
(目录大小为3.3GB)
测试A
大量文件及目录的信息读取
10:141:151:3523 s
测试B
(warm A)
10:121:281:3519 s
测试C
大量文件的内容读取
1:45:17.587:55.119:22.679:15.17
测试D
(warm C)
1:46:11.217:53.799:23.768:36.96
测试E
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
10000个100KB文件的写入 
17:12.822:12.432:16.952:09.65
测试G
10000个100KB文件的删除
34.227 s10.152 s14.860 s1.096 s

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值