17

我有一个 Symfony 2.0 应用程序,它使用 Vagrant 和 Linux 来宾和主机 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需要相当长的时间。

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

4

5 回答 5

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 主机、防病毒软件等看到的文件数量。

于 2012-12-04T12:40:30.053 回答
6

在我工作的地方,我们尝试了两种解决 Vagrant + Symfony 速度慢的问题的方法。我推荐第二个(nfs 和绑定挂载)。

rsync 方法

首先,我们使用rsync我们的方法与AdrienBrault 的回答中概述的方法略有不同。相反,我们的代码如下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 插件保持文件同步。

改进的 NFS 方法,使用绑定挂载(推荐解决方案)

rsync 方法解决了速度问题,但我们发现它存在一些问题。特别是,当在 VM 上生成文件(如composer.lock或 Doctrine 迁移)时,或者当我们想要访问/vendor. 我们必须使用 SFTP 将内容复制回来 - 对于新文件,请在下一次运行 gatling 插件清除它们之前执行此操作!

因此,我们转向了一种解决方案,该解决方案使用绑定挂载来以不同的方式处理缓存和日志等文件夹。没有这些共享会大大提高速度。

Vagrantfile 的相关位如下:

# 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脚本如下所示:

#!/bin/bash

mkdir -p ~vagrant/current/app/downloads/
mkdir -p ~vagrant/current/app/uploads/
mkdir -p ~vagrant/current/app/var/
mkdir -p ~vagrant/current/app/cache/
mkdir -p ~vagrant/current/app/logs/

mkdir -p ~vagrant/shared/app/downloads/
mkdir -p ~vagrant/shared/app/uploads/
mkdir -p ~vagrant/shared/app/var/
mkdir -p ~vagrant/shared/app/cache/
mkdir -p ~vagrant/shared/app/logs/

sudo mount -o bind ~vagrant/shared/app/downloads/ ~/current/app/downloads/
sudo mount -o bind ~vagrant/shared/app/uploads/ ~/current/app/uploads/
sudo mount -o bind ~vagrant/shared/app/var/ ~/current/app/var/
sudo mount -o bind ~vagrant/shared/app/cache/ ~/current/app/cache/
sudo mount -o bind ~vagrant/shared/app/logs/ ~/current/app/logs/

NFS + 绑定安装是我推荐的方法。

于 2014-10-08T09:22:49.333 回答
5

ATM 基本上不会将您的网站代码放在 /vagrant 共享文件夹中。由于它在您的 VM 和主机 O/S 之间共享,因此速度较慢;而且我没有找到任何有效的解决方案来获得良好的性能。我们使用的解决方案是从经典的 /var/www 为我们的开发应用程序提供服务,并使用 rsync 使它们与我们的本地副本保持同步。

于 2012-08-28T21:54:35.487 回答
3

按照这篇文章Speedup Symfony2 on Vagrant box的说明,帮助我解决了这个问题,将我的 Symfony2 项目的页面加载时间从 6-10 秒减少到 1 秒。基本上所有的解决方法是使用 NFS 设置主机和来宾(vagrant VM 框)之间的同步类型,而不是使用非常慢的 VirtualBox 共享文件夹系统。

还将以下代码添加到 Symfony2 项目的 AppKernel.php 中,将缓存和日志目录更改为 vagrant box 上的共享内存目录(/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();
    }
}
于 2014-12-06T12:08:50.643 回答
1

我使用 sshfs 在主机 OS 和 VM 之间共享目录(Windows 的扩展驱动器)它比原生 VBox 目录共享快得多

于 2012-10-12T09:42:32.167 回答