为什么我的Symfony 2.0站点在使用Linux主机的Vagrant上运行缓慢?

时间:2012-08-28 14:23:13

标签: symfony vagrant

我有一个使用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需要相当长的时间。

关于我应该在这里尝试什么的任何建议?对于稍微宽泛的问题,我很抱歉,但我很难过!

5 个答案:

答案 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目录共享快得多