物理机和虚拟机的Web应用性能比较
概述
在虚拟机而不是你的主机中进行Web开发可以提供很多好处:开发环境很容易分发,可以密切配合生产,并且可以随意重新创建。 Vagrant(赵亮注:一个基于Ruby的工具,用于创建和部署虚拟化开发环境)已经解决了无缝使用虚拟机的许多头痛问题,如网络和共享文件系统。然而,许多潜在的用户担心性能会影响在虚拟机中的开发。
我决定为一些典型任务量化比较性能差异,比较对象是我“本地的”的OS X机器作为主机,与 Vagrant 搭配 VirtualBox提供器 , 和 Vagrant 搭配 在 VMware Fusion(付费)之上的 Fusion 提供器(付费) 。
测试设置
我使用我的相对微不足道的2012 MacBook Air -它有一个酷睿i5芯片,一个SSD的8G内存。我的目标是衡量在典型的web开发任务中这些机器配置之间的性能差异,所以不要拿这些数字作为绝对依据。
我选择在Discourse 论坛应用程序上做我的测量。它是用Ruby on Rails写的,在规模和复杂性上与大多数公司的应用程序相比有一个相当大的测试套件。同时,它是免费和开放源码的,所以请你自己也尝试实验一下这些结果!
对于VirtualBox和Fusion,我都分配了2G的RAM给虚拟客户机。我试着只分配1G来再次使用这些测试,但并没有造成明显的差别。客户机运行一个典型的服务集:redis、postgres、nginx。
VirtualBox也测试了用NFS代替共享文件夹,这里列出了使用它的速度效益:http://docs-v1.vagrantup.com/v1/docs/nfs.html。然而,如果你的主机不支持NFS,你可能无法使用它。
time `bundle exec script/rails runner "0"`
应用程序的启动时间对于开发人员来说是一个严重的摩擦根源,尤其是如果你做“测试驱动”的开发(你应该会的!)。请注意我用Ruby 2.0.0,它比1.9.3显著提高了所需方法的性能。10秒是一个等待应用程序开始的长得见鬼的时间,如果你有兴趣改善这个,可以看看nailgun (JRuby),spork 和 zeus。
我在每台机器上运行了三次脚本,并记录下挂钟的时间:
在主机上的结果:
real 0m9.173s real 0m8.739s real 0m8.823s
用 VirtualBox w/ 共享文件夹 的结果:
real 0m21.764s real 0m19.342s real 0m20.674s
用 VirtualBox w/ NFS 的结果:
real 0m9.500s real 0m8.669s real 0m8.625s
用 VMware Fusion 的结果:
real 0m10.587s real 0m10.095s real 0m10.445s
运行总体测试套件的时间
我测量的时间是通过下面简单的调用来运行整个Discourse测试套件所花费的时间:
bundle exec rake spec
这个Discourse 套件共有 2672 个单独测试用例。
在主机上的结果:
Finished in 4 minutes 19.64 seconds Finished in 3 minutes 52.26 seconds Finished in 4 minutes 1.03 seconds
VirtualBox w/ 共享文件夹 的结果:
Finished in 5 minutes 31.31 seconds Finished in 5 minutes 12.14 seconds Finished in 5 minutes 32.54 seconds
VirtualBox w/ NFS 的结果:
Finished in 4 minutes 42.27 seconds Finished in 4 minutes 16.27 seconds Finished in 4 minutes 43.79 seconds
VMware Fusion 的结果:
Finished in 4 minutes 16.68 seconds Finished in 4 minutes 23.95 seconds Finished in 4 minutes 22.87 seconds
因此…
VMware Fusion 和 VirtualBox+NFS ,比 VirtualBox+共享文件夹 快得多, 仅略落后于使用主机。
在这种情况下使用这两种虚拟机解决方案都有超过使用主机的优势,因为当你不进行开发时可以挂起虚拟机来释放其所有资源!
请通过[email protected] 让我们知道你自己关于这方面的经历!
附录
我更多地查看那些例程的I/O性能,比如数据库的访问,这些会影响的集成测试速度。postgres 附带了 pgbench ,它是一个虽然综合但简单的测量postgresql性能的方法。在这两种情况下,postgres的配置默认都是withshared_buffersset = 24 mb 和 autovacuum = off。我使用的脚本如下:
createdb pgbench pgbench -i -s 10 pgbench # use scalefactor = 10 pgbench -T 600 pgbench # collect results over 10 minutes
在主机上的结果:
transaction type: TPC-B (sort of) scaling factor: 10 query mode: simple number of clients: 1 number of threads: 1 duration: 600 s number of transactions actually processed: 673985 tps = 1123.322847 (including connections establishing) tps = 1123.328761 (excluding connections establishing)
用VirtualBox的结果:
number of transactions actually processed: 421642 tps = 702.709747 (including connections establishing) tps = 702.713031 (excluding connections establishing)
用VMware Fusion的结果:
number of transactions actually processed: 558332 tps = 930.552663 (including connections establishing) tps = 930.557223 (excluding connections establishing)