慢的vagrant虚拟机,如何改善?

9
我们为开发环境构建了一个vagrant box,但是我们面临一些延迟问题。
问题如下: - Assetic:watch很慢 - 在(app_dev.php)中访问应用程序整体速度很慢 - 在vagrant box的共享文件夹中使用“find”命令非常缓慢
关于这个box: - 运行在虚拟机virtualbox上(在Mac和Linux上运行) - LAMP env (ubuntu) - 大型代码库(10K+ files) - Symfony 2应用程序
为了提高性能,已经做了以下事情: - 使用NTFS(使用bindfs) - Vagrant配置:
``` config.vm.synced_folder "#{folder['source']}", "/mnt/vagrant-#{i}", id: "#{i}", type: 'nfs', mount_options: ['rw', 'vers=3', 'tcp', 'fsc' ,'actimeo=2'] ```
- 将缓存和日志移出共享文件夹(AppKernel更新)
我们可以清楚地看到,每当访问共享文件夹中的文件时,“bindfs”进程会占用大量CPU资源。首先,这是正常的吗?我期望vagrant将文件复制到box上,只有在访问这些文件时才在本地完成操作。
我们可以看到box本身工作正常,因为当访问缓存数据(共享文件夹之外)时,速度足够快,那么我该如何提高box的性能并避免这些延迟问题?

2
这个问题与 PHP 本身没有什么关系,更不用说 Symfony 了。我认为它应该在超级用户上发布。 - GolezTrol
1
你也可以使用 https://github.com/fgrehm/vagrant-cachier 在虚拟机内缓存 vendor 文件夹。 - Amine Matmati
我成功地将缓存和日志目录移动到了ramdisk。 - mblaettermann
将日志和缓存移动到ramdisk中可以帮助提高速度,但在app_dev中工作时,您无法访问缓存文件,因此在这种情况下,速度增加的重要性较小,真正的问题出现了。 - LEM01
从共享文件夹中删除供应商文件夹有很大帮助。 - LEM01
我参考了这里和其他链接的一些反馈意见。 最大的区别是在kernel.php中添加getCacheDir和getLogsDir,并将这些文件放在'/dev/shm/appname/cache/'中。插件也帮了很多忙 vagrant plugin install vagrant-cachier vagrant plugin install vagrant-faster - Stormnorm
8个回答

9

对于新手来说,有两个插件可以立即增加vagrant虚拟机的速度。

vagrant-cachier

安装 确保您已经安装了Vagrant 1.4+,并运行以下命令:vagrant plugin install vagrant-cachier

Vagrant-faster

vagrant plugin install vagrant-faster

我还使用MySQL-tuner-perl,它非常适用于MySQL的优化调整。希望这对你有所帮助。

6
如果您能简要解释一下为什么这些东西很好以及它们的作用,那将会很有帮助。 - dstandish
1
这两个插件都不是很有用,第一个可能只有在使用多个Vagrant时才有用,而另一个则有点难以理解为什么需要一个插件。 - Blissful
配置您的虚拟机以使用所需的内存和 CPU 数量比使用 vagrant-faster 更好、更安全,而且只需在您的 Vagrantfile 中添加几行代码即可实现: config.vm.provider "virtualbox" do |vb| vb.customize ["modifyvm", :id, "--memory", 16384] vb.customize ["modifyvm", :id, "--cpus", 8] end - Boundless

5
您还需要注意,不要在主机和vagrant之间共享vendor文件夹,如果这样做会导致读取共享文件变慢。请参考此链接link。为此,您需要更改Symfony2项目中的composer.json文件:
"config": {
  ...,
  "vendor-dir": "/some_new_location/vendor"
},

还要更改app/autoload.php

$loader = require '/some_new_location/vendor/autoload.php';

在执行完上述操作后,请运行composer install。

以下是一些阅读资源:

  1. http://www.erikaheidi.com/blog/optimizing-symfony-applications-on-vagrant-boxes/
  2. http://www.whitewashing.de/2013/08/19/speedup_symfony2_on_vagrant_boxes.html
  3. Symfony2初始化速度缓慢

第一个链接无法访问。 - Crouching Kitten
@CrouchingKitten,感谢提供信息。链接已更新 :) - Nikola Loncar

1
如果你使用Phpstorm,你可以使用部署模块将文件从基本机器同步到虚拟机器。然后,本地机器上的每个更改都会上传文件到虚拟机器。这将提高你的性能。我尝试了很多解决方案,但都不够好,例如将缓存文件夹移开,取消共享供应商文件夹...

1

对于测试,您可以尝试启动一个vagrant,但不使用共享文件夹的自动同步选项,例如:

config.vm.synced_folder "./", "/home/vagrant/APP/", disabled: true

现在您将体验到Vagrant(Web应用程序)的最大速度,一切都应该至少快两倍。但是现在主机和虚拟机之间没有同步。
现在,您只需添加特定文件夹“without disabled: true”,其中开发正在进行“src”,“public”,“tests”等等。现在速度应该与第一个测试非常相似,例如:
config.vm.synced_folder "./src", "/home/vagrant/APP/src", disabled: true
config.vm.synced_folder "./public", "/home/vagrant/APP/public", disabled: true

文件夹中有很多文件,例如".git""vendor""node_modules"等,这些会严重拖慢vagrant的性能。

在优化前,我的phpunit测试持续了12分钟,在此优化后只用了4.5分钟(win主机)。

祝使用愉快。

以下是我在homestead(laravel)中的配置参考:

folders:
 - map: "./"
   to: "/home/vagrant/APP"
   type: "nfs"
   options:
     disabled: true
 - map: "./app"
   to: "/home/vagrant/APP/app"
   type: "nfs"
 - map: "./resources"
   to: "/home/vagrant/APP/resources"
   type: "nfs"
 - map: "./routes"
   to: "/home/vagrant/APP/routes"
   type: "nfs"
 - map: "./tests"
   to: "/home/vagrant/APP/tests"
   type: "nfs"
 - map: "./public"
   to: "/home/vagrant/APP/public"
   type: "nfs"

0

当您使用NFS在共享目录中创建大量文件时,速度非常慢。作为解决方法 - 将您的vagrant供应商文件夹更改为非共享文件夹

"config": {
  "bin-dir": "bin",
  "secure-http" : false,
  "vendor-dir" : "/vendor"
},

- 在您的应用程序文件夹中创建符号链接,因为构建过程的某些部分可能通过相对链接引用vendor/bin目录。
project-dir$ sudo ln -s /vendor vendor
  • 执行composer install,这样会快很多

  • 将/vendor文件夹压缩成zip,并将其复制到NFS共享项目文件夹中

  • 通过主机机器解压缩zip文件
  • 再次运行composer install以确保不会再次下载文件

0
  • 考虑允许虚拟机使用一个或两个额外的CPU核心。这可以通过virtualbox gui界面或vagrant配置进行控制。请参见本页底部https://www.vagrantup.com/docs/virtualbox/configuration.html

  • 确保您的虚拟机运行在SSD驱动器上(如果预算允许)

  • 如果您在php.ini中启用了xdebug或xdebug分析,它可能会减慢php的速度。我们注意到,在我们工作的vagrant盒子上禁用xdebug.remote_autostart后,性能有了真正的提升。不过,这确实强制您以不同的方式开始调试会话。

0

0

这些问题主要与VirtualBox中使用的默认文件系统vbfs的性能缓慢有关。根据我的经验,在进行NFS测试之前,加快速度的最佳方法是更新虚拟机中的Guest Additions。最简单的方法是使用vagrant-vbguest插件,在后台更新GA。我的编译速度提高了三倍。

要在Vagrant中使用它,请编辑文件并将其添加到开头:

# NOTE: Auto-install vagrant plugins
required_plugins = %w(vagrant-vbguest)

plugins_to_install = required_plugins.select { |plugin| not Vagrant.has_plugin? plugin }
if not plugins_to_install.empty?
    puts "Installing plugins: #{plugins_to_install.join(' ')}"
    if system "vagrant plugin install #{plugins_to_install.join(' ')}"
        exec "vagrant #{ARGV.join(' ')}"
    else
        abort "Installation of one or more plugins has failed. Aborting."
    end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接