17

LinuxゲストとホストO/S(Ubuntu)でVagrantを使用して実行しているSymfony2.0アプリケーションがあります。ただし、実行速度が遅く(たとえば、ページの読み込みに数秒、多くの場合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 Hostでは、パフォーマンスへの影響はそれほど深刻ではありません...私の非常に小さなWebサイトでは、12649個のファイルがあります...したがって、1000以上のファイルの制限に簡単に達することができます。

だから私の2セント:あなたのVagrantfileでこのようなNFSを有効にしてください:

config.vm.share_folder "v-root", "/vagrant", ".." , :nfs => true

そして専門家から:

共有フォルダ内のファイル数が増えると、VirtualBox共有フォルダのパフォーマンスが急速に低下することは古くから知られている問題です。プロジェクトが1000以上のファイルに達すると、単体テストの実行やアプリサーバーの実行などの単純な操作は、ネイティブファイルシステムよりも桁違いに遅くなる可能性があります(たとえば、5秒から5分以上)。

共有フォルダーでこの種のパフォーマンスの低下が見られる場合は、NFS共有フォルダーが解決策を提供します。Vagrantは、ホスト上のNFSサーバーの構成を調整し、ゲスト上のフォルダーをマウントします。

注:NFSはWindowsホストではサポートされていません。VirtualBoxによると、Windowsの共有フォルダーは、UNIXベースのシステムと同じパフォーマンスペナルティを受けるべきではありません。これが当てはまらない場合は、サポートチャネルを自由に使用してください。サポートできる場合があります。

編集:

Windowsで、別の解決策を見つけました。プロジェクト内のベンダーフォルダーで、非共有フォルダーにリンクするシンボリックリンク(ln -fs)を使用しています。これにより、Windowsホスト、ウイルス対策などで表示されるファイルの量が減ります。

于 2012-12-04T12:40:30.053 に答える
6

私が働いているところでは、Vagrant+Symfonyが遅いという問題に対して2つの解決策を試しました。2番目のもの(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

上記からお気づきかもしれませんが、Vagrantgatlingrsyncプラグインを使用してファイルの同期を維持しました。

バインドマウントを使用した、改善されたNFSアプローチ(推奨ソリューション)

rsyncアプローチは速度の問題を解決しますが、いくつかの問題が見つかりました。特に、(フォルダーの共有とは対照的に)一方向の性質はcomposer.lock、VMでファイル(またはDoctrineの移行など)が生成されたとき、またはのコードにアクセスしたいときに厄介でした/vendor。コピーして戻すにはSFTPを使用する必要がありました。新しいファイルの場合は、ガトリングプラグインの次の実行でクリアされる前にSFTPで実行してください。

そのため、バインディングマウントを使用して、キャッシュやログなどのフォルダーを異なる方法で処理するソリューションに移行しました。それらを共有しないと、速度が劇的に向上しました。

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は、基本的に、Webサイトのコードを/vagrant共有フォルダーに配置しないでください。VMとホストO/Sの間で共有されるため、速度が低下します。良いパフォーマンスを得るための効率的な解決策は見つかりませんでした。私たちが使用しているソリューションは、クラシック/ var / wwwから開発アプリを提供し、rsyncを使用してローカルコピーと同期させることです。

于 2012-08-28T21:54:35.487 に答える
3

この記事の指示に従うことで、VagrantボックスのSpeedup Symfony2は、この問題を解決するのに役立ち、Symfony2プロジェクトのページの読み込みを6〜10秒から1秒に短縮しました。基本的にすべての修正は、非常に遅いVirtualBox共有フォルダーシステムを使用する代わりに、NFSを使用してホストとゲスト(vagrant VMボックス)間の同期タイプを設定することです。

また、以下のコードをSymfony2プロジェクトのAppKernel.phpに追加すると、キャッシュとログのディレクトリが、NFS共有に書き込む代わりに、vagrantボックスの共有メモリディレクトリ(/ dev / shm)に変更されるため、ページの読み込みが向上します。スピードはさらに良くなります。

<?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

ホストOSとVM間でディレクトリを共有するためにsshfsを使用しています(Windows用の拡張ドライブ)ネイティブのVBoxディレクトリ共有よりもはるかに高速です

于 2012-10-12T09:42:32.167 に答える