我有一个使用Vagrant运行的Symfony 2.0应用程序,其中包含Linux guest虚拟机和主机O / S(Ubuntu)。但是,它运行缓慢(例如,加载页面需要几秒钟,通常超过10秒),我无法解决原因。我在本地运行站点而不是Vagrant VM的同事让它运行得更快。
我在其他地方读过,如果未启用NFS,Vagrant VM运行速度非常慢,但我启用了它。我也在使用APC缓存试图加快速度,但问题仍然存在。
我使用http://webmozarts.com/2009/05/01/speedup-performance-profiling-for-your-symfony-app上的说明对我的网站运行xdebug,但我不清楚从哪里开始分析这些数据。我已经在KCacheGrind中打开它并在“Incl。”下寻找高数字。和“自我”,但这表明php::session_start
需要相当长的时间。
关于我应该在这里尝试什么的任何建议?对于稍微宽泛的问题,我很抱歉,但我很难过!
答案 0 :(得分:19)
我在OS X主机上看到类似的问题,我忘了启用 NFS ! 在Windows主机上,性能影响不太真实...... 对于我非常小的网站,我有12649个文件...因此很容易达到1000+文件限制。
所以我的两分钱:在你的Vagrantfile中启用 NFS :
config.vm.share_folder "v-root", "/vagrant", ".." , :nfs => true
来自专家:
一个众所周知的问题是,随着共享文件夹中文件数量的增加,VirtualBox共享文件夹性能会迅速下降。当一个项目达到1000多个文件时,做一些简单的事情,比如运行单元测试甚至只是运行一个应用服务器,可能会比原生文件系统慢几个数量级(例如从5秒到超过5分钟)。
如果您在共享文件夹中看到此类性能下降,则NFS共享文件夹可以提供解决方案。 Vagrant将在主机上编排NFS服务器的配置,并将为客户端安装该文件夹。
注意:Windows主机不支持NFS。根据VirtualBox,Windows上的共享文件夹不应受到与基于unix的系统相同的性能损失。如果不是这样,请随时使用我们的支持渠道,也许我们可以帮助您。
编辑:
在Windows上,我找到了另一个解决方案,我在项目中的供应商文件夹上使用符号链接(ln -fs)链接到非共享文件夹。这样可以减少Windows主机,防病毒软件等所看到的文件数量。
答案 1 :(得分:6)
在我工作的地方,我们尝试了两种解决Vagrant + Symfony问题的解决方案。我推荐第二个(nfs和绑定坐骑)。
rsync方法
首先,我们使用了rsync。我们的方法与AdrienBrault's answer中概述的略有不同。相反,我们在Vagrantfile
:
config.vm.define :myproj01 do |myproj|
# Networking & Port Forwarding
myproj.vm.network :private_network, type: "dhcp"
# NFS Share
myproj.vm.synced_folder ".", "/home/vagrant/current", type: 'rsync', rsync__exclude: [
"/.git/",
"/vendor/",
"/app/cache/",
"/app/logs/",
"/app/uploads/",
"/app/downloads/",
"/app/bootstrap.php.cache",
"/app/var",
"/app/config/parameters.yml",
"/composer.phar",
"/web/bundles",
"/web/uploads",
"/bin/behat",
"/bin/doctrine*",
"/bin/phpunit",
"/bin/webunit",
]
# update VM sooner after files changed
# see https://github.com/smerrill/vagrant-gatling-rsync#working-with-this-plugin
config.gatling.latency = 0.5
end
正如您从上面可能看到的那样,我们使用Vagrant gatling rsync plugin保持文件同步。
改进的NFS方法,使用绑定挂载(推荐的解决方案)
rsync方法解决了速度问题,但我们发现了一些问题。特别是,当在VM上生成文件(如composer.lock
或Doctrine迁移)时,或者当我们想要访问{{1}中的代码时,它的单向性(与共享文件夹相对)很烦人}。我们不得不将SFTP复制回去 - 而且,如果是新文件,请在下一次使用gatling插件清除之前执行此操作!
因此,我们转向使用binding mounts来处理缓存和日志等文件夹的解决方案。没有这些共享会大大提高速度。
Vagrantfile的相关位如下:
/vendor
上面引用的# Binding mounts for folders with dynamic data in them
# This must happen before provisioning, and on every subsequent reboot, hence run: "always"
config.vm.provision "shell",
inline: "/home/vagrant/current/bin/bind-mounts",
run: "always"
脚本如下所示:
bind-mounts
NFS +绑定挂载是我建议的方法。
答案 2 :(得分:5)
ATM,基本上,不要将您的网站代码放在/ vagrant共享文件夹中。 由于它在您的VM和主机O / S之间共享,因此速度较慢;我没有找到任何有效的解决方案来获得良好的性能。 我们使用的解决方案是使用经典/ var / www为我们的开发应用程序提供服务,并使用rsync将它们与我们的本地副本保持同步。
答案 3 :(得分:3)
按照本文中的说明Speedup Symfony2 on Vagrant boxes帮助我解决了这个问题,将我的Symfony2项目的页面加载时间从6-10秒减少到1秒。基本上所有修复都是使用NFS设置主机和guest虚拟机(vagrant VM box)之间的同步类型,而不是使用非常慢的VirtualBox共享文件夹系统。
同样在Symfony2项目的AppKernel.php中添加以下代码,将缓存和日志目录更改为vagrant框上的共享内存目录(/ dev / shm),而不是将其写入NFS共享,因此它改进了页面加载速度更快。
<?php
class AppKernel extends Kernel
{
// ...
public function getCacheDir()
{
if (in_array($this->getEnvironment(), array('dev', 'test'))) {
return '/dev/shm/appname/cache/' . $this->getEnvironment();
}
return parent::getCacheDir();
}
public function getLogDir()
{
if (in_array($this->getEnvironment(), array('dev', 'test'))) {
return '/dev/shm/appname/logs';
}
return parent::getLogDir();
}
}
答案 4 :(得分:1)
我使用sshfs在主机操作系统和VM之间共享目录(用于Windows的Expan驱动器) 它比原生VBox目录共享快得多