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个文件夹,含有多个深层目录,对它的一次遍历也是挺耗时的。两个脚本如下:
|
|
|
|
测试成绩如下:
文件系统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的原因。
由于时间和精力有限,没能做更多的测试,如有不对处欢迎指正。